一个典型的实现Tool的程序:

/**

MyApp 需要从命令行读取参数,用户输入命令如,

$bin/hadoop jar MyApp.jar -archives test.tgz  arg1 arg2

-archives 为hadoop通用参数,arg1 ,arg2为job的参数

*/

public class MyApp extends Configured implements Tool {

//implemet Tool’s run

public int run(String[] args) throws Exception {

Configuration conf = getConf();

// Create a JobConf using the processed conf

JobConf job = new JobConf(conf, MyApp.class);

// Process custom command-line options

Path in = new Path(args[1]);

Path out = new Path(args[2]);

// Specify various job-specific parameters

job.setJobName(“my-app”);

job.setInputPath(in);

job.setOutputPath(out);

job.setMapperClass(MyApp.MyMapper.class);

job.setReducerClass(MyApp.MyReducer.class);

JobClient.runJob(job);

}

public static void main(String[] args) throws Exception {

// args由ToolRunner来处理

int res = ToolRunner.run(new Configuration(), new MyApp(), args);

System.exit(res);

}

}

说明:

使用ToolRunner让参数传递更简单,关于MapReduce运行和参数配置,你是否有下面的烦恼:

A: 将MapReduce Job配置参数写到java代码里,一旦变更意味着修改java文件源码、编译、打包、部署一连串事情。

B:当MapReduce 依赖配置文件的时候,你需要手工编写java代码使用DistributedCache将其上传到HDFS中,以便map和reduce函数可以读取。

C:当你的map或reduce 函数依赖第三方jar文件时,你在命令行中使用”-libjars”参数指定依赖jar包时,但根本没生效。

D:其实,Hadoop有个ToolRunner类,它是个好东西,简单好用。无论在《Hadoop权威指南》还是Hadoop项目源码自带的example,都推荐使用ToolRunner。

下面我们看下src/example目录下WordCount.Java文件,它的代码结构是这样的:

public class WordCount {

// 略...

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

String[] otherArgs = new GenericOptionsParser(conf,

args).getRemainingArgs();

// 略...

Job job = new Job(conf, "word count");

// 略...

System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}

WordCount.java中使用到了GenericOptionsParser这个类,它的作用是将命令行中参数自动设置到变量conf中。举个例子,比如我希望通过命令行设置reduce task数量,就这么写:bin/hadoop jar MyJob.jar com.xxx.MyJobDriver -Dmapred.reduce.tasks=5

上面这样就可以了,不需要将其硬编码到java代码中,很轻松就可以将参数与代码分离开。

其它常用的参数还有”-libjars”和-“files”,使用方法一起送上:

bin/hadoop jar MyJob.jar com.xxx.MyJobDriver -Dmapred.reduce.tasks=5\

-files ./dict.conf  \

-libjars lib/commons-beanutils-1.8.3.jar,lib/commons-digester-2.1.jar

参数”-libjars”的作用是上传本地jar包到HDFS中MapReduce临时目录并将其设置到map和reduce task的classpath中;参数”-files”的作用是上传指定文件到HDFS中mapreduce临时目录,并允许map和reduce task读取到它。这两个配置参数其实都是通过DistributeCache来实现的。

至此,我们还没有说到ToolRunner,上面的代码我们使用了GenericOptionsParser帮我们解析命令行参数,编写ToolRunner的程序员更懒,它将GenericOptionsParser调用隐藏到自身run方法,被自动执行了,修改后的代码变成了这样:

public class WordCount extends Configuredimplements Tool {

@Override

public int run(String[] arg0) throws Exception {

Job job = new Job(getConf(), "word count");

// 略...

System.exit(job.waitForCompletion(true) ? 0 : 1);

return 0;

}

public static void main(String[] args) throws Exception {

int res = ToolRunner.run(new Configuration(), new WordCount(), args);

System.exit(res);

}

}

看看代码上有什么不同:

让WordCount继承Configured并实现Tool接口。

重写Tool接口的run方法,run方法不是static类型,这很好。

在WordCount中我们将通过getConf()获取Configuration对象。

最终我们得出的总结是:

1、通过使用ToolRunner.run(...)方法,可以更便利的使用hadoop命令行参数。

2、ToolRunner.run(...)通过调用Tool类中的run(String[])方法来运行hadoop程序,并默认加载core-default.xml与core-site.xml中的参数。

在程序运行时,可以通过命令行修改参数,可修改的内容如下:

Hadoop中通过ToolRunner和Configured实现直接读取命令行动态出入reduce task数量,jar文件等...相关推荐

  1. Hadoop中通过ToolRunner和Configured实现直接读取命令行动态出入reduce task数量,jar文件等

    一个典型的实现Tool的程序: /** MyApp 需要从命令行读取参数,用户输入命令如, $bin/hadoop jar MyApp.jar -archives test.tgz  arg1 arg ...

  2. 深度分析如何在Hadoop中控制Map的数量

    深度分析如何在Hadoop中控制Map的数量 guibin.beijing@gmail.com 很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数 ...

  3. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序...

    一:序列化概念 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.即把字节流转回结构化对象. Java序列化(java.i ...

  4. Hadoop中关于MapReduce的编程实例(过滤系统日志)

    框架 Apache Hadoop:分布式处理架构,结合了 MapReduce(并行处理).YARN(作业调度)和HDFS(分布式文件系统);  一.下载Hadoop相关文件 1.在Hadoop官网上下 ...

  5. Zookeeper 在Hadoop中的应用

    Zookeeper 简单介绍 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目.它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集 ...

  6. 数据蒋堂 | Hadoop中理论与工程的错位

    作者:蒋步星 来源:数据蒋堂 校对:林亦霖 本文共1400字,建议阅读6分钟. 本文分析了在Hadoop的设计和实现中的理论问题和工程问题. Hadoop是当前重要的大数据计算平台,它试图摒弃传统数据 ...

  7. hadoop中的序列化与Writable类

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable-class.html,转载请注明源地址. hadoop中自带的org.apache.h ...

  8. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  9. hadoop中汉字与英文字符混合的keyword做为combine的key的问题

    近期,须要将汉字与字符的非常合串作为combine的输出的key, 这样做是希望,利用hadoop的归并来依照key进行分组,然后,在reduce阶段,拿到的都是一个一个组. 可是,发现,这样的,汉字 ...

最新文章

  1. 刚刚,生物学横扫诺贝尔3大奖,两名女性获奖!化学奖授予试管中的“进化论”...
  2. Swift2.0语言教程之下标脚本
  3. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_WhatsApp缓冲区漏洞曝光 攻击者可通过MP4文件执行远程代码...
  4. mongodb数据库淘汰_MongoDB 等 NoSQL 与关系型数据库相比,有什么优缺点及适用场景?...
  5. 设计模式之facade模式
  6. 其实昨天去加班也没有干什么事情,就只有3个人
  7. Oracle数据库管理
  8. (2021) 20 [虚拟化] 进程调度
  9. 使用一个程序同时启动多个程序(c#)
  10. 少儿编程家长疑问解答
  11. 线性表文档之静态链表
  12. JSON日期时间的处理
  13. 老祖宗留下来的千古绝句,读完终身受益
  14. OTA 差分升级包的制作
  15. 【uniappAPP实现支付宝授权登录】
  16. ATTCK实战系列——红队实战(二)
  17. 机器人学资料站-202108
  18. Nagios③:文件初探
  19. 正宇丨做事,要“借力”,不要“尽力”
  20. MySQL_启动_Windows

热门文章

  1. js判断时间两小时之内_js判断两个时间的大小
  2. 删除同域名所有cookies_淘宝自动登录2.0,新增Cookies序列化
  3. visual tree view在工具箱力没有_Visual-Inertial Odometry
  4. 机器人学习--从路径规划侧面看栅格地图
  5. 问题 | 执行pip install --upgrade --ignore-installed tensorflow出现Cannot open\Scripts\pip-script.py
  6. matlab怎么连接服务器,matlab安装小坑----连接不上服务器
  7. 虚拟化服务器故障,修复vSphere vCenter服务器故障的技巧
  8. autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
  9. 学业水平考试网登录_江西学业水平考试成绩查询登录入口
  10. Numpy 生成随机数和乱序