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

简介: 一个典型的实现Tool的程序:/** MyApp 需要从命令行读取参数,用户输入命令如, $bin/hadoop jar MyApp.jar -archives test.tgz  arg1 arg2 -archives 为hadoop通用参数,arg1 ,arg2为job的参数 */ public class MyApp extends Configured imple

一个典型的实现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中的参数。

 

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

 

 

 


目录
相关文章
|
2月前
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
45 3
|
2月前
|
分布式计算 Java Hadoop
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
41 2
|
2月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
38 1
|
2月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
53 1
|
5月前
|
分布式计算 Hadoop Java
Hadoop编辑hadoop-env.sh文件
【7月更文挑战第19天】
341 5
|
2月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
181 6
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
73 2
|
1月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
102 2
|
1月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
71 1
|
2月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
69 1