zoukankan      html  css  js  c++  java
  • (转)如何向map和reduce脚本传递参数

     

    [MapReduce] 如何向map和reduce脚本传递参数,加载文件和目录

    分类: hadoop
    本文主要讲解三个问题:
          1 使用Java编写MapReduce程序时,如何向map、reduce函数传递参数。
          2 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map、reduce脚本传递参数。
          3 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map、reduce脚本传递文件或文件夹。
             (1) streaming 加载本地单个文件
             (2) streaming 加载本地多个文件
             (3) streaming 加载本地目录
             (4) streaming编程时在mapreduce脚本中读 hdfs 文件
             (5) streaming编程时在mapreduce脚本中读 hdfs 目录
     
    1.  Java编写MapReduce程序时,如何向map、reduce函数传递参数
    我开始使用如下方式进行传递.
    在主类中声明两个静态变量, 然后在 main 函数中给变量赋值, 试图在 map和reduce函数中获得变量的值。
    代码结构类似如下:
    提交到集群运行发现在 map 和 reduce函数中, 静态变量MaxScore的值始终是初值1。
    于是试图在主类的静态区中给变量赋值 (因为静态区中的代码比main中的代码要先执行), 仍是不成功, MaxScore的值始终是初值1。
    将上述代码在 单机hadoop上运行, 结果正常, map 函数中能获得变量的值。
    思考是这个原因: 在提交作业到hadoop集群后,mapper类和reducer类就到各个 tasktracker上去运行了, 与主类独立, 不能交互。
    因此,上述往 map 和 reduce 函数传参数的方法实在太天真。
    于是想到其它一些方法: 例如将参数写入hdfs文件中, 然后在 mapper 和 reducer 类的 run方法中读取文件, 并将值读到相应变量,这是可行的,但是方法较复杂,代码如下:
    上述方法尽管可用, 但是不是常规方法, 下面介绍常用的方法:
    (1) 通过 Configuration 来传递参数
    在main函数中调用set方法设置参数, 例如:
    在mapper中通过上下文context来获取当前作业的配置, 并获取参数, 例如:
    注: context 很有用, 能获取当前作业的大量信息,例如上面就获取了任务ID.
  • 相关阅读:
    T-SQL部分函数(转)
    sql server中触发器
    sql server中查询结果集顺序问题
    sql server中的TimeStamp时间戳与UniqueIdentifier数据类型
    SQL
    SQL表的最基本操作练习
    增删改查 T-SQL最基本操作
    SQL表的默认常用数据类型
    算法训练 P1102
    算法训练 最短路
  • 原文地址:https://www.cnblogs.com/luolizhi/p/4941065.html
Copyright © 2011-2022 走看看