java map 函数参数传递_(转)如何向map和reduce脚本传递参数

本文主要讲解三个问题:

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函数中获得变量的值。

代码结构类似如下:

adadf6192a3e1064f80df21a2d9734ff.png

提交到集群运行发现在 map 和 reduce函数中, 静态变量MaxScore的值始终是初值1。

于是试图在主类的静态区中给变量赋值 (因为静态区中的代码比main中的代码要先执行), 仍是不成功, MaxScore的值始终是初值1。

将上述代码在 单机hadoop上运行, 结果正常, map 函数中能获得变量的值。

思考是这个原因: 在提交作业到hadoop集群后,mapper类和reducer类就到各个 tasktracker上去运行了, 与主类独立, 不能交互。

因此,上述往 map 和 reduce 函数传参数的方法实在太天真。

于是想到其它一些方法: 例如将参数写入hdfs文件中, 然后在 mapper 和 reducer 类的 run方法中读取文件, 并将值读到相应变量,这是可行的,但是方法较复杂,代码如下:

6ed90c4dc49bf9fc8be2e79418367b84.png

上述方法尽管可用, 但是不是常规方法, 下面介绍常用的方法:

(1) 通过 Configuration 来传递参数

在main函数中调用set方法设置参数, 例如:

f4e813030b45593a8e93fb28227298fd.png

在mapper中通过上下文context来获取当前作业的配置, 并获取参数, 例如:

c6b0830ab7766e1a525729b86c61e34b.png

注: context 很有用, 能获取当前作业的大量信息,例如上面就获取了任务ID.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值