使用SAS实现HADOOP Map/Reduce程序-wordcount

使用SAS实现HADOOP MAPReduce程序 


文章灵感来自如下文章,该文描述来如何用python实现mapreduc程序
http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/




发现其是利用hadoop-streaming-2.4.0.jar来对hadoop上的数据并行分布式流入到linux的标准输入stdin输出stdout来实现对hadoop数据的读取和写入,由于python和SAS都是脚本语言,因此理论上用SAS实现HADOOP Mapreduce程序也是没有问题的


那首先碰到的问题就是,在SAS中如何读取标准输入和输出呢?
回答该问题很简单,SAS在Linux平台内嵌了2个系统文件,直接通过类似下面使用就可以获得标准输入输出,如下
data _null_;
infile stdin;
file stdout;
input;
put _infile_;
run;
把上面行保存为mapper.sas文件,在linux中通过下面命令调用就可以看到效果
echo test1 test2|.../SASHome/SASFoundation/9.4/sas mapper.sas
可以看出会在控制台上输出test1 test2字眼



言归正传,下面利用SAS实现wordcount功能的mapreduce程序
1.mapper.sas程序,用于实现对文本内容的map
data _null_;
infile stdin;
file stdout;
input;
count=countw(_infile_," ");
do i=1 to count;
       word=scan(_infile_,i," ");
       put word " 1";
end;
run;
1.reducer.sas程序,用于实现对文本内容的reduce
data _null_;
infile stdin end=end;
file stdout;
length prvword $100.;
retain prvword "" wcount 0;
input;
word=scan(_infile_,1," ");
if prvword^=word then do;
       if ^missing(prvword) then do;
               put prvword " " wcount;
       end;
       wcount=1;
       prvword=word;
end;else do;
       wcount+1;
end;
if end then do;
put word " " wcount;
end;
run;


可以看出,用SAS实现wordcount map/reduce程序比python版本更加简单,保存上述2个代码在文件系统/home/sas目录,并分发到所有hadoop节点上


调用方式如下:
hadoop jar hadoop-streaming-2.4.0.jar   -mapper "../SASHome/SASFoundation/9.4/sas /home/sas/mapper.sas -nolog -sasuser /tmp "   -reducer "../SASHome/SASFoundation/9.4/sas /home/sas/reducer.sas -nolog -sasuser /tmp"   -input /tmp/hadoop*.log  -output /tmp/test1 


SO Easy,SAS版的hadoop wordcount map/reduce程序就完成了


不过有些事项需要注意:
1.hadoop的节点必须都安装有SAS BASE
2.sas的map/reduce程序需要分发到hadoop节点上






你可能感兴趣的:(SAS,SAS,第三方开发专栏)