hadoop2.6虚拟机搭建和应用到win平台下eclipse开发
历程是艰辛,无脑的苦力活~
首先我的平台是搭建在cenos7虚拟机上的,使用hadoop2.6,部署计划:
主机 | 角色 |
namenode1:192.168.80.101 | namenode,resourcemanager |
datanode1:192.168.80.102 | datanode,nodemanager |
datanode2:192.168.80.103 | datanode,nodemanager |
0.需要 hadoop2.6 ,jdk1.7,hadoop-eclipse-plugin-2.6.0.jar,出错时候用的一些文件
1.关于虚拟机的网络设置,使用nat模式:文件/etc/sysconfig/network-scripts/ifcfg-eno*
lo网卡设置关掉,把 ONBOOT=yes 改成 no即可
TYPE=Ethernet
HWADDR=00:0C:29:9E:66:9c
#BOOTPROTO=dhcp
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=98f69bcb-c555-40a4-ac50-d6cf6a2fab73
DEVICE=eno16777736
#ONBOOT=no
ONBOOT=yes
IPADDR0=192.168.80.101
PREFIX0=24
GATEWAY0=192.168.80.1
sudo service network restart
2.关于SSH免密登录,可参考其他资料,或上一个随笔。其实免密登录不是搭建hadoop平台必须的,只是可以方便开启结点
3.jdk的配置也很简单,解压后,写入配置文件路径 sudo vi /etc/profile
(export JAVA_HOME=
export PATH=$PATH:$JAVA_HOME)
更新 source vi /etc/profile
成功后,在命令台输入 java运行成功即可。
4. 配置hadoop
4.1把hadoop路径写入系统文件
4.2改配置文件 hadoop_home\etc\hadoop\core-site.xml
关于缓存文件的dir需要事先创建出来,
要记好 这里的hdfs端口号,
<property> <name>fs.defaultFS</name> <value>hdfs://namenode1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/boy/hadoop/hadoop-2.6.0/tem</value> </property> <property> <name>hadoop.proxyuser.root.hosts</name> <value>namenode1</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
前提:在所有机器上主机和网址的映射都有,文件 /etc/hosts
127.0.0.1 localhost www # localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.101 namenode1
192.168.80.102 datanode1
192.168.80.103 datanode2
配置文件 应该根据自己的平台做相应变化,关于解释,请查阅其他的。网上有很多资料
4.3配置文件 hdfs-site.xml
<property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.name.dir</name> <value>/home/boy/hadoop/hadoop-2.6.0/tem/name1</value> #hadoop的name目录路径 <description> </description> </property> <property> <name>dfs.data.dir</name> <value>/home/boy/hadoop/hadoop-2.6.0/tem/data1</value> <description> </description> </property>
dfs.replication:数据副本个数,在该集群中是有两个数据节点,默认是3个,个数不能多于数据节点个数
dfs.permissions:是否验证访问者权限
后面两个是数据文件存放的位置,可以不用事先创建
4.4yarn-site.xml
这里的 resourcemanager端口号 8032也很重要,后面eclipse会用到
端口8088是hadoop marreduce的web访问端口
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>namenode1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>namenode1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>namenode1:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>namenode1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>namenode1:8088</value> </property>
4.5mapred-sit.xml
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobtracker.http.address</name> <value>namenode1:50030</value> </property> <property><name>mapreduce.jobhistory.address</name><value>namenode1:10020</value> </property> <property><name>mapreduce.jobhistory.webapp.address</name><value>namenode1:19888</value> </property> <property><name>mapreduce.jobhistory.intermediate-done-dir</name><value>/mr-history/tmp</value> </property> <property><name>mapreduce.jobhistory.done-dir</name><value>/mr-history/done</value> </property>
4.6 修改hadoop-env.sh文件 中的java_home,为机器的java_home
4.7到这里配置完成,把所有配置文件发送或拷贝到其他主机,一定要一样,不一样的话 mast节点会报错,或者数据节点会启动不起来,但是如果是数据节点报错,报错信息可以通过控制台看到日志文件的位置,可以查看异常。
4.8 在主节点 格式化节点 进入hadoop安装目录,执行:bin/hdfs namenode -format 格式化节点
如果配置文件出错,窗口会提示,大多为配置文件错误,如果有其他错误,可查阅其他资料。
最后提示格式化成功,然后再节点执行:
mast:
sbin/hadoop-deamon.sh start namenode
sbin/yarn-deamon.sh start resourcemanager
slave:
sbin/hadoop-deamon.sh start datanode
sbin/yarn-deamon.sh start nodemanager
hadoop2.X引入了yarn,将原来的job和task从资源管理中脱离出来,减轻集群负担。分为资源管理和任务管理,也就是resourcemanager管理nodemanager,通过任务管理进程applicationmaster
成功启动个节点后,使用jps命令查看当前节点状态
master:
ResourceManager
Jps
Namenode
slave:
NodeManager
Jps
DataNode
在主节点,运行:bin/hadoop dfsadmin -report
可以查看个节点状态
另外启动成功并不代表可以执行程序:
在集群中创建目录:bin/hdfs dfs -mkdir /user/boy/input(路径随意,我的用户是boy所以这样用,主意这里和本机没有关系)
将本机文件上传到HDFS:bin/hdfs dfs -put s.txt /user/boy/input (本地文件可以是相对路径或绝对路径)
感想:其实搭建过程很简单,hadoop的配置文件不能搞错,这些也都是繁琐工作。由于不了解配置文件具体的哪个属性的用途,我走了很多弯路。学知识和技术不能太着急。多尝试,如果时间允许的话
5.连接eclipse
网上有很多教程连接eclipse的,但是很多介绍不明确。首先我先提出想法:
编写HDFS存储操作程序或MapReduce程序,在win平台下使用eclipse执行,远程连接虚拟机中的hadoop集群,实现分布式程序开发。
eclipse连接虚拟机中的hadoop需要插件,网上介绍很多插件编译方法,我虽然尽量避开这些繁琐的地方,试过hadoop2.5,最终是在朋友帮助下使用了hadoop2.6,因为朋友有插件包等一些必须文件。不过我最终使用的还是自己用ant自己编译的,编译过程不难,出现卡住的错误,可以在网上查资料找到解决方法,本文也给出查到的解决方法。
5.1插件准备 hadoop-eclipse-plugin-2.6.0.jar
5.2放到eclipse安装目录的plugin插件文件夹中,重启eclipse,如果没有反应,试一下清理缓存,命令行中 放入eclipse.exe 后面跟 -clean 启动,我就是这里在eclipse window-preference 怎么不出来hadoop配置的相关
5.3 win平台也需要hadoop,把虚拟机中的配置好的hadoop 压缩拷贝出来,解压到win平台中,在系统环境变量中配置hadoop_home,加入到path中。然后配置到上图中的hadoop 文件路径中。
eclipse下面状态栏中会有小象的窗口,在这里建立与虚拟机hadoop的链接,右键 Location 出现编辑 新建 删除,选择新建
配置远程的 hadoop mast机地址,还有mapreduce端口号,和HDFS端口号,即 resourcemanager端口号8032和defalueFS端口号9000,用户名处写hadoop中的用户名
在扩展参数advance parameters 选项框中,可以不管,有很多运行的历史文件存到本地,不方便一一介绍,日后可以统一修改
5.4下面终于可以 开始编程了,创建mapreduce程序,默认eclipse会导进来很多包,需要去重,我去重后还有108个包,百度编写wordcount程序吧。
package shmtu.hadoop.test; import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; public class WordCountTest { public static class MyMap extends MapReduceBase implements Mapper<LongWritable,Text,Text,IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key,Text value,OutputCollector<Text,IntWritable> output,Reporter repoter) throws IOException{ String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while(tokenizer.hasMoreTokens()){ word.set(tokenizer.nextToken()); output.collect(word, one); } } } public static class MyReduce extends MapReduceBase implements Reducer<Text,IntWritable,Text,IntWritable>{ public void reduce(Text key,Iterator<IntWritable> values,OutputCollector<Text,IntWritable> output,Reporter reporter) throws IOException{ int sum = 0; while(values.hasNext()){ sum += values.next().get(); } output.collect(key, new IntWritable(sum)); } } public static void main(String[]args) throws Exception{ JobConf conf = new JobConf(WordCountTest.class); conf.setJobName("wordcount"); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); conf.setMapperClass(MyMap.class); conf.setReducerClass(MyReduce.class); conf.setInputFormat(TextInputFormat.class); conf.setOutputFormat(TextOutputFormat.class); // Path in = new Path("hdfs://192.168.80.101:9000/user/boy/input"); Path out = new Path("hdfs://192.168.80.101:9000/user/boy/output2"); // FileInputFormat.setInputPaths(conf,new Path(args[0])); // FileOutputFormat.setOutputPath(conf,new Path(args[1])); FileInputFormat.setInputPaths(conf,in); FileOutputFormat.setOutputPath(conf,out); // JobClient.runJob(conf); } }
5.5 运行过程中 会出现各种奇怪错误,就是这么周折:
http://my.oschina.net/muou/blog/408543#OSC_h2_9
--------------------
http://www.tuicool.com/articles/qY7F3q
命令行在ivy-resolve-common处卡了
原因是找不到几个依赖包,那几个依赖包可能是换路径了,其实不需要这几个依赖包也可以
解决方案:
修改"H2EP_HOME"\src\contrib\eclipse-plugin\build.xml
找到:
<target name="compile" depends="init, ivy-retrieve-common" unless="skip.contrib">
去掉depends修改为
<target name="compile" unless="skip.contrib">
-------------------
插件包没反应
http://www.aboutyun.com/thread-11288-1-1.html
是其他的,已经做好了,解决办法是: 启动eclipse的时候清理一下缓存。 eclipse.exe -clean。 就可以解决我那个插件不存在的问题。谢谢。哥们。
---------------------------------------
问题一.An internal error occurred during: "Map/Reducelocation status updater".java.lang.NullPointerException
我们hadoop-eclipse-plugin-2.6.0.jar放到Eclipse的plugins目录下,我们的Eclipse目录是F:\tool\eclipse-jee-juno-SR2\eclipse-jee-juno-SR2\plugins,重启一下Eclipse,然后,打开Window-->Preferens,可以看到Hadoop Map/Reduc选项,然后点击出现了An internal error occurredduring: "Map/Reduce location status updater".java.lang.NullPointerException,如图所示:
解决:
我们发现刚配置部署的Hadoop2还没创建输入和输出目录,先在hdfs上建个文件夹 。
#bin/hdfs dfs -mkdir –p /user/root/input
#bin/hdfs dfs -mkdir -p /user/root/output
我们在Eclipse的DFS Locations目录下看到我们这两个目录,如图所示:
------------------------------
http://book.2cto.com/201408/45667.html
---------------------------
------------------
org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
分析:
C:\Windows\System32下缺少hadoop.dll,把这个文件拷贝到C:\Windows\System32下面即可。
解决:
将压缩包中的hadoop.dll放到C:\Windows\System32下,然后重启电脑,也许还没那么简单,还是出现这样的问题。如果这个还是没解决,最好在%HADOOP_HOME%/bin目录下面也复制一份。
-------------------
请多百度,查看资料,上面给出一部分错误。注意到 成功运行还需要另外一些文件
如果需要,我可以上传。hadoop2.6的