十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
接着上一篇《Hadoop应用引用第三方jar的几种方式(一)》继续写。。。。。。。
创新互联是一家专业提供汤原企业网站建设,专注与成都网站制作、网站建设、H5高端网站建设、小程序制作等业务。10年已为汤原众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
简单来说,Hadoop引入第三方jar包有以下几种方式:
一、把引用到的所有的第三方jar包打到一个jar包内,形成一个超大包,像上一篇文章中提到的第二种引入jar之后打包的方式;
二、把引用到的所有的第三方jar包放到Hadoop的lib目录下,需要Hadoop集群中的每个节点都要放;
三、把jar包放在集群中固定的一台机器上,使用libjars命令加载第三方jar;
四、把jar包放在HDFS上,动态加载第三方jar包。
接下来对这几种方式的优缺点,说一下我个人的见解:
一、把引用到的所有的第三方jar包打到一个jar包内
优点:在hadoop集群上可以直接运行,运行命令也是比较简单;
缺点:把所以的jar包放在一起,文件过大,考虑到加入升级版本的话,引用的第三方jar文件一般不会发生变化,这种打包方式每次都要把第三方jar文件打包在一起上传。
这种打包方式在上一篇文章中《Hadoop应用引用第三方jar的几种方式(一)》已经进行了演示和说明,个人不太建议这种方式。
二、把引用到的所有的第三方jar包放到Hadoop的lib目录下
优点:在hadoop集群上可以直接运行,运行命令也是比较简单;
缺点:集群中的每个节点下都需要放置第三方jar,缺一不可,不够灵活,当版本升级的时候,需要对每一台机器上的jar包进行维护,不太容易进行维护。
对于这种方式,我没有进行实验,理论上来说是可行的,个人不太建议这种方式。
三、把jar包放在集群中固定的一台机器上,使用libjars命令加载第三方jar
优点:只需要维护hadoop集群中的一台机器上的lib库,易于系统的维护;
缺点:只能在存放jar的机器上去执行hadoop jar 命令执行程序,且执行命令较复杂;
个人对这种方式还可以接受,不过并不是我最喜欢的方式。
在这里,我进行了测试,WordCount的代码不变,打成WordCount_libjarscmd.jar,注意在打包的过程中不要选择lib中的jar文件,然后把OperateHDFS.jar放到集群中的一台机器上面,执行的命令如下所示:
hadoop jar WordCount_libjarscmd.jar com.hadoop.examples.WordCount -libjars OperateHDFS.jar input libjarscmdoutput
该命令的格式如下:
hadoop jar 要执行的jar 要执行的Class -libjars 第三方jar的目录 最后是程序要求的输入输出参数
程序的执行结果是ok,可以执行,没有问题,结果如下所示:
四、把jar包放在HDFS上,动态加载第三方jar包
优点:程序可以方便的在集群上的任何一个节点运行,且执行命令的机器没有限制;
缺点:需要在程序中编写代码添加第三方jar,如果存放lib的目录发生了变化,那就只能改代码了。。。。
个人比较喜欢这种方式,毕竟存放lib的目录一般不会发生变化,我是这么认为的,(*^__^*) 嘻嘻……
在这里,我对这种方式进行了测试,需要先把OperateHDFS.jar存放在HDFS上面,然后对WordCount稍作修改,增加动态的添加第三方jar的代码块,然后打成jar包WordCount_dynamicload.jar,注意在打包的过程中不要选择lib中的jar文件,执行的命令如下所示:
hadoop jar WordCount_dynamicload.jar com.hadoop.examples.WordCount input dynamicload
程序的执行结果是ok,可以执行,没有问题,结果如下所示:
下面把WordCount源代码贴出来:
package com.hadoop.examples; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; import com.hadoop.hdfs.OperateHDFS; public class WordCount { public static class TokenizerMapper extends Mapper