
options:
(1)-input:输入文件路径
(2)-output:输出文件路径
(3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本
(4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本
(5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。
(6)-partitioner:用户自定义的partitioner程序
(7)-combiner:用户自定义的combiner程序(必须用java实现)
(8)-D:作业的一些属性(以前用的是-jonconf),具体有:
1)mapredmaptasks:map task数目
2)mapredreducetasks:reduce task数目
3)streammapinputfieldseparator/streammapoutputfieldseparator: map task输入/输出数
据的分隔符,默认均为\t。
4)streamnummapoutputkeyfields:指定map task输出记录中key所占的域数目
5)streamreduceinputfieldseparator/streamreduceoutputfieldseparator:reduce task输入/输出数据的分隔符,默认均为\t。
6)streamnumreduceoutputkeyfields:指定reduce task输出记录中key所占的域数目
另外,Hadoop本身还自带一些好用的Mapper和Reducer:
(1) Hadoop聚集功能
Aggregate提供一个特殊的reducer类和一个特殊的combiner类,并且有一系列的“聚合器”(例如“sum”,“max”,“min”等)用于聚合一组value的序列。用户可以使用Aggregate定义一个mapper插件类,这个类用于为mapper输入的每个key/value对产生“可聚合项”。Combiner/reducer利用适当的聚合器聚合这些可聚合项。要使用Aggregate,只需指定“-reducer aggregate”。
(2)字段的选取(类似于Unix中的‘cut’)
Hadoop的工具类orgapachehadoopmapredlibFieldSelectionMapReduc帮助用户高效处理文本数据,就像unix中的“cut”工具。工具类中的map函数把输入的key/value对看作字段的列表。 用户可以指定字段的分隔符(默认是tab),可以选择字段列表中任意一段(由列表中一个或多个字段组成)作为map输出的key或者value。 同样,工具类中的reduce函数也把输入的key/value对看作字段的列表,用户可以选取任意一段作为reduce输出的key或value。
后来将slaves节点的hostname也修正为IP映射表内对应的名字,解决?
根据一位外国友人的说明,在reduce阶段 ,0-33%阶段是 shuffle 阶段,就是根据键值 来讲本条记录发送到指定的reduce,这个阶段应该是在map还没有完全完成的时候就已经开始了,因为我们会看到map在执行到一个百分比后reduce也启动了,这样做也提高了程序的执行效率。
34%-65%阶段是sort阶段,就是reduce根据收到的键值进行排序。map阶段也会发生排序,map的输出结果是以键值为顺序排序后输出,可以通过只有map阶段处理的输出来验证(以前自己验证过,貌似确有这么回事,大家自己再验证下,免得我误人子弟啊)。
66%-100%阶段是处理阶段,这个阶段才是真正的处理阶段,如果程序卡在这里,估计就是你的reduce程序有问题了。
索性等了一晚上,第二天终于有动静了
和上面的记录对比发现,从%67到%77用了11个小时!这明显是reduce程序效率太慢了。也可能是数据倾斜问题。中间也试过增加reducer的数量,但无果。最终我索性减少了输入文件的行数,使其只有三行:
然后重新运行程序,瞬间得到了结果:
可见,结果是正确的。
令人诧异的是很快就执行完了,难道真的是shell脚本不适合做类似统计这样的事情吗?
#!/bin/bash
dir_source="/home/hnsd/workdata/"
yyyymmdd=`date +%Y%m%d`
data_time=`date +%p`
if [ "${data_time}" = "AM" ]; then
workdata=workdata1
dir_back="/home/hnsd/disk1backup/"
else
workdata=workdata2
dir_back="/dev/disk2backup/"
fi
tar zcvf ${dir_back}${yyyymmdd}_${workdata}targz ${dir_source}
crontab 写法为
12 脚本绝对路径
30 17 脚本绝对路径
#!/bin/bash
#符号#!用来告诉系统它后面的参数是用来执行该文件的程序。
#在这个例子中我们使用/bin/bash来执行程序(以#开头的句子表示注释)
s=0
#变量“s”,shell 不需要对变量进行声明
for((i=1;i<=100;i++))
# for 循环的开始(第一次执行代码;继续循环的条件;每次循环后执行的代码)
#先初始化 i 的值为1,然後每次加1,当i超过100的时候就不再循环
do#
语法,代表for的开始
s=$(($s+$i))
#赋值,s 的值 等于 当前s 的值 加上 当前i 的值
while [ ${i} -eq 100 ]
#当 i 的值 等于 100 的时候执行循环,即for循环的最后一次
do
#语法,代表 while 的开始
echo $s
#打印变量 s 的内容
break
#语法,跳出最近一层循环,这里为 while
done
#语法,代表 while 的结束
done
#语法,代表 for 的结束
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
注:这里的iptxt文件存储服务器ip
注:执行方式:sh command
3此脚本目的是实现将目标服务器切换为root用户并启动程序自身启动脚本
4将上一个脚本发送到指定服务器并执行
以上就是关于Shell脚本实现MapReduce统计单词数程序全部的内容,包括:Shell脚本实现MapReduce统计单词数程序、求高手帮忙下Linux系统的Shell编程,我们的一个实验课课题,详见问题补充,谢谢、for 循环累加的原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)