运行WorldCount例子
hadoop默认的样例jar在下面的位置
/你的hadoop位置/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar
我们先来创建数据文件目录以及结果输出目录:
hadoop fs -mkdir -p /data/wordcount
hadoop fs -mkdir -p /output/
我们可以通过hadoop fs -ls / 命令来查看我们创建的目录
然后我们创建一个wordcount文件,并在里面输入一些内容
vi wordcount
输入如下内容:
test hadoop
hello hadoop
hi hdfs
hadoop hdfs
test yarn
hi yarn
我们将文件放入hdfs里
hadoop fs -put ./wordcount /data/wordcount
然后开始执行wordcount(最终结果输出在hdfs中的/data/wordcountresult文件夹内):
hadoop jar hadoop-mapreduce-examples-3.1.2.jar wordcount /data/wordcount /output/wordcountresult
我们来看下结果,执行下面的命令:
hadoop fs -text /output/wordcountresult/part-r-00000
我们看到结果:
顺便我们看下我们hadoop上面的任务截图:
split和block的区别和联系
当我们使用put将文件存储在hdfs中,文件会根据block的值进行分块存储,然后我们使用MapReduce进行计算时候,可以设定map数量,而map又与split相关,那么他们到底有什么关联呢?
- split是MapReduce里的概念,是切片的概念,split是逻辑切片 ;而block是hdfs中切块的大小,block是物理切块;
- split的大小在默认的情况下和HDFS的block切块大小一致,为了是MapReduce处理的时候减少由于split和block之间大小不一致,可能会完成多余的网络之间的传输。
- 一个split不会包含零点几或者几点几个Block,一定是包含大于等于1个整数个Block
- 一个split不会包含两个File的Block,不会跨越File边界
- split和Block的关系是一对多的关系
- maptasks的个数最终决定于splits的长度
- 跨行Block与跨行inputSplit,顾名思义,一行数据被分散在了多个block中,并且由于数据过长,也有可能被切分在不同的split,那么这个时候Block与Split是什么关系:
有一行数据,被拆分在BlockA,BlockB中,在split的过程中,split对应了这两个block(不是几点几个block),然后mapA根据splitA读取数据,如果读取不到换行,就继续读取下一个splitB,直到读取换行为止。下个mapB根据splitB读取数据,发现起始不是要读取的数据,那么就会忽略第一个换行符前面所有数据,从换行后开始读取。所以说一行数据可能被分成多个block,也可能被分成多个inputSplit,但是不会影响map读取的数据不完整
可以通过配置文件进行设置:
--minsize 默认大小为1mapreduce.input.fileinputformat.split.minsize
--maxsize 默认大小为Long.MAXValue mapreduce.input.fileinputformat.split.maxsize
在mapreduce的FileInputFormat类中有个getSplits() 方法对文件进行split,算法如下:
Math.max(minSize,Math.min(maxSize, blockSize));其中maxSize是取得longValueMax的值
1.如果blockSize小于maxSize && blockSize 大于 minSize之间,那么split就是blockSize;
2.如果blockSize小于maxSize && blockSize 小于 minSize之间,那么split就是minSize;
3.如果blockSize大于maxSize && blockSize 大于 minSize之间,那么split就是maxSize;