1、实验要求:
对基站数据进行排序,要求按电话号码升序,到达时间降序进行排序,并且同时统计用户数和用户拨打电话次数。
2、实验平台
hadoop版本:hadoop-3.2.0
jdk版本:jdk1.8-271
虚拟机:centos7
3、常用命令
运行java程序的jar包:hadoop jar hadoop_sort.jar com.hadoop.sort.My_hadoopsort /input /outfile
(其中第一个参数是jar包路径(在linux本地),第二个参数是main()函数所在的完整类名,第三个参数是输入数据的路径(在hdfs上),第四个参数是输出数据的文件夹(在hdfs上)outfile这个文件夹不能已经存在)
删除linux文件夹:rm -rf /home/hz/Docunments/
删除hdfs文件夹:hadoop fs -rm -r -skipTrash /outfile
将得到的hdfs的分区文件合并下载到linux本地:
hadoop fs -getmerge /outfile /home/hz/Documents/result.txt
当我将分散在各个文件的类,集中到一起时:写一个外部类,里面包含各个内部类。(这时内部类要设置成静态:public static class …,因为在后面会直接调用 内部类.class),这样写是为了解除一条警告
注意:
(1)所有节点都要关闭防火墙
(2)当改变mapper,reducer的输入、输出格式时,继承类的泛型也要对应修改,还要在run()函数里面修改设置的格式。
4、代码实现
(1)实现按电话号码升序,到达时间降序进行排序
创建Maven项目,在pom.xml文件中添加以下内容,自动下载hadoop所需的jar依赖包:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
如果报错出现了:org.slf4j的错误,就把以下代码粘贴上去
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
(2)实现同时统计用户数和用户拨打电话次数,文件中包含了基站数据集,只需要将代码打包成jar即可在hadoop集群上运行。
5、问题
(1)当我定义java全局变量统计所有用户数目的时候,发现每个partition是单独计算的,每个partition都是从0开始计数的。
(2)通过hadoop的configure.set()和configure.get()函数来进行统计计数,出现同样的问题
(3)由此,当只设置一个reducetask的情况下就可以直接统计计数了,但这种方式放弃了hadoop的分布式效果。