主要参考《hadoop权威指南》第4版,源码地址:https://github.com/tomwhite/hadoop-book
- 单机模式
- hadoop单机模式,配置了HADOOP_HOME以后,不需要做任何配置
- 寻找对应版本的hadoop.dll 和 winutils.exe.各版本下载地址:https://github.com/steveloughran/winutils
- 把hadoop.dll放到 C:\Windows\System32 下面, winutils.exe 放在$HADOOP_HOME/bin下面
- idea向运行java程序一样运行、debug
windows本地运行mr程序时(不提交到yarn,运行在jvm靠线程执行),hadoop.dll防止报nativeio异常、winutils.exe没有的话报空指针异常。
- 伪分布式 参考资料:
- 建议:在window本地运行单机模式,用于开发调试。在一个虚拟机上部署一个伪分布式,用于测试。再部署一个完全分布式的集群用于模拟生产环境
对于集群来说,我们本地开发MR程序的时候所使用的依赖,集群都有。因此我们打包的时候不需要把依赖也打包进来。只需要把运行的源码以及META-INF打包即可。
因此,在IDEA里面,应该使用自定义的Empty如下图:
MR作业(job)是客户端需要执行的一个工作单元:包括输入数据、MR程序和配置信息。
Hadoop将一个作业分成若干个任务(task)执行,一个任务失败了,yarn会将它分到一个不同的节点上重新调度运行。
- mapper
- map任务的输出写到本地硬盘而不是HDFS,具有数据本地化优势
- hadoop会把输入数据划分为等长的小数据块,称为分片,每个分片对应一个map任务
- 为了运行效率高,一般分片的大小设置成跟HDFS块大小一样,一般为128MB
为什么太大大小都不利于获得最佳性能?
- 分片太大,一个HDFS块放不下,就会跨越数据块存储(比如两个块),而HDFS的任何一个节点都基本不可能同时存储这两个块。意味着就会发生网络传输
- 分片太小,那么管理分片和构建任务的时间又会大大加长,甚至可能比执行时间还长
-
reduer
- reduce任务不具备数据本地化的优势
- reduce任务的数量并不是由输入数据的大小决定,而是独立设置的
- 如果有多个reduce任务,默认通过哈希函数来对map的输出数据进行分区,比如有3个reducer,那么每个map的输出都会放到三个分区中,每个reducer任务对应一个分区
- 也就是说:每一个reduce都会获得所有map的一份数据,这个过程就成为shuffle 见下图
- 调整shuffle混洗参数对作业总运行时间的影响非常大
- 当数据处理可以完全并行(无序shuffle)时,可能会出现没有reduce任务的情况
-
combiner
- 集群的可用带宽限制了mr作业的数量,因此应尽量避免map和reduce任务之间的数据传输
- combiner函数作用于map任务的输出,在传到reducer之前先做数据做处理,比如找到最大值
- 允许使用其他非java语言开发MR程序
- Hadoop Streaming使用Unix标准流作为程序之间的接口,非常适合文本处理
- 运行:hadoop命令不支持streaming,需要执行streaming的jar文件
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.5.0-cdh5.3.6.jar \
-files xxx_map.rb, xxx_reduce.rb
-input input/* \
-output output \
-mapper xxx_map.rb
-combiner xxx_reduce.rb
-reducer xxx_reduce.rb
上面命令在集群中使用时,需要加 -files 用于将脚本传输到集群
- python版本 参见: mapreduce/src/main/python
# 本地调试,使用type命令 类似于Linux的cat
E:\JavaWorkshop\bigdata-learn\hadoop>type input\ncdc\sample.txt | python mapreduce\src\main\python\max_temperature_map.py
1950 +0000
1950 +0022
1950 -0011
1949 +0111
1949 +0078
E:\JavaWorkshop\bigdata-learn\hadoop>type input\ncdc\sample.txt | python mapreduce\src\main\python\max_temperature_map.py | sort | python mapreduce\src\main\python\max_temperature_reduce.py
1950 -0011
1949 +0078
# 集群上运行
python体系下,作为Streaming的替代方案,Dumbo使MR接口更像python