您的位置:首页 > 编程语言 > Java开发

Hadoop(MapReduce)入门 使用Eclipse开发

2017-02-09 20:39 381 查看
花了一天时间把Hadoop的入门弄好了,走了不少弯路,不过最后还是弄好了。主要环境是Ubuntu16.04,Hadoop 2.7.3,OracleJDK 7u80,Eclipse 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之内的,直接sudoapt-get install openjdk-8-jdk就行了,这时候JAVA_HOME是/usr/lib/jvm/java-8-openjdk-amd64。命令如下:
sudoapt-get install openjdk-8-jdk
还有一种从oracle官网上下载oracle的jdk。我选的是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-DistributedMode(伪分布式)。然后部署到系统中。
$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好了。运行Namenode和Datanode。
$$HADOOP_HOME/sbin/start-dfs.sh
如果没出现Error的话,用jps命令看看有没有NameNode和DataNode。(这里可能出现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运行。 

部署输入文件

前面的步骤format了HDFS文件系统,但是里面是空的,我们得往里面弄点数据。现在本地创建三个文件。
$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试过的)。然后你得下载个eclipse的hadoop的插件,网址是:
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用户(用sudochown)。如果是自己下载的,放到eclipse/plugins下面。配置eclipse然后打开eclipse,在菜单栏选择Windows->Preference,在弹出的对话框左侧选择HadoopMap/Reduce。在Hadoop installation directory:把自己的hadoop目录给填上。 点击eclipse右上角的切换到MapReduce的视图。 然后打开下方的Map/Reduce Location,右击空白处,选择NewHadoopLocation…
在弹出的对话框中按照如下的内容填
然后在左侧的Project Explorer下面展开DFSLocations,能看见上次执行WordCount程序HDFS中的结果。
在Eclipse中写WordCount在菜单栏中选择File->New->Project,选择Map/ReduceProject。
下一步
然后Finish。右击左面的ProjectExplorer中的WordCount->src,选择New->Class。
在WordCount.java中把之前的内容复制进去。
出现语法错误了,意思是这种multi paremeter types支持1.5版本以后的java,这是由于eclipse有自己的一套语法解析器,通过不了还没法用javac编译,还得配置一下工程先。右击ProjectExplorer中的WordCount项目,选择Properties,在打开的对话框左侧选择JavaCompiler;打开Enableprojectspecific settings;将Compilercompliance level调成1.7。
OK,退出,然后编辑器上的红线就消失了,说明编译通过了。然后打开个文件管理器,到/usr/local/hadoop/etc/hadoop中,复制core-site.xml,hdfs-site.xml,log4j.properties三个文件(直接选中三个文件,按下Ctrl-C),然后右击Eclipse左侧的ProjectExplorer中的WordCount->src选Paste(或者单击后,按下Ctrl-V),最后效果如下:
右击WordCount.java,选择RunAs->RunConfiguations。在左侧的JavaApplication新建个配置WordCount,在Arguments中把输入和输出位置填好了。
好了,快接近胜利了。回到之间的DFS Locations。把之前的output目录删掉。
然后右击WordCount.java,选择RunAs-> Run on Hadoop。成功后下面的console会有一堆输出,和上面一样,如果出现了map100%reduce 100%,说明成功了。
然后在DFS Locations中刷新一下WrodCount目录,会看见output了,打开part-r-0000看看结果对不对。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息