reduce个数 mapred.reduce.tasks
多了:
shuffle开销大,输出大量小文件
少了:
单次执行慢,出错再试错成本高
MapReduce和HDFS采用Java实现,默认提供Java编程接口,streaming框架允许程序使用任何语言,方便已有程序向Hadoop平台移植
Map和reduce都是标准输入标准输出,但是外面可以套一个Java的壳让它对语言不再强依赖
cat input | mapper | sort | reducer > output
看看本地可不可以跑通,sort是在模拟shuffle
c/c++编写的程序可以快一点效率高
streaming默认只能处理文本数据,如果处理二进制数据可以把二进制的key和value进行base64编码转换成文本
这样的话两次数据拷贝解析(分割)会花费一段时间带来额外开销,但是由于这种开发方式本来就注重时效性,所以可以忽略
MapReduce制定参数
-input 指定作业的输入文件的HDFS的路径,支持用*通配符支持指定多个文件或目录,可反复使用
-output 指定作业输出文件的HDFS路径,必须不存在,并且有权限创建,只能使用一次
-mapper 需要有,执行map阶段,通过什么方式执行map进程 例如 "python mapper.py"前面是运行程序,后面是脚本
-reducer 可以没有,比如简单的过滤就可以没有
-file 分发用,小的文件 map和reduce的执行文件,要用的输入文件
类似的还有 -casheFile, -casheArchive分别用于向计算节点分发HDFS文件和HDFS压缩文件(已经在hdfs上),前面一个是已经有的文件,后面是一个文件体系
-jobconf (D)
配置参数
mapred.job.name 作业名
mapred.job.priority 作业优先级
mapred.job.map.capacity 最多同时运行map任务数
mapred.job.reduce.capacity 最多同时运行reduce任务数
mapred.task.timeout 任务没有响应(输入输出)的最大时间
mapred.compress.map.output map的输出是否压缩
mapred.map.output.compression.codec map的输出压缩方式
mapred.output.compress reduce的输出是否压缩
mapred.output.compression,codec reduce的输出压缩方式
stream.map.otput.field.separator map的输出分隔符