zoukankan      html  css  js  c++  java
  • Hadoop(三):MapReduce程序(python)

    使用python语言进行MapReduce程序开发主要分为两个步骤,一是编写程序,二是用Hadoop Streaming命令提交任务。

    还是以词频统计为例

    一、程序开发
    1、Mapper

    1 for line in sys.stdin:
    2     filelds = line.strip.split(' ')
    3     for item in fileds:
    4         print item+' '+'1'

    2、Reducer

     1 import sys
     2 
     3 result={}
     4 for line in  sys.stdin:
     5     kvs = line.strip().split(' ')
     6     k = kvs[0]
     7     v = kvs[1]
     8     if k in result:
     9         result[k]+=1
    10     else:
    11         result[k] = 1
    12 for k,v in result.items():
    13     print k+' '+v

    ....

    写完发现其实只用map就可以处理了...reduce只用cat就好了

    3、运行脚本

    1)Streaming简介

      Hadoop的MapReduce和HDFS均采用Java进行实现,默认提供Java编程接口,用户通过这些编程接口,可以定义map、reduce函数等等。
      但是如果希望使用其他语言编写map、reduce函数怎么办呢?
      Hadoop提供了一个框架Streaming,Streaming的原理是用Java实现一个包装用户程序的MapReduce程序,该程序负责调用hadoop提供的Java编程接口。

    2)运行命令

      /.../bin/hadoop streaming

      -input /..../input

      -output /..../output

      -mapper "mapper.py"

      -reducer "reducer.py"

      -file mapper.py

      -file reducer.py

      -D mapred.job.name ="wordcount"

      -D mapred.reduce.tasks = "1"

    3)Streaming常用命令

    (1)-input <path>:指定作业输入,path可以是文件或者目录,可以使用*通配符,-input选项可以使用多次指定多个文件或目录作为输入。

    (2)-output <path>:指定作业输出目录,path必须不存在,而且执行作业的用户必须有创建该目录的权限,-output只能使用一次。

    (3)-mapper:指定mapper可执行程序或Java类,必须指定且唯一。

    (4)-reducer:指定reducer可执行程序或Java类,必须指定且唯一。

    (5)-file, -cacheFile, -cacheArchive:分别用于向计算节点分发本地文件、HDFS文件和HDFS压缩文件,具体使用方法参考文件分发与打包

    (6)numReduceTasks:指定reducer的个数,如果设置-numReduceTasks 0或者-reducer NONE则没有reducer程序,mapper的输出直接作为整个作业的输出。

    (7)-jobconf | -D NAME=VALUE:指定作业参数,NAME是参数名,VALUE是参数值,可以指定的参数参考hadoop-default.xml。

       -jobconf mapred.job.name='My Job Name'设置作业名

       -jobconf mapred.job.priority=VERY_HIGH | HIGH | NORMAL | LOW | VERY_LOW设置作业优先级

       -jobconf mapred.job.map.capacity=M设置同时最多运行M个map任务

       -jobconf mapred.job.reduce.capacity=N设置同时最多运行N个reduce任务

       -jobconf mapred.map.tasks 设置map任务个数

       -jobconf mapred.reduce.tasks 设置reduce任务个数   

       -jobconf mapred.compress.map.output 设置map的输出是否压缩

       -jobconf mapred.map.output.compression.codec 设置map的输出压缩方式   

       -jobconf mapred.output.compress 设置reduce的输出是否压缩

       -jobconf mapred.output.compression.codec 设置reduce的输出压缩方式

       -jobconf stream.map.output.field.separator 设置map输出分隔符

        例子:-D stream.map.output.field.separator=:  以冒号进行分隔

                -D stream.num.map.output.key.fields=2  指定在第二个冒号处进行分隔,也就是第二个冒号之前的作为key,之后的作为value

    (8)-combiner:指定combiner Java类,对应的Java类文件打包成jar文件后用-file分发。

    (9)-partitioner:指定partitioner Java类,Streaming提供了一些实用的partitioner实现,参考KeyBasedFiledPartitonerIntHashPartitioner

    (10)-inputformat, -outputformat:指定inputformat和outputformat Java类,用于读取输入数据和写入输出数据,分别要实现InputFormat和OutputFormat接口。如果不指定,默认使用TextInputFormat和TextOutputFormat。

    (11)cmdenv NAME=VALUE:给mapper和reducer程序传递额外的环境变量,NAME是变量名,VALUE是变量值。

    (12)-mapdebug, -reducedebug:分别指定mapper和reducer程序失败时运行的debug程序。

    (13)-verbose:指定输出详细信息,例如分发哪些文件,实际作业配置参数值等,可以用于调试。

  • 相关阅读:
    并查集分析+总结
    poj 3083 Children of the Candy Corn(bfs+dfs 数组模拟方向)
    poj 1094 Sorting It All Out (拓扑排序)
    poj 2632 Crashing Robots(模拟)
    poj 1068 Parencodings (模拟)
    poj 1273 Drainage Ditches ( 最大流Edmonds_karp算法)
    poj 3278 Catch That Cow (BFS)
    Codeforces Round #109 (Div. 2) 总结
    poj 2299 UltraQuickSort(归并排序)
    poj 1035 Spell checker(字符串)
  • 原文地址:https://www.cnblogs.com/naonaoling/p/5749080.html
Copyright © 2011-2022 走看看