MapReduce小记和Hadoop Streaming

MapReduce中两个重要的进程


– JobTracker
    • 主进程,负责接收客户作业提交,调度任务到作节点上运行,并提供诸如监控工作节点状态及任务进度等
      管理功能,一个MapReduce集群有一个jobtracker,一般运行在可靠的硬件上。
    • tasktracker是通过周期性的心跳来通知jobtracker其当前的健康状态,每一次心跳包含了可用的map和
      reduce任务数目、占用的数目以及运行中的任务详细信息。Jobtracker利用一个线程池来同时处理心跳和
      客户请求。
– TaskTracker
    • 由jobtracker指派任务,实例化用户程序,在本地执行任务并周期性地向jobtracker汇报状态。在每一个工
      作节点上永远只会有一个tasktracker

MapReduce工作原理


• JobTracker一直在等待JobClient提交作业
• TaskTracker每隔3秒向JobTracker发送心跳询问有没有任务可做,如果有,让
   其派发任务给它执行
• Slave主动向master拉生意
MapReduce小记和Hadoop Streaming

 

Hadoop Streaming介绍


• MapReduce和HDFS采用Java实现,默认提供Java编程接口
• Streaming框架允许任何程序语言实现的程序在Hadoop MapReduce中
使用
• Streaming方便已有程序向Hadoop平台
• hadoop streaming通过用户编写的map函数中标准输入读取数据(一行一行地读取),按照map函数的处理逻辑处理后,将处理后的数据由标准输出进行输出到下一个阶段,reduce函数也是按行读取数据,按照函数的处理逻辑处理完数据后将它们通过标准输出写到hdfs的指定目录中

示例: shell脚本内容
HADOOP_CMD="/home/app/hadoop-2.6.1/bin/hadoop"

STREAM_JAR_PATH="/home/app/hadoop-2.6.1/share/hadoop/tools/lib/hadoop-streaming-2.6.1.jar"

$HADOOP_CMD jar $STREAM_JAR_PATH \
    -input $OUTPUT_A_PATH,$OUTPUT_B_PATH \
    -output $OUTPUT_JOIN_PATH \
    -mapper "cat" \
    -reducer "python red_join.py" \
    -file ./red_join.py \
    -jobconf stream.num.map.output.key.fields=2 \
    -jobconf num.key.fields.for.partition=1

注意:
1:每行最后的\符号的作用是转义,将换行符转以为普通字符,因为我们不想在一行中输完全部内容,用转义字符转义换行符在下行行中输入未输完的内容
2:输入文件必须在hdfs上,输出也是输出到hdfs上
3:为了避免发生函数脚本找不到的问题,最好使用-file参数,将脚本文件提交到集群中
jobconf:
提交作业的一些配置属性
常见配置:
(1)mapred.map.tasks:map task数目
(2)mapred.reduce.tasks:reduce task数目
(3)stream.num.map.output.key.fields:指定map task输出记录中key所占的域数目
(4)num.key.fields.for.partition指定对key分出来的前几部分做partition而不是整个key