Shell脚本实现MapReduce统计单词数程序

Shell脚本实现MapReduce统计单词数程序,第1张

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 循环累加的原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10117966.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存