`
qicen
  • 浏览: 47314 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

总结hadoop mapreduce job添加第三方依赖的方法

阅读更多
最近在开发mapreduce程序,输入有hdfs、hbase形式,输出有hdfs、mysql等形式。碰到了如何添加第三方依赖jar的问题,在网上查了很多资料,记录下来,免得再走弯路。

下面所有方法基于hadoop-1.0.1版本实现,其它版本可能略有不同。
总结了一下,总共有五种方法:

    1、制作一个超级jar包,包含你的classes和所有依赖的第三方classes
    2、和方法1差不多,只不过不是把依赖的第三方classes直接放入jar中,而是把第三方依赖的jar放在待提交jar包的lib目录下。
    3、将jar包放在hadoop集群的各自node上,修改hadoop-env.sh中HADOOP_TASKTRACKER_OPTS 的值或者HADOOP_CLASSPATH。
    4、将依赖的jar包拷贝事先到hdfs上,在代码中通过DistributedCache.addFileToClassPath方法,将其加入到依赖中。
    5、使用hadoop jar的-libjars参数来设置第三方依赖的jar

方法1和2的思想是一样的,都是把所有的依赖放入到一个jar包中。但这些方法不利于版本的维护,不推荐使用
方法3则需要配置集群中所有的node,而且也让hadoop本身依赖了第三方不相关的jar。
方法4必须由代码去控制第三方的jar依赖,也不利于依赖的管理。
方法5则没有上述问题,推荐使用
不过使用方法5有一些注意事项,否则你会发现即使设置了-libjars,还是找不到依赖的类。

方法5具体使用步骤:
1、提交jar参数设置
hadoop jar my-example.jar com.example.MyTool -libjars mysql-connector-java.jar,abc.jar

多个jar包间使用逗号分隔。

2、main函数的参数必须使用GenericOptionsParser解析。
public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    ....
}

或者通过ToolRunner.run去解析参数
public static void main(final String[] args) throws Exception {
  Configuration conf = new Configuration();
  int res = ToolRunner.run(new MyTool(), args);
  System.exit(res);
}

public class MyTool extends Configured implements Tool {

  public final int run(final String[] args) throws Exception {
    Job job = new Job(super.getConf());
    ...
    job.waitForCompletion(true);
    return ...;
  }

详细代码可以参照mapreduce内的examples。

实际上ToolRunner.run的内部也是调用了GenericOptionsParser去解析参数。跟踪源码就会发现GenericOptionsParser有这样的一段代码:
    if (line.hasOption("libjars")) {
      conf.set("tmpjars", 
               validateFiles(line.getOptionValue("libjars"), conf));
      //setting libjars in client classpath
      URL[] libjars = getLibJars(conf);
      if(libjars!=null && libjars.length>0) {
        conf.setClassLoader(new URLClassLoader(libjars, conf.getClassLoader()));
        Thread.currentThread().setContextClassLoader(
            new URLClassLoader(libjars, 
                Thread.currentThread().getContextClassLoader()));
      }
    }

最终是往Configuration里设置了tmpjars的属性。

参考文献:
1、http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/
2、http://grepalex.com/2013/02/25/hadoop-libjars/
分享到:
评论

相关推荐

    hadoop-eclipse-plugin-2.6.0

    3. **lib**:这里包含了插件运行所需的第三方库文件,比如Hadoop客户端的相关jar包,这些库文件使得插件能够与Hadoop集群通信,执行MapReduce任务。 4. **META-INF**:这是标准的Java存档(JAR)文件的一部分,包含...

    winutils.exe + hadoop.dll

    通常它们不在Hadoop官方发行版中,但可以在社区或第三方网站找到。 2. **配置环境变量**:将`winutils.exe`的路径添加到系统的`PATH`环境变量中。这样,你就可以在命令行中直接使用`winutils`命令了。同样,确保`...

    基于hadoop的电影推荐网站.zip

    - lib目录:依赖的第三方库,可能包含Hadoop、Apache Commons、推荐算法库等。 - resources目录:非Java资源文件,如输入数据、日志模板等。 五、项目实施步骤 1. 配置Hadoop环境,确保集群正常运行。 2. 编写...

    spark安装1

    - **集群资源管理器(Cluster Manager)**:协调和管理集群资源,可以是Spark自身的资源管理器,也可以是YARN或Mesos等第三方资源管理框架。 - **工作节点(Worker Node)**:运行Executor进程,执行计算任务。 - ...

    大数据技术之Sqoop.docx

    自2009年起,Sqoop开始作为一个Hadoop的第三方模块发展,随着其影响力的扩大,最终独立成为Apache的一个项目。尽管存在Sqoop2的尝试,但其并未广泛采用,目前主要使用的版本是Sqoop1,如1.99.7。 【Sqoop工作原理】...

    sqoop详细开发手册(开发,优化,参数解释等)

    这个开源工具自 2009 年起发展至今,经历了从 Hadoop 第三方模块到独立 Apache 项目的转变,以提供更高效、便捷的数据交换服务。 在 Sqoop 的工作原理中,它将导入或导出的命令转化为 MapReduce 程序来执行。...

    java代码-大数据2 9 郑林鸿

    Java的`ObjectOutputStream`和`ObjectInputStream`可用于此目的,或者第三方库如Protobuf、Avro也可能被采用。 `README.txt`文件通常包含项目简介、使用指南、依赖库、安装步骤等信息。对于大数据项目,它可能说明...

    Strikingly在AWS的大数据平台实践.pptx

    因此,他们转向了第三方平台keen.io,这是一个专业的数据收集和分析服务,可以提供更深度的数据访问,但随着业务的增长,keen.io的处理能力逐渐显得不足。 为了解决这个问题,Strikingly引入了Apache Kylin,这是一...

    排程器

    Java提供了一些内置的调度框架,如`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`,以及第三方库如Quartz Scheduler,这些工具使得开发者能够方便地创建和管理定时任务。 1. **Java内置排程...

Global site tag (gtag.js) - Google Analytics