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的具体步骤,如有错误 欢迎指正!

  • 相关阅读:
    numpy数组各种乘法
    python测试函数的使用时间
    dataframe 列名重新排序
    《图解设计模式》读书笔记5-1 composite模式
    《图解设计模式》读书笔记4-2 STRATEGY模式
    《图解设计模式》读书笔记4-1 Bridge模式
    《图解设计模式》读书笔记3-3 Builder模式
    《图解设计模式》读书笔记3-2 Prototype模式
    《图解设计模式》读书笔记3-1 Singleton模式
    《图解设计模式》读书笔记2-2 Factory Method模式
  • 原文地址:https://www.cnblogs.com/panda-blog/p/9441330.html
Copyright © 2011-2022 走看看