设为首页 收藏本站
查看: 1058|回复: 0

[经验分享] Hadoop单点部署与案例开发(微博用户数据分析)

[复制链接]

尚未签到

发表于 2018-10-29 08:10:06 | 显示全部楼层 |阅读模式
一、环境搭建
1、Hadoop运行环境搭建
1.1 安装虚拟机
  (1)下载并安装VMware虚拟机软件。
  (2)创建虚拟机,实验环境虚拟机配置如下图所示。
DSC0000.png

  (3)安装Ubuntu系统,安装结果如下图所示。
DSC0001.png

1.2  配置JDK环境
  下载并安装JDK,安装结束后需对java环境进行配置,配置成功结果如下所示。
DSC0002.png

2、Hadoop安装和部署
  (1)创建Hadoop安装文件夹,并切到到此路径下。
DSC0003.png

  (2)从 hadoop.apache.org 下载Hadoop 安装文件,并复制文件到安装Hadoop的文件夹中。下载地址如下图所示,本次试验选取较为稳定的最新版,即2.7.3版。
DSC0004.png

  (3)解压Hadoop文件。
DSC0005.png

  (4)修改配置文件
  下面来写配置文件core-site.xml、hdfs-site.xml、hadoop-env.sh三个文件这三个文件都在~/hadoop/hadoop-2.7.3/etc/hadoop/下,在前两个文件中的和中写入如下内容。
  第一个文件core-site.xml
DSC0006.png

  请注意/home/ealon/hadoop/tmp文件夹要被替换为计算机当前的用户目录中的tmp文件夹没有请创建。
  第二个文件hdfs-site.xml
DSC0007.png

  第三个文件hadoop-env.sh中找到如下行然后写入内容。
DSC0008.png

  接下来在系统环境变量中写入Hadoop的环境变量gedit /etc/environment
  #在文件的结尾""之内加上
  :/home/ealon/hadoop/hadoop-2.7.3/bin
  :/home/ealon/hadoop/hadoop-2.7.3/sbin
  (5)重启虚拟机
  首先重启系统,待开机后,输入如下命令hadoop version,验证Hadoop环境是否安装成功。当看到屏幕上显示Hadoop的版本号即说明单机模式已经配置完成。如下图所示。
DSC0009.png

  (6)启动HDFS
  通过使用伪分布模式,启动HDFS服务。首先需对HDFS进行格式化处理。
DSC00010.png

  显示如下内容即成功格式化。
DSC00011.png

  (7)启动HDFS
DSC00012.png

  (8)查看进程
  运行jps命令。如看到屏幕上显示如下内容即说明HDFS已经成功
DSC00013.png

  (9)停止HDFS
DSC00014.png

  通过以上操作,Hadoop环境就基本搭建完毕。
3、Hadoop-Eclipse-Plugin安装与配置
3.1 插件安装
  要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin。

  下载后,将>  unzip-qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载    # 解压到 ~/下载中
  sudocp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar/usr/lib/eclipse/plugins/    # 复制到 eclipse 安装目录的 plugins 目录下
  /usr/lib/eclipse/eclipse-clean    # 添加插件后需要用这种方式使插件生效
3.2 插件配置
  在继续配置前请确保已经开启了 Hadoop。
  启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了。
DSC00015.png

  插件需要进一步的配置
  第一步:选择 Window 菜单下的 Preference。
DSC00016.png

  打开Preference打开Preference
  此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。
DSC00017.png

  选择 Hadoop 的安装目录选择Hadoop 的安装目录
  第二步:切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective ->Other(CentOS 是 Window -> Perspective-> Open Perspective -> Other),弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。
DSC00018.png

  切换 Map/Reduce 开发视图切换Map/Reduce 开发视图
  第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location。
DSC00019.jpg

  建立与 Hadoop 集群的连接建立与Hadoop 集群的连接
  在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,另外我使用的Hadoop伪分布式配置,设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。
  最后的设置如下图所示:
DSC00020.jpg

  Hadoop Location 的设置HadoopLocation 的设置
  Advancedparameters 选项面板是对 Hadoop 参数进行配置,实际上就是填写 Hadoop 的配置项(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要进行相应的修改。但修改起来会比较繁琐,我们可以通过复制配置文件的方式解决(下面会说到)。
  总之,我们只要配置 General 就行了,点击 finish,Map/Reduce Location 就创建好了。
3.3 在 Eclipse 中操作 HDFS 中的文件
  配置好后,点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,如下图是 WordCount 的输出结果),双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件,无需再通过繁琐的 hdfs dfs -ls 等命令进行操作了。
DSC00021.jpg

  使用Eclipse查看HDFS中的文件内容
  如果无法查看,可右键点击 Location 尝试 Reconnect 或重启 Eclipse。
3.4 在 Eclipse 中创建 MapReduce 项目
  点击 File 菜单,选择 New -> Project…:
DSC00022.jpg

  创建Project
  选择 Map/ReduceProject,点击 Next。
DSC00023.jpg

  创建MapReduce项目
  填写 Projectname 为 WordCount 即可,点击 Finish 就创建好了项目。
DSC00024.jpg

  填写项目名
  此时在左侧的Project Explorer 就能看到刚才建立的项目了。
DSC00025.jpg

  项目创建完成

  接着右键点击刚创建的WordCount 项目,选择 New ->>
DSC00026.jpg

  新建Class
  需要填写两个地方:在 Package 处填写org.apache.hadoop.examples;在 Name 处填写 WordCount。
DSC00027.png

  填写Class信息

  创建>package org.apache.hadoop.examples;  
import java.io.IOException;
  
import java.util.StringTokenizer;
  
importorg.apache.hadoop.conf.Configuration;
  
import org.apache.hadoop.fs.Path;
  
import org.apache.hadoop.io.IntWritable;
  
import org.apache.hadoop.io.Text;
  
import org.apache.hadoop.mapreduce.Job;
  
import org.apache.hadoop.mapreduce.Mapper;
  
import org.apache.hadoop.mapreduce.Reducer;
  
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  
importorg.apache.hadoop.util.GenericOptionsParser;
  
public class WordCount {
  
public static class TokenizerMapper
  
      extends Mapper{
  
   private final static IntWritable one = new IntWritable(1);
  
   private Text word = new Text();
  
   public void map(Object key, Text value, Context context
  
                    ) throws IOException,InterruptedException {
  
     StringTokenizer itr = new StringTokenizer(value.toString());
  
     while (itr.hasMoreTokens()) {
  
       word.set(itr.nextToken());
  
       context.write(word, one);
  
     }
  
    }
  
  }
  
public static class IntSumReducer
  
      extends Reducer {
  
   private IntWritable result = new IntWritable();
  
   public void reduce(Text key, Iterable values,
  
                       Context context
  
                       ) throws IOException,InterruptedException {
  
     int sum = 0;
  
     for (IntWritable val : values) {
  
       sum += val.get();
  
     }
  
      result.set(sum);
  
     context.write(key, result);
  
    }
  
  }
  
public static void main(String[] args) throws Exception {
  
   Configuration conf = new Configuration();
  
   String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
  
    if(otherArgs.length != 2) {
  
     System.err.println("Usage: wordcount  ");
  
     System.exit(2);
  
    }
  
   Job job = new Job(conf, "word count");
  
   job.setJarByClass(WordCount.class);
  
   job.setMapperClass(TokenizerMapper.class);
  
   job.setCombinerClass(IntSumReducer.class);
  
   job.setReducerClass(IntSumReducer.class);
  
   job.setOutputKeyClass(Text.class);
  
   job.setOutputValueClass(IntWritable.class);
  
   FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  
    FileOutputFormat.setOutputPath(job,new Path(otherArgs[1]));
  
   System.exit(job.waitForCompletion(true) ? 0 : 1);
  
  }
  
}
3.5 通过 Eclipse 运行 MapReduce
  在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将/usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:
  cp/usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
  cp/usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
  cp/usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src
  没有复制这些文件的话程序将无法正确运行,本教程最后再解释为什么需要复制这些文件。
  复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示:
DSC00028.png

  WordCount项目文件结构
  点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run onHadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数。
  右键点击刚创建的 WordCount.java,选择 Run As -> RunConfigurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。
DSC00029.png

  设置程序运行参数
  或者也可以直接在代码中设置好输入参数。可将代码 main() 函数的 String[] otherArgs= new GenericOptionsParser(conf, args).getRemainingArgs(); 改为:
  //String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  String[]otherArgs=new String[]{"input","output"}; /* 直接设置输入参数 */
  设定参数后,再次运行程序,可以看到运行成功的提示,刷新 DFS Location 后也能看到输出的 output 文件夹。
DSC00030.png

  WordCount 运行结果
  至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。
二、实验内容
  通过网络下载userdata.csv微博用户数据,共有14388385条用户数据,包含:用户id,所在省份,性别,是否认证信息。数据截图如下图所示。
DSC00031.png

  项目代码结构如下图所示:
DSC00032.png

1、用户性别分布
  Maper函数:
DSC00033.png

  Reducer函数:
DSC00034.png

  计算结果分布如下图所示:
DSC00035.png

  从图中可以观察到,微博用户中女性所占比例较大,多余男性用户。
2、用户省份分布
  该部分Maper函数、Reducer函数与性别统计算法相同,不再赘述,计算结果如下图所示:
DSC00036.png

  从图中可以看出,广东、北京、上海、江苏、浙江等地微博用户量较大。
3、用户实名验证分布
  该部分Maper函数、Reducer函数与性别统计算法相同,不再赘述,计算结果如下图所示:
DSC00037.png

  从图中可以看出,非实名用户在微博用户中占绝大部分。
4、主要省市男女比例分布
  该部分Maper函数、Reducer函数与性别统计算法基本相同,不再赘述,计算结果如下图所示:
DSC00038.png

  各省市女性用户数量均占所在省市总用户数的一半以上。
三、总结
  通过浏览控制台和Web管理端输出结果,算法执行过程未见明显异常或报错。控制台输出结果如下图所示:
DSC00039.png

  Web端面板统计结果如下图所示:
DSC00040.png

  任务执行结果统计如下图所示:
DSC00041.png

  结合水运行业实际需求,智慧港口建设作为我国港口转型升级的重要途径,其所涉及的关键技术就包含港口数据分析与处理。Hadoop技术在互联网行业已广泛应用,但在港口自动化、智能化建设中还未起到关键、核心作用。因此,大数据分析与挖掘技术在港口领域的深度应用,是港口发展的高级阶段。对我国港口而言,通过打造智慧港口,优化提升港口基础设施和管理模式,实现港口功能创新、技术创新和服务创新,已成为我国港口提高国际竞争力,完成转型升级的重要途径。通过对大数据技术在智慧港口中应用研究,是我国港口信息化积累的海量数据发挥其巨大优势,为我国港口管理部门以及港口企业提供决策支撑,具有重要的显示意义。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627732-1-1.html 上篇帖子: Hadoop快速入门 下篇帖子: 使用hadoop_restful_api实现对集群信息的一些统计
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表