在Hadoop上运行基于RMM中文分词算法的MapReduce程序-程序员宅基地

技术标签: python  awk  大数据  

我知道这个文章标题很“学术”化,很俗,让人看起来是一篇很牛B或者很装逼的论文!其实不然,只是一份普通的实验报告,同时本文也不对RMM中文分 词算法进行研究。这个实验报告是我做高性能计算课程的实验里提交的。所以,下面的内容是从我的实验报告里摘录出来的,当作是我学习hadoop分享出来的 一些个人经验。

实验目标

学习编写 Hadoop 上的 MapReduce 程序。
使用 Hadoop 分布式计算小说《倚天屠龙记》里的中文单词频率,比较张无忌身边的两个女人周芷若与赵敏谁在小说里的热度高。(为什么要提到倚天屠龙记呢?因为我的一位舍 友最近把贾静雯演的这部戏看完了,他无时无刻不提到贾静雯演的赵敏,所以这个实验也取材自我的大学生活……)

实验原理

通过自学Hadoop的Streaming工作模式,使用Streaming可以让Hadoop运行非Java的MapReduce程序。

为了减少我们的实验时间,我们使用了以开发效率著名的Python语言来编写我们的mapper.py和reducer.py。其中,我们还使用到 了一个小巧的中文分词模块smallseg.py,引用自(http://code.google.com/p/smallseg/,Apache License 2.0)。

对于中文词库,我们使用搜狗实验室提供的中文词库main.dic以及一个字库suffix.dic,均可从smallseg项目中获得。

分布式计算的输入为一个文本文件:倚天屠龙记.txt,我们从网下下载此文本资源,并且转换为utf8文本编码以方便我们在Linux下进行分词计算。

iconv -fgbk -tutf8 倚天屠龙记.txt > 倚天屠龙记utf8.txt

实验环境

NameNode:
OS: Ubuntu11.04
CPU: Intel Core I3
Memory: 512MB
IP: 125.216.244.28

DataNode1:
OS: Ubuntu11.10
CPU: Intel Pentium 4
Memory: 512MB
IP: 125.216.244.21

DataNode2:
OS: Ubuntu11.10
CPU: Intel Pentium 4
Memory: 512MB
IP: 125.216.244.22

Mapper程序

下面是mapper.py的代码。

#!/usr/bin/env python
from smallseg import SEG
import sys
seg = SEG()

for line in sys.stdin:
    wlist = seg.cut(line.strip())
    for word in wlist:
        try:
            print "%s\t1" % (word.encode("utf8"))
        except:
            pass

smallseg为一个使用RMM字符串分割算法的中文分词模块。Mapper程序的过程很简单,对每一行的中文内容进行分词,然后把结果以单词和频率的格式输出。对于所有的中文单词,都是下面的格式,

单词[tab]1

每个单词的频率都为1。Mapper并不统计每一行里的单词出现频率,我们把这个统计频率的工作交给Reducer程序。

Reducer程序

下面是reducer.py的代码.

#!/usr/bin/env python
import sys
current_word,current_count,word = None, 1, None

for line in sys.stdin:
    try:
        line = line.rstrip()
        word, count = line.split("\t", 1)
        count = int(count)
    except: continue

    if current_word == word:
        current_count += count
    else:
        if current_word:
            print "%s\t%u" % (current_word, current_count)
        current_count, current_word = count, word

if current_word == word:
    print "%s\t%u" % (current_word, current_count)

从标准输入中读取每一个单词频率,并且统计。因为这些单词已经由Hadoop为我们排好了顺序,所以我们只需要对一个单词的出现次数进行累加,当出现不同的单词的时候,我们就输出这个单词的频率,格式如下

单词[tab]频率

实验步骤

实验使用一个NameNode节点和两个DataNode节点。
首先,把所需要的文件复制到每一台主机上。这些文件都放在/home/hadoop/wc目录下。

scp -r wc [email protected]:.
scp -r wc [email protected]:.
scp -r wc [email protected]:.

运行Hadoop Job

本次任务,使用3个Mapper进程以及2个Reducer进程。因为分词的步骤最为耗时,所以我们尽量分配最多数目的Mapper进程。

hadoop@xiaoxia-vz:~/hadoop-0.20.203.0$ ./bin/hadoop jar contrib/streaming/hadoop-streaming-0.20.203.0.jar -mapper /home/hadoop/wc/mapper.py -reducer /home/hadoop/wc/reducer.py -input 2-in -output 2-out -jobconf mapred.map.tasks=3 -jobconf mapred.reduce.tasks=2
[...] WARN streaming.StreamJob: -jobconf option is deprecated, please use -D instead.
packageJobJar: [/tmp/hadoop-unjar2897218480344074444/] [] /tmp/streamjob7946660914041373523.jar tmpDir=null
[...] INFO mapred.FileInputFormat: Total input paths to process : 1
[...] INFO streaming.StreamJob: getLocalDirs(): [/tmp/mapred/local]
[...] INFO streaming.StreamJob: Running job: job_201112041409_0005
[...] INFO streaming.StreamJob: To kill this job, run:
[...] INFO streaming.StreamJob: /home/hadoop/hadoop-0.20.203.0/bin/../bin/hadoop job  -Dmapred.job.tracker=http://125.216.244.28:9001 -kill job_201112041409_0005
[...] INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201112041409_0005
[...] INFO streaming.StreamJob:  map 0%  reduce 0%
[...] INFO streaming.StreamJob:  map 9%  reduce 0%
[...] INFO streaming.StreamJob:  map 40%  reduce 0%
[…] INFO streaming.StreamJob:  map 67%  reduce 12%
[...] INFO streaming.StreamJob:  map 71%  reduce 22%
[...] INFO streaming.StreamJob:  map 100%  reduce 28%
[...] INFO streaming.StreamJob:  map 100%  reduce 100%
[...] INFO streaming.StreamJob: Job complete: job_201112041409_0005
[...] INFO streaming.StreamJob: Output: 2-out

Map过程耗时:41s
Reduce过程耗时:21s
总耗时:62s

计算结果

复制计算结果到本地文件系统。

./bin/hadoop dfs -get 2-out/part* ../wc/

查看part*的部分内容:

hadoop@xiaoxia-vz:~/wc$ tail part-00000
龙的    1
龙眼    1
龙虎    2
龙被    1
龙身    2
龙镇    1
龙骨    1
龟寿    2
龟山    1
龟裂    1
hadoop@xiaoxia-vz:~/wc$ tail part-00001
龙门    85
龙飞凤舞        1
龙驾    1
龟      3
龟一    1
龟二    1
龟息    1
龟缩    1
龟蛇    3

下面,对输出的结果进行合并,并按照频率进行排序。该过程比较快,在1秒内就已经完成。

hadoop@xiaoxia-vz:~/wc$ cat part-00000 part-00001 | sort -rnk2,2 > sorted
hadoop@xiaoxia-vz:~/wc$ head sorted
的      7157
张无忌  4373
是      4199
道      3465
了      3187
我      2516
他      2454
你      2318
这      1991
那      1776

我们去掉单个字的干扰,因为我们的实验目的只对人名感兴趣。

hadoop@xiaoxia-vz:~/wc$ cat sorted | awk '{if(length($1)>=4) print $0}' | head -n 50
张无忌  4373
说道    1584
赵敏    1227
谢逊    1173
自己    1115
甚么    1034
张翠山  926
武功    867
一个    777
咱们    767
周芷若  756
教主    739
笑道    693
明教    685
一声    670
听得    634
姑娘    612
师父    606
只见    590
无忌    576
少林    555
如此    547
弟子    537
之中    527
殷素素  518
杨逍    496
他们    490
不知    484
如何    466
我们    453
两人    453
叫道    450
二人    445
今日    443
心想    433
张三丰  425
声道    425
义父    412
出来    402
虽然    395
灭绝师太        392
之下    389
这时    381
莲舟    374
心中    374
便是    371
不敢    371
俞莲    369
不能    359
身子    356

统计图表

结论

赵敏以1227票的频率完胜周芷若的756票,由此可知赵敏在《倚天屠龙记》里的热度比周芷若高。

经过本次实验,我们对 Hadoop 原理有了一定程度的了解,并且顺利的完成Mapper函数和Reducer函数的设计和测试。能够运用 Hadoop 进行简单的并行计算的实现。我们也对并行算法和串行算法的区别和设计有了更深一层的了解。此外,实验还增进了我们的合作精神,提高了我们的动手能力。

转载于:https://my.oschina.net/s01u/blog/39535

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34037173/article/details/91617468

智能推荐

git revert 撤销中间的某次提交_git revert --continue-程序员宅基地

文章浏览阅读5.9k次。使用场景如下:首先看一下我的提交(commit1这种都是指的是提交的commit-id)commit1commit2commit3commit4commit5commit6现在想把commit4扔掉,只需git log 从这里拿到commit4的id(当然咱们这里已经拿到了,coomit4就是)git revert commit4 正常情况下就撤销成功了..._git revert --continue

机器学习数据集之鸢尾花-程序员宅基地

文章浏览阅读1.4k次。Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集, 它包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。自变量 feature 特性petal length 花瓣长度petal width 花瓣宽度sepal length 花萼长度sepal width 花萼宽度因变量..._book7_ch08_核技巧__机器学习__鸢尾花书__从加减乘除到机器学习.pdf

R in action 读书笔记(1)--第五章:高级数据管理-程序员宅基地

文章浏览阅读149次。5.2.1数学函数函数描述abs(x)绝对值sqrt(x)平方根ceiling(x)不小于x的最小整数floor(x)不大于x的最大整数trunc(x)向0的方向截取的X中的整数部分..._r in action 学习笔记:第五章

android几个好的blog-程序员宅基地

文章浏览阅读43次。http://blog.csdn.net/qinjuning/article/category/1073230http://blog.csdn.net/liuhe688http://blog.csdn.net/flowingflyinghttp://blog.csdn.net/luoshengyang/article/details/6557518android核心分析...

2021年秋招面经:地平线数字IC设计面试_地平线ic验证面试有几面-程序员宅基地

文章浏览阅读1.7k次。2021.08.20 地平线一面牛客网投递,面试时间1小时5分钟1、上来就问项目,聊了至少半小时,讲我项目中的协议2、让我挑一个模块给他讲,我是怎么写的3、仿真和板级调试4、你对仿真器有研究吗5、亚稳态和降低亚稳态的方法6、垮时钟域7、格雷码的作用8、你了解验证吗?你对验证的理解?什么是验证方法学?9、你对PCIE的了解10、阻塞和非阻塞的区别2021.09.04地平线二面面试官说我跟他们的岗位不是很匹配,要给我转岗,我婉言拒绝了。面试7分钟结束。..._地平线ic验证面试有几面

MYsql数据库MHA实现高可用架构_实现mha高可用mysql数据库架构-程序员宅基地

文章浏览阅读176次。文章目录一、mysql MHA介绍二,mysql MHA搭建一、mysql MHA介绍MHA(MasterHigh Availability)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。1.1什么是MHA?MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA 的出现就是解决MySQL 单点的问题。MySQL故障切换过程中,MHA能做到_实现mha高可用mysql数据库架构

随便推点

麻雀算法极限学习机(SSA-ELM)回归预测及其MATLAB代码实现-程序员宅基地

文章浏览阅读112次。SSA-ELM通过结合麻雀算法和极限学习机,能够优化ELM的隐层神经元数量和激活函数的选择,从而提高回归预测的性能。通过使用麻雀算法搜索的方式,SSA-ELM能够找到最佳的隐层神经元数量和激活函数,从而提高ELM的预测性能。极限学习机(ELM)是一种单隐层前馈神经网络模型,其特点是随机初始化输入层到隐层之间的连接权重和隐层的偏置,然后通过解析解的方式快速求解输出层到隐层之间的连接权重。麻雀算法极限学习机(SSA-ELM)是一种基于麻雀算法和极限学习机(ELM)的回归预测方法。极限学习机(ELM)简介。_ssa-elm

LaTeX 日语_setcjkmainfont{ipamincho}-程序员宅基地

文章浏览阅读3.6k次。有许许多多的包支持在不同 LaTeX 编译环境下的日语的输入,但它们并不是都支持特定的日语输入习惯,例如垂直方向的文字。本文简要介绍如何使用 pdfLaTeX、XeLaTeX、pTeX 和 LuaLaTeX 来输入日语。_setcjkmainfont{ipamincho}

Windows下查看端口占用情况_查看8080端口被哪个进程占用-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏15次。编程的时候经常发现我们需要使用的端口被别的程序占用,这个时候需要清楚查看是哪个程序占用了端口,用且清除了这个进程!,回车,查看是哪个进程或者程序占用了2668端口,结果是:TIM.exe。注:后两步可以使用任务管理器,因为看的比较直观而且方便。,回车,记下最后一位数字,即PID,这里是2668。,点击查看—>选择列,_查看8080端口被哪个进程占用

hive中生成从1到n的连续数字的UDTF方法_hive生成连续数字-程序员宅基地

文章浏览阅读9.3k次。之前在博客中分享了个生成从1到n的连续数字的transform或map方法,最近研究了一下UDTF,发现用UDTF写出来的函数用起来更方便,语法更接近于普通的函数。而且在JAVA中对参数的个数、类型等进行校验也更容易。 ORACLE中生成从1到n的连续数字的方法很多,最简单的一种是:select level from dual connect by level _hive生成连续数字

解决阿里云Tomcat8080端口拒绝访问_阿里云8080拒绝连接请求-程序员宅基地

文章浏览阅读878次。解决阿里云Tomcat8080端口拒绝访问_阿里云8080拒绝连接请求

【细碎知识6】字扩展、位扩展和字位扩展-程序员宅基地

文章浏览阅读1.7w次,点赞46次,收藏263次。目录0. 基本概念1. 字扩展2.位扩展3. 字位扩展0. 基本概念存储容量: 存储容量是主存中能存放二进制代码的总位数,即存储容量=存储单元个数×存储字长(每个存储单元的位数),也可用字节总数来表示: 存储容量=存储单元个数*存储字长/8举例:2114芯片大小为1K×4b,含义为:1K存储单元的个数位2^10个4b每个存储单元有4位地址线: 存储单元的个数=2^地址线的条数数据线: 数据线确定存储字长,数据线的条数=字长的位数。字扩展、位扩展、字位扩展是对存储容量_字位扩展

推荐文章

热门文章

相关标签