Hadoop(MapReduce)入门 使用Eclipse开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lonelysky/article/details/54955345

花了一天时间把Hadoop的入门弄好了,走了不少弯路,不过最后还是弄好了。主要环境是Ubuntu 16.04Hadoop 2.7.3Oracle JDK 7u80Eclipse 3.8

操作系统准备(创建用户/SSH/JAVA

创建用户

安装Ubuntu就不多说了,现在ubuntu刚安装完真是什么都没有,什么都要apt-get。首先创建个用户,如果你安装的时候用户名不是hadoop那么就创建一个。

$sudo useradd -m hadoop -s /bin/bash

$ sudo passwd hadoop #这里需要给hadoop输入个密码,随便什么好了

$sudo adduser hadoop sudo

安装openssh-server

然后注销用hadoop用户登陆,开始安装ssh服务端。

$sudo apt-get openssh-server

安装完了之后测试一下sshlocalhost看看能不能登陆。如果能够输入密码登陆本机的话,进行下面操作,否则先google一下你的openssh-server怎么了。进行ssh免密码登陆。

$ ssh-keygen -t rsa #一路回车,什么默认位置,密码什么的都不要

$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

OK,然后在试试ssh localhost,看看要不要密码了。

安装Java

安装完了之后需要安装Java。两种安装方式。

一种用自带的OpenJDK之内的,直接sudo apt-get install openjdk-8-jdk就行了,这时候JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64。命令如下:

sudoapt-get install openjdk-8-jdk

还有一种从oracle官网上下载oraclejdk。我选的是jdk-7u80-linux-x64.tar.gz。直接解压目录,解压完了将目录移到/usr/lib/jvm下面,然后改个权限就ok了。命令如下:

$tar -zxvf jdk-7u80-linux-x64.tar.gz

$sudo mkdir -p /usr/lib/jvm

$sudo mv jdk1.7.0_80 /usr/lib/jvm

$cd /usr/lib/jvm

$sudo chown -R root:root jdk1.7.0_80

这个弄完了理论上还要弄JAVA_HOME的环境变量,后面一起弄,java安装先放在这里。接着需要创建hadoop用户。

 

部署Hadoop

官网上下载hadoop二进制包,官网地址:

http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz

然后放到Ubuntu机器上。

$tar -zxvf hadoop-2.7.3.tar.gz

$ vi hadoop-2.7.3/etc/hadoop/core-site.xml #修改core-site.xml配置文件

改成这个鸟样:

<configuration>
    <property>
       <name>fs.defaultFS</name>
       <value>hdfs://localhost:9000</value>
    </property>

</configuration>

$ vi hadoop-2.7.3/etc/hadoop/hdfs-site.xml #修改hdfs-site.xml配置文件

改成这个鸟样:

<configuration>
    <property>
       <name>dfs.replication</name>
       <value>1</value>
    </property>

</configuration>

网上面对于这个配置文件有各种各样的改法,这里是用官方的MapReduce Tutorial中最简单的方法,先这么用着再说,是Pseudo-Distributed Mode(伪分布式)。然后部署到系统中。

$sudo mv hadoop-2.7.3 /usr/local/hadoop

 

环境变量

编辑bash的环境变量。

$vi ~/.bashrc

在前面增加:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80 # JAVA_HOME需要根据实际情况确定

exportPATH=$JAVA_HOME/bin:$PATH

exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH

exportHADOOP_HOME=/usr/local/hadoop

exportHADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar

exportHADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

然后执行:

$source ~/.bashrc

 

运行Hadoop

先格式化HDFS

$ $HADOOP_HOME/bin/hdfs namenode -format

如果出现下面的两行

17/02/09 02:42:46 INFO common.Storage:Storage directory/tmp/hadoop-hadoop/dfs/name has been successfully formatted.

17/02/09 02:42:46 INFO util.ExitUtil:Exiting with status 0

说明成功了,否则先解决这个问题。注意这里可能用下面的警告(后面运行hadoop程序也会出现)。

17/02/09 02:42:39WARNutil.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable

不用管它,如果嫌他麻烦,自己重新编译hadoop好了。运行NamenodeDatanode

$$HADOOP_HOME/sbin/start-dfs.sh

如果没出现Error的话,用jps命令看看有没有NameNodeDataNode。(这里可能出现JAVA_HOME没设置的情况,注意.bashrc中一定要设置,profile可能不会起作用)

用浏览器看看http://localhost:50070能不能访问,如果能访问,说明成功了,进行下一步。

 

测试运行WordCount

首先找个WordCount的源代码,在hadoop-2.7.3.tar.gz里面有。路径是:hadoop-2.7.3\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.7.3-sources.jar,把这个玩意儿解压一下在org/apache/hadoop/examples下面有个WordCount.java,把它传到你的ubuntu机器上,放在$HOME中好了,然后编译成class文件。

$$HADOOP_HOME/bin/hadoop com.sun.tools.javac.Main WordCount.java

这里会出现三个class文件。

$ls -lrt *.class

-rw-rw-r-- 1 hadoop hadoop 1790 Feb  9 00:04 WordCount$TokenizerMapper.class

-rw-rw-r-- 1 hadoop hadoop 1793 Feb  9 00:04 WordCount$IntSumReducer.class

-rw-rw-r-- 1 hadoop hadoop 1998 Feb  9 00:04 WordCount.class

这里是hadoop自己的程序调用了javac而已,也可以用javac进行编译,只不过要把classpath全都带上,不过好在hadoop有个能够输出classpath字符串的参数。

$javac -classpath `$HADOOP_HOME/bin/hadoop classpath` WordCount.java

效果和上面的一样,然后用jar打个包。

$jar cf wc.jar WordCount*.class

会出现个wc.jar文件,这个文件最后会传给hadoop运行。

 

部署输入文件

前面的步骤formatHDFS文件系统,但是里面是空的,我们得往里面弄点数据。现在本地创建三个文件。

$cat Hello World Bye World > file01

$cat Hello Hadoop Goodbye Hadoop > file02

$cat Hadoop Tutorial > file03

然后在HDFS中创建输入目录。

$$HADOOP_HOME/bin/hadoop fs -mkdir -p /WordCount/input

然后把本地文件传到HDFS中。

$$HADOOP_HOME/bin/hadoop fs -put file01 /WordCount/input

$$HADOOP_HOME/bin/hadoop fs -put file02 /WordCount/input

$$HADOOP_HOME/bin/hadoop fs -put file03 /WordCount/input

然后检查一下,看看文件上传了没

$$HADOOP_HOME/bin/hadoop fs -ls /WordCount/input

Found3 items

-rw-r--r-- 3 hadoop supergroup 22 2017-02-08 21:49/WordCount/input/file01

-rw-r--r-- 3 hadoop supergroup 28 2017-02-08 21:49/WordCount/input/file02

-rw-r--r-- 1 hadoop supergroup 15 2017-02-09 03:03/WordCount/input/file03

OK,准备工作全部完成了。

 

测试运行

运行命令

$$HADOOP_HOME/bin/hadoop jar wc.jar org.apache.hadoop.examples.WordCount/WordCount/input/ /WordCount/output/

正常情况下会有一堆输出,看到下面这行就完成了。

17/02/09 03:19:38 INFO mapreduce.Job: map 100% reduce 100%

然后在HDFS中看结果。

$$HADOOP_HOME/bin/hadoop fs -ls /WordCount/output

Found 2 items

-rw-r--r-- 1 hadoop supergroup 0 2017-02-09 03:19/WordCount/output/_SUCCESS

-rw-r--r-- 1 hadoop supergroup 51 2017-02-09 03:19/WordCount/output/part-r-00000

其中part-r-0000就是结果,看一下结果内容。

$$HADOOP_HOME/bin/hadoop fs -cat /WordCount/output/part-r-0000

Bye        1

Goodbye        1

Hadoop        3

Hello        2

Tutoral        1

World        2

好了,说明成功了。如果需要再次运行,需要把output目录删掉。

$$HADOOP_HOME/bin/hadoop rm -r -f /WordCount/output


配置eclipse

安装插件

首先你得有个eclipse吧,可以用ubuntu自带的,也可以下载一个(自带的版本是3.8,我用4.4试过的)。然后你得下载个eclipsehadoop的插件,网址是:

https://github.com/winghc/hadoop2x-eclipse-plugin/blob/master/release/hadoop-eclipse-plugin-2.6.0.jar

当然要是没有翻墙的本领,我觉得还是别看这个教程了吧……然后安装插件。

如果用ubuntu自带的eclipse,请将hadoop-eclipse-plugin-2.6.0.jar放到/usr/lib/eclipse/plugins下,注意把文件所有者改成root用户(用sudo chown)。如果是自己下载的,放到eclipse/plugins下面。


配置eclipse

然后打开eclipse,在菜单栏选择Windows->Preference,在弹出的对话框左侧选择Hadoop Map/Reduce。在Hadoop installation directory:把自己的hadoop目录给填上。


 

点击eclipse右上角的切换到MapReduce的视图。


 

然后打开下方的Map/Reduce Location,右击空白处,选择New HadoopLocation…



在弹出的对话框中按照如下的内容填



然后在左侧的Project Explorer下面展开DFSLocations,能看见上次执行WordCount程序HDFS中的结果。



Eclipse中写WordCount

在菜单栏中选择File->New->Project,选择Map/ReduceProject



下一步



然后Finish。右击左面的Project Explorer中的WordCount->src,选择New->Class



WordCount.java中把之前的内容复制进去。



出现语法错误了,意思是这种multi paremeter types支持1.5版本以后的java,这是由于eclipse有自己的一套语法解析器,通过不了还没法用javac编译,还得配置一下工程先。右击ProjectExplorer中的WordCount项目,选择Properties,在打开的对话框左侧选择JavaCompiler;打开Enableproject specific settings;将Compilercompliance level调成1.7



OK,退出,然后编辑器上的红线就消失了,说明编译通过了。然后打开个文件管理器,到/usr/local/hadoop/etc/hadoop中,复制core-site.xmlhdfs-site.xmllog4j.properties三个文件(直接选中三个文件,按下Ctrl-C),然后右击Eclipse左侧的ProjectExplorer中的WordCount->srcPaste(或者单击后,按下Ctrl-V),最后效果如下:



右击WordCount.java,选择Run As->RunConfiguations。在左侧的JavaApplication新建个配置WordCount,在Arguments中把输入和输出位置填好了。



好了,快接近胜利了。回到之间的DFS Locations。把之前的output目录删掉。



然后右击WordCount.java,选择Run As-> Run on Hadoop。成功后下面的console会有一堆输出,和上面一样,如果出现了map 100%reduce 100%,说明成功了。



然后在DFS Locations中刷新一下WrodCount目录,会看见output了,打开part-r-0000看看结果对不对。



展开阅读全文

没有更多推荐了,返回首页