MapReduce 编程 系列十二 用Hadoop Streaming技术集成newLISP脚本

本文环境和之前的Hadoop 1.x不同,是在Hadoop 2.x环境下测试。功能和前面的日志处理程序一样。

第一个newLISP脚本,起到mapper的作用,在stdin中读取文本数据,将did作为key, value为1,然后将结果输出到stdout

第二个newLISP脚本,起到reducer的作用,在stdin中读取<key, values>, key是dic, values是所有的value,简单对value求和后,写到stdout中

最后应该可以在HDFS下看到结果。

用脚本编程的好处是方便测试,现在先开发newLISP脚本读入文件,并仿照map逻辑处理,然后交给后续的newLISP脚本仿照reduce处理。

下面是map.lsp代码:

#!/usr/bin/newlisp

(while (read-line)
  (set ‘value (parse (current-line) ","))
  (println (string (value 2) "\t1"))
)

(exit)

测试一下:

cat logs/sign_2014-05-10.0.csv | ./map.lsp

结果还不错:

537025b84700aab27472b87f        1
537023124700aab27472b82a        1
537031a24700aab27472b982        1
537023c84700aab27472b841        1
537014e74700aab27472b48b        1
53702cac4700aab27472b928        1
537049cd4700aab27472ba91        1
5370dd0b4700aab27472bde4        1

将一行记录按照,拆开,放在一个list中,然后取第三个元素,也就是设备ID,之后添加\t为列分隔符号,然后再添加1.

这样就转成了did\t1\n的形式的<key,value>给reduce。注意newLISP的代码println函数会自动在字符串后面添加\n.

下面来实现reduce.lsp代码:

(new Tree ‘my-table)

(while (read-line)
  (set ‘line-value (parse (current-line) "\t"))
  (set ‘key (line-value 0))
  (set ‘value (int (line-value 1)))
  (set ‘v (my-table key))
  (if v
      (my-table key (+ v value))
    (my-table key value)
      )
)

(dolist (item (my-table)) (println (item 0) "\t" (item 1)))

(exit)

首先创建了一个my-table,用来保存<key,value>

然后将map.lsp输出的数据每行按照\t拆分,获取key和value

存入my-table中,用key查询,有则value加1,无key则添加进去。

最后遍历整个my-table,输出did\tsum\n这样的数据。

下面的命令可以将map和reduce脚本连起来测试:

cat logs/sign_2014-05-10.0.csv | ./map.lsp | sort | ./reduce.lsp

在hadoop集群部署的时候首先要确保newlisp二进制程序都部署在所有节点的/usr/bin/目录下,并且有执行权限。由于newlisp程序本身非常小,所以部署及其轻松,直接scp即可。

然后执行hadoop命令:

hadoop jar hadoop-streaming-1.0.0.jar -files map.lsp reduce.lsp -input /user/chenshu/share/logs -output /user/chenshu/share/output/lisp -mapper map.lsp -reducer reduce.lsp

时间: 2024-10-24 19:58:06

MapReduce 编程 系列十二 用Hadoop Streaming技术集成newLISP脚本的相关文章

MapReduce 编程 系列十二 Reduce阶段内部细节和调节参数

Reduce计算分为若干阶段 1. copy(或者叫shuffle)阶段和merge阶段并行 之前Map产生的结果被存放在本地磁盘上,这时需要从reduce节点将数据从map节点复制过来.放得下进内存,比较大的则写到本地磁盘. 同时,有两个线程对已经获得的内存中和磁盘上的数据进行merge操作. 具体细节是: 通过RPC调用询问task tracker已经完成的map task列表,shuffle(洗牌)是对所有的task tracker host的洗牌操作,这样可以打乱copy数据的顺序,防止

Linux系统裁剪之二(Bash脚本编程之十二)

Linux系统裁剪之二(Bash脚本编程之十二) 系统函数库 ·Linux系统的启动流程     1,POST(加电自检) 计算机本身并不会执行程序,它只是一堆破铜烂铁,但是它可以在开机的时候先去载入一段程序,系统在刚刚启动的时候能够实现将某个ROM芯片中的程序映射到CPU能够寻址的地址空间中去,并且让CPU能够执行其中的指令,这些指令大部分都是用来做系统检测的,当检测完成后,如果系统中所有的基本硬件和核心硬件都没有问题的话,接下来就会根据BIOS中设定的系统启动次序(Boot Sequence

SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的GIS专业理论知识.

Windows界面编程第十二篇 位图显示特效 飞入效果与伸展效果

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8696726 欢迎关注微博:http://weibo.com/MoreWindows Windows界面编程之位图显示特效系列目录: 1. <Windows界面编程第九篇位图显示特效交错效果> http:/

struts2官方 中文教程 系列十二:控制标签

介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项目:struts_basic2 本帖地址:struts2官方 中文教程 系列十二:控制标签 即 http://www.cnblogs.com/linghaoxinpian/p/6941683.html 下载本章节代码 struts2 if标签 我们在thankyou.jsp中添加如下代码: <s:i

【iOS与EV3混合机器人编程系列之二】工欲善其事,必先利其器(准备篇)

在上一篇文章中,我们论述了iOS与EV3结合后机器人开发的无限可能, 那么,大家要不要一起来Hacking一把呢? 为了能够完整地完成我接下来我讲的项目,我们需要做以下准备: 1.一台Mac运行MAC OS X 10.9.3以上的操作系统. 2.Xcode6.这是iOS在Mac上的开发工具.我们将使用Xcode来进行所有的项目程序的编写 3.一两个iOS设备,iPhone或iPad都行.实际上大家最好有两个iOS设备,因为最后的项目中iPhone将和EV3机器人放在一起,而用另一个iOS设备来查

shell编程(十二)--- 添加用户示例

[[email protected] Learn]# cat useradd-final.sh  #!/bin/bash # DEBUG=0 ADD=0 DEL=0 help() { echo "Usage: $(basename $0) -v | --verbose | --add user1,user2,... | --del user1,user2,... | -h | --help" } while [ $# -ne 0 ] do case $1 in -h | --help 

Exchange Server 2013系列十二:邮箱的基本管理

杜飞 邮箱是 Exchange 组织中信息工作人员最常用的收件人类型.每个邮箱都与一个 Active Directory 用户帐户关联.用户可以使用邮箱发送和接收邮件,并可以存储邮件.约会.任务.便笺和文档.邮箱是 Exchange 组织中用户的主要邮件传递和协作工具.每个邮箱由 Active Directory 用户以及存储在 Exchange 邮箱数据库中的邮箱数据组成(如下图所示).邮箱的所有配置数据都存储在 Exchange 用户对象的 Active Directory 属性中.邮箱数据

Silverlight &amp; Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation)

原文:Silverlight & Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation) 说到对象的旋转,或许就会联想到对象角度的概念.对象的旋转实现实际上就是利用对象的角度改变来实现的位置变换,在<Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)>一文中有对对象的不同角度变换的实现介绍,本篇要介绍的自由旋转(Free-form rotation)将借助<Fun