zoukankan      html  css  js  c++  java
  • hadoop学习笔记——用python写wordcount程序

       尝试着用3台虚拟机搭建了伪分布式系统,完整的搭建步骤等熟悉了整个分布式框架之后再写,今天写一下用python写wordcount程序(MapReduce任务)的具体步骤。

    MapReduce任务以来HDFS存储和Yarn资源调度,所以执行MapReduce之前要先启动HDFS和Yarn。我们都知道MapReduce分Map阶段和Reduce阶段,这就需要我们 自己写Map阶段的处理方法和Reduce阶段的处理方法。

    MapReduce也支持除Java之外的其他语言,但要依赖流处理包(hadoop-streaming-2.7.4.jar),处理包不需要自己下载,hadoop本身带的就有,hadoop2.7的在hadoop-2.7.4/share/hadoop/tools/lib目录下,知道它所在的目录是因为只执行MapReduce命令的时候要指定hadoop-streaming-2.7.4.jar的位置。

    接下来就是用python写Map的处理逻辑和Reduce的处理逻辑。wordcount是词频统计,要处理的原文本文件要上传到HDFS上,流程是原文本以流式方式传到Map函数,Map函数处理之后把结果传到Reduce函数,整个处理完后结果会保存在HDFS上,流式处理可以理解成文本一行一行的在原文件、Map函数、Reduce函数、结果文件之间流动处理。

    原文本:

    hello world
    hello hadoop hadoop
    nihao world
    hello mapreduce
    

      

    Map方法代码:

    #!/usr/bin/python
    import sys
    for line in sys.stdin: line = line.strip() words = line.split(' ') for word in words: print('%s %s'%(word,1))

    Reduce方法代码:

    #!/usr/bin/python
    import sys
    
    current_count = 0
    current_word = None
    
    for line in sys.stdin:
        line = line.strip()
        word, count = line.split('	', 1)
        count = int(count)
        if current_word == word:
            current_count += count
        else:
            if current_word:
                print "%s	%s" % (current_word, current_count)
    
            current_count = count
            current_word = word
    

    代码的逻辑都很简单,从标准输入按行读取处理数据,每行处理完print打印。

    先在shell上测试一下:

    #cat word.txt | ./mapper.py | sort

    hadoop	1
    hadoop	1
    hello	1
    hello	1
    hello	1
    mapreduce	1
    nihao	1
    world	1
    world	1

    sort是行之间按单词首字母排序,在MapReduce上sort过程hadoop会处理。

    如果没有sort,结果是这样的:

    #cat word.txt | ./mapper.py 

    hello	1
    world	1
    hello	1
    hadoop	1
    hadoop	1
    nihao	1
    world	1
    hello	1
    mapreduce	1

    #cat word.txt | ./mapper.py | sort |./reducer.py

    hadoop	2
    hello	3
    mapreduce	1
    nihao	1
    

    测试完没问题后就可以用MapReduce来执行了。

    输入命令:

    hadoop jar hadoop-streaming-2.7.4.jar

    -input /wordcount/word.txt

    -output /wordcount/out

    -mapper /home/hadoop/apps/hadoop-2.7.4/file/wordcount_python/mapper.py

    -reducer /home/hadoop/apps/hadoop-2.7.4/file/wordcount_python/reducer.py

    命令解释:

    第一行是指明用到的streaming包的位置,第二行指明原文件在HDFS上的路径,第三行是输出结果在HDFS上的路径,输出路径原来不能存在,已存在的话会报错,第四行和第五行指明Map方法和Reduce方法程序路径。

    mapper.py和reduce.py需要加上执行权限,chmod +x mapper.py,它们两个py文件不用放在HDFS上,放在本地即可。

    执行后就会开启MapReduce任务,配置没问题的话就不会报错,执行完成后会在MapReduce上生成/wordcount/out目录里面有两个文件:

    第二个是结果文件,第一个文件可以看到所占空间为0,cat一下什么也没有,只是一个处理成功的标识。

     以上就是python写wordcount的具体步骤,如有错误 欢迎指正!

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/panda-blog/p/9441330.html
Copyright © 2011-2022 走看看