为了账号安全,请及时绑定邮箱和手机立即绑定

Hadoop实践之Python(一)

标签:
Python Hadoop

关于hadoop,建议大家在自己的linux上面跟着网上的教程搭建一次单节点和多节点的hadoop平台,亦可参考Hadoop安装教程_单机/伪分布式配置。关于mapreduce,我是新手,只能从“分而治之”的角度来考虑,首先“map”也就是”分”——数据分割,然后“reduce”对"map"处理后的结果进一步的运算,这里给出的例子是一般的hadoop入门程序“WordCount”,就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计数,不同的单词分别输出,结果输出每一个单词出现的频数。

注意:关于数据的输入输出是通过sys.stdin(系统标准输入)和sys.stdout(系统标准输出)来控制数据的读入与输出。所有的脚本执行之前都需要修改权限,否则没有执行权限,例如下面的脚本创建之前使用“chmod +x mapper.py”

mapper.py

#!/usr/bin/env python# ($HADOOP_HOME/mapper.py)import sysfor line in sys.stdin:  # 遍历读入数据的每一行
    
    line = line.strip()  # 将行尾行首的空格去除
    words = line.split()  #按空格将句子分割成单个单词
    for word in words:        print '%s\t%s' %(word, 1)

reducer.py

#!/usr/bin/env python# ($HADOOP_HOME/reducer.py)from operator import itemgetterimport sys

current_word = None  # 为当前单词current_count = 0  # 当前单词频数word = Nonefor line in sys.stdin:
    words = line.strip()  # 去除字符串首尾的空白字符
    word, count = words.split('\t')  # 按照制表符分隔单词和数量
    
    try:
        count = int(count)  # 将字符串类型的‘1’转换为整型1
    except ValueError:        continue

    if current_word == word:  # 如果当前的单词等于读入的单词
        current_count += count  # 单词频数加1
    else:        if current_word:  # 如果当前的单词不为空则打印其单词和频数
            print '%s\t%s' %(current_word, current_count)  
        current_count = count  # 否则将读入的单词赋值给当前单词,且更新频数
        current_word = wordif current_word == word:    print '%s\t%s' %(current_word, current_count)

查看输出结果

  cd $HADOOP_HOME
  echo "foo foo quux labs foo bar zoo zoo hying" | ./mapper.py | sort -k 1,1 | ./reducer.py  # echo是将后面“foo ****”字符串输出,并利用管道符“|”将输出数据作为mapper.py这个脚本的输入数据,并将mapper.py的数据输入到reducer.py中,其中参数sort -k 1,1是将reducer的输出内容按照第一列的第一个字母的ASCII码值进行升序排序

下面看一些脚本的输出结果:

webp

让Python代码在hadoop上跑起来!

一、准备输入数据

  • 接下来,先下载三本书:

     mkdir -p tmp/gutenberg
     cd tmp/gutenberg
     wget http://www.gutenberg.org/ebooks/20417.txt.utf-8
     wget http://www.gutenberg.org/files/5000/5000-8.txt
     wget http://www.gutenberg.org/ebooks/4300.txt.utf-8
  • 然后把这三本书上传到hdfs文件系统上:

    hdfs dfs -mkdir ./input # 在hdfs上的该用户目录下创建一个输入文件的文件夹hdfs dfs -put ./tmp/gutenberg/*.txt ./input # 上传文档到hdfs上的输入文件夹中
  • 寻找你的streaming的jar文件存放地址,注意2.6的版本放到share目录下了,可以进入hadoop安装目录寻找该文件:

    cd $HADOOP_HOMEfind ./ -name "*streaming*"
  • 由于这个文件的路径比较长,因此我们可以将它写入到环境变量:

    vi ~/.bashrc  # 打开环境变量配置文件# 在里面写入streaming路径export STREAM=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jarsource ~/.bashrc
  • 通过streaming接口运行脚本

    hadoop jar $STREAM  -files ./mapper.py,./reducer.py -mapper ./mapper.py -reducer ./reducer.py -input ./input/gutenberg*.txt -output ./output
    • 就会complete啦,你就可以通过如下方式查看计数结果


      webp




作者:羽恒
链接:https://www.jianshu.com/p/6148cb62bdb0


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消