利用MapReduce统计随机数个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lu__peng/article/details/78911446

刚刚开始学习MapReduce框架,试着利用MapReduce写一个程序用于统计生成的各个随机数个数,下面介绍各个步骤,以及在MapReduce框架中的运行流程。
1 生成随机数
利用Random类中的nextInt()生成1-10的随机数,并且将其写入到文件中,在这里我一共生成了2000000个1-10的随机数,分别写入到20个文件中,每个文件中存放100000个随机数,每10个随机数存放一行,代码如下:

//生成1-10的随机数
tmp = random.nextInt(10)+1;
//写入到文件
write.write(tmp+"");
if(count%10 == 0){
     write.write("\n");
 }else {
     write.write(" ");
 }

生成的文件以及文件中的数据如下图所示:
这里写图片描述

文件中的数据

2 上传数据到HDFS中
把这20个文件全部存放到HDFS中:

bin/hadoop fs -copyFromLocal ~/桌面/data/* /data

3 执行MapReduce任务
hadoop中有一个自带架包hadoop-mapreduce-examples-2.4.1.jar,其中的wordcount可以用来统计单词出现的次数,在这里我们直接使用该类统计随机数出现的次数。
执行命令:

bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /data/* /output

在控制台中出现如下信息
这里写图片描述

在执行该程序时,MapReduce框架一共一共启动21个map任务,1个Reduce任务。这是MapReduce框架在接收到客户端提供的数据后,会首先对同一文件中的数据进行分片(InputSplit);对不同文件而言,每一个文件的大小大于一个分片时,进行分片,不大于的话直接对应一个分片。每个分片对应一个map任务,一个分片的大小通常与HDFS中的数据块(Block)的大小一致。
s因为我生成的这20个文件均小于64MB(一个Block的大小)所以20个文件作为输入数据输入到MapReduce框架中就对应20个分片,因此也就会启动20个map任务。
这里写图片描述
那么控制台上为什么会显示启动了21个map任务呢?
n这是因为MapReduce框架会自动判断那些运行的比较慢的map任务,然后根据情况额外启动一个map任务执行同样的任务,谁先执行完,系统就会将另外一个kill掉。
4分析输出数据
这里写图片描述
w从上面的输出结果中可以看出,我们一共生成了200万个1-10的随机数,这10个随机数的个数基本上都是在20万上下,符合概率统计,因此可以证明利用Java中的Random类生成的随机数确实是比较靠谱的。

ps
这个程序我是在伪分布式集群上运行的,可能是电脑的问题还是因为其他原因,一旦我的输入数据太大,比如说10亿个随机数(放到一个文件中,大小是2.7GB),运行MapReduce的过程中,会自动登出我的Ubuntu系统,程序也相应终止,有知道原因的可以告知下。

猜你喜欢

转载自blog.csdn.net/lu__peng/article/details/78911446