搭建过hadoop之后,如何让程序在hadoop集群中分布式运行成了一件令人头痛的事。
可能有人会说在eclipse的类文件中右键点击-》“run on hadoop”不就行了嘛,注意:eclipse中的“run on hadoop”默认只是运行在单机上的,因为要想在集群中让程序分布式运行还要经历上传类文件、分发到各个节点等过程的,一个简单的“run on hadoop”只是启动了本地hadoop类库来运行你的程序而已,在Hadoop JobTracker的web管理页面(http://localhost:50030)上是看不到任何作业信息的,因为你的作业根本就没有运行在集群上。
《Hadoop:the Definitive Guide 3rd edition》上介绍的是使用打jar包的方式,然后用hadoop脚本命令的jar选项来运行分布式程序。如下所示:
hadoop jar hadoop-examples.jar v3.MaxTemperatureDriver -conf conf/hadoop-cluster.xml input/ncdc/all max-temp |
但问题是这本书里面是使用maven来编译类文件的,通过pom.xml他很容易就解决了jar包的依赖问题,这让我等平常使用eclipse来编程的灰常依赖IDE的程序猿们情何以堪啊,maven的配置及使用方法到现在还没搞懂,索性不学了,自己打jar包吧
自己打jar包就要解决类文件引用的问题,以我在程序中使用的Hbase的jar包(hbase-0.94.3.jar)为例,我先后尝试了各种试图解决类文件引用及打jar包的方法,无论如何,总会提示我找不到org.apache.hadoop.hbase.util.Bytes class文件(它就在hbase-0.94.3.jar中),以下为我尝试的各种方法:
1.设置classpath到hbase-0.94.3.jar 2.设置HADOOP_CLASSPATH到hbase-0.94.3.jar 3.设置HADOOP_CLASSPATH到HBASE_HOME 4.把hbase-0.94.3.jar打包到运行的jar包中(其中包括了1.直接打进jar包;2.放入lib文件夹再打入jar包;3.通过manifest文件设置Class-Path选项指向hbase-0.94.3.jar) 5.把hbase-0.94.3.jar复制到HADOOP_HOME/lib下面
直至这个时候我已要接近崩溃了,要知道光是解决这个问题已花费了我接近三天的时间,仍是一无所获,索性不做了改弄其他东西,如此10多天过去了。
等忙完这10多天,另一个解决问题的角度出现了,既然自己在命令行下打包不行,为何不使用eclipse呢(说到底还是屈服于IDE了,我鄙视我自己!)。刚开始是直接把整个项目导出成jar包,但这样只是包含了自己编写的源文件及lib文件夹下的依赖jar包,并没有包含hadoop-core之类的引用第三方jar包,按着这个思路就去google了下如何完整的把引用的第三方jar包也包含进来的打包方式,还真给找到了:Fat-jar!(下载地址)
下载之后解压缩,会得到一个名为net.sf.fjep.fatjar_0.0.31.jar(版本不同,名字可能不同)的jar包,把它拷到eclipse_home/plugins中然后重启eclipse,如果在Windows=>prefernce=>fat jar preference看到它就说明已经安装成功了。
接下来,在需要导出的Java项目上右击,选择“导出”,选择”其他”中的”Fat Jar EXporter”,即可进行打包操作。注意选择好”Main-class”以及需要打包的文件。“finish”之后你就会得到一个完整的jar包了,这样便可以在任何地方通过hadoop jar命令来运行了,以我的程序为例:
hadoop jar HDG3.jar cf/RateDataImporter //HDG3.jar为我的jar包的名字,共64Mb,cf/RateDataImporter为我要运行的类文件名字 |
在jobtracker的web管理界面可以很清楚的看到此作业的信息,以及正在运行的进度、状态等,感觉很爽的有木有(虽然我的集群只有两个节点)!
至此,折腾了许久的hadoop集群运行分布式作业问题终于解决!