Eclipse的Hadoop版HelloWorld

来源:互联网 发布:二元期权源码 编辑:程序博客网 时间:2024/06/05 08:24
     我是在自己虚拟机上搭建的三个节点的hadoop伪分布式集群,其实伪分布式跟完全分布式部署方法完全一样,把虚拟机换成物理机器就可以了。在eclipse上开发程序后运行方式有两种,一种是打包成jar包提交到集群,用hadoop的jar命令运行;另一种是下面要介绍的直接在eclipse中编程然后运行。


     1、搭建eclipse环境
     1) 将hadoop的eclipse插件hadoop-2.4.1-eclipse-4.4-plugin.jar放在eclipse安装目录的plugins下。我使用的版本是hadoop-2.4.0的,eclipse版本是4.4.1的luna,不过网上资料说他们使用版本不对应的插件包也能正常开发。plugin在此:
链接:http://pan.baidu.com/s/1qWI86Eo 密码:rpxu

     2) 点击eclipse中window -> open perspective -> map/reduce,这时就可以看到左栏有DFS Location的文件系统出来了。但是整个插件还没配置好,所以看不到文件系统内容。


     3) 在控制台同一个导航栏中出现map/reduce location的tab,选中它,然后右键选择新建location可以具体配置文件系统信息。


     4) 选中1处,然后在2处随意填写你喜欢的名字,将3,4处修改成你配置文件hdfs的位置和端口号,一般4处的没配置的话端口号保持默认。


     5) 选中高级参数一栏,确保跟你部署的hadoop中的配置的信息一致,比如修改过hadoop.tmp.dir,hadoop.datanode.data.dir等等,填写你${HADOOP_HOME}/etc/hadoop/下的对应的配置文件信息。


     6) 启动hadoop集群或者只启动hadoop集群的HDFS,右键eclipse中左栏的DFSLocation可以看到HDFS的文件。




     2、编程WordCount程序
     1) 上面的插件很强大,你建立一个map/reduce程序的时候就已将把所需要的包导进来了,灰常方便。File -> New -> Project -> map/reduce Project就可以了。

     2) 在WordCount类里面建立自己的map和reduce子类,在map类中重写map方法,在reduce子类中重写reduce方法。其中,IntWritable类是hadoop对int的封装,Text类是对String类的封装,这是出于他们能够被串行化而方便在分布式环境中传输数据的考虑。(参考:《实战Hadoop:开启通向云计算的捷径》_刘鹏


     3) 运行。编程main方法,在该方法中,指定配置文件,设置map,reduce,输入输出等类。在程序运行的时候,首先找到入口函数main,一切配置完整之后,调用job的waitForCompletion方法时mapreduce框架才会找到前面设置好的map类和reduce类进行执行。运行前需要在eclipse中指定好运行参数,右键 -> run as -> run configurations -> arguments,第一个参数是输入文件的路径和文件名,第二个参数必须是没有存在过的目录名,我将它设置为HDFS的一个目录,默认的,如果只给出文件夹名称,该文件夹会放在放在该wordcount项目的目录下,比如我的是/home/hduser/eclipse/workspace/wordcount




     3) 运行结果及分析


     就像上面提到的,先运行main入口函数,然后再让框架调用map和reduce类计算。这里的key是指切割文本后每一行文本的key值,稍后做更详细点的分析,取值为每一行的首字母的地址对应整个文本的首地址的偏移量,比如第一行的偏移量为0,第二行首字母的偏移量就是第一行的字节数加上回车换行符,在本例中是15+1=16,因此第二行的偏移量为16。为了证明,我在第一行回车后再敲了个回车,也即第二行是一行空行,如箭头所指。因此第三个首字母的偏移量为16+1=17。

     下面补充一下整个map/reduce流程。简单描述就是split -> map -> combine -> shuffle -> reduce。在整个流程中会有多次排序。
     split:这个阶段是切割本文,将文本一行一行分割成key-value对,也就是上面运行结果所示那样。
    map:将上述的每一个kv对重新映射为新的kv对,以空格为分隔符,然后将结果排序,输出至下一步。
     combine:很多情况下combine就是reduce操作,只不过是在每个map端进行合并,而reduce端则是对所有的map进行合并。之所以要执行combine操作的理由是1)尽量减少map中写入磁盘的io次数;2)减少后续网络传输所占资源。
     shuffle:shuffle的意思是洗牌。combine也算是map的一部分,shuffle则是将map(准确的说应该是combine)的结果按照key值分成n个,(n指reduce的个数)。通常这个划分是使用哈希函数,比如取摸。这样可以使得一定范围的key由某个reduce来处理。
     reduce:将所有的map结果排序后合并成最后结果。

     hadoop的mapreduceTutorial给出了非常详细的解释,包括一步步执行时的结果,讨论了map,reduce个数的选择以及有完整的wordcount源码。详戳:http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html 
0 0