一两年前做的东西,现在放上来,一来是为了跟大家分享一下,二来可以留给自己以后参考
1.下载
指导老师要求大家统一用hadoop0.23.4,现在很难下到了,我提供个下载链接先:
http://pan.baidu.com/s/1i37i36P
这个包里面只有源码,编译通过后才能得到hadoop-0.23.4.tar.gz这个二进制文件
我的系统版本为CentOS release 6.4 (Final),装机时已经自带装好了一些其他软件,例如maven,未自带的可以到apache官网下载maven。
2.编译
解压包后进入包目录首先执行
mvn package -Pdist -DskipTests -Dtar
第一次要联网下很多包,时间比较长,大家耐心点。
如果在编译HADOOP-AUTH时候报错,就更改hadoop-common-project/hadoop-auth/pom.xml
在
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<scope>test</scope>
</dependency>
前面增加
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>
即可
之后编译Apache Hadoop HDFS时如果报protoc: command not found
可以到网上下载一个google的protobuf
最后将显示[INFO] BUILD SUCCESS
然后你就可以看到在hadoop-dist下面多出了target文件夹,编译的结果都在里面
hadoop-0.23.4.tar.gz是打好的包,未修改的话与官方的二进制文件无异
下一步执行
mvn eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true
就可以在Eclipse环境下修改hadoop了
3.配置
3.1准备工作
新建一个用户组与用户,本人hadoop用root用户无法运行,必须新建
[root@arionvm1 ~]# groupadd hadoop
[root@arionvm1 ~]# useradd -g hadoop hadoop
[root@arionvm1 ~]# passwd hadoop
配置ssh免密码登录
使用hadoop用户,不同用户公钥不同
[root@arionvm1 ~]# # su hadoop
[hadoop@arionvm1 root]$ ssh-keygen -t rsa -P ""
[hadoop@arionvm1 root]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
如果是单机这样就可以了,如果是集群的话,我是三台机器,每台机器上都执行前六条指令,然后通过scp命令将生成三个的id_rsa.pub汇聚成一个文件,放入authorized_keys中
最后得到的authorized_keys文件类似
ssh-rsa == ??...hadoop@thangool-test1
ssh-rsa == ??...hadoop@thangool-test2
ssh-rsa == ??...hadoop@arionvm1
如果权限不对还要执行chmod 644 authorized_keys
可以通过测试ssh远程登录,如果可以不要密码的话就是成功了
3.2安装hadoop
[root@arionvm1 opt]# tar xzf hadoop-0.23.4.tar.gz
[root@arionvm1 opt]# ln -s hadoop-0.23.4 hadoop
[root@arionvm1 opt]# chown -R hadoop:hadoop hadoop
3.3配置环境变量
[root@arionvm1 opt]# su hadoop[hadoop@arionvm1 opt]$ vi ~/.bashrc
增加
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
3.4配置hadoop
[hadoop@arionvm1 opt]$ cd /opt/hadoop/etc/hadoop
修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://arionvm1:49000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/hadoop-root</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/hadoop/workspace/hadoop_space/dfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>file:/opt/hadoop/workspace/hadoop_space/dfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permission</name>
<value>false</value>
</property>
</configuration>
修改mapred-stie.xml(没有就创建)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.job.tracker</name>
<value>hdfs://arionvm1:9001</value>
<final>true</final>
</property>
<property>
<name>mapred.job.history.server.embedded</name>
<value>true</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1800</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1700M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1800</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx1700M</value>
</property>
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>100</value>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>50</value>
</property>
<property>
<name>mapreduce.system.dir</name>
<value>file:/opt/hadoop/workspace/hadoop_space/mapred/system</value>
</property>
<property>
<name>mapreduce.local.dir</name>
<value>file:/opt/hadoop/workspace/hadoop_space/mapred/local</value>
<final>true</final>
</property>
</configuration>
修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>user.name</name>
<value>hadoop</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>10.10.96.88:54311</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>10.10.96.88:54312</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>10.10.96.88:54313</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>10.10.96.88:54314</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>10.10.96.88:54315</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>10.10.96.88</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>file:/opt/hadoop/workspace/hadoop_space/nmdata/local</value>
<description>the local directories used by thenodemanager</description>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>file:/opt/hadoop/workspace/hadoop_space/nmdata/log</value>
<description>the directories used by Nodemanagers as logdirectories</description>
</property>
</configuration>
修改yarn-env.sh,在末尾增加
export HADOOP_FREFIX=/opt/hadoop export HADOOP_COMMON_HOME=${HADOOP_FREFIX}
export HADOOP_HDFS_HOME=${HADOOP_FREFIX}
export PATH=$PATH:$HADOOP_FREFIX/bin
export PATH=$PATH:$HADOOP_FREFIX/sbin
export HADOOP_MAPRED_HOME=${HADOOP_FREFIX}
export YARN_HOME=${HADOOP_FREFIX}
export HADOOP_CONF_HOME=${HADOOP_FREFIX}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_FREFIX}/etc/hadoop
单机版就这样设置完毕了,集群版继续下面步骤
我有三台机器,分别是arionvm1、thangool-test1、thangool-test2
其中arionvm1当namenode,剩余两个当datanode
在masters中写下arionvm1,在slaves中写下thangool-test1和thangool-test2
上面的host名字都是自己定义的,我们需要将之与ip对应,
[root@arionvm1 opt]# vi /etc/hosts
在该文件下加类似下面几行,集群的按自己的写,单机的如果用的localhost就不用加了,用了别的名字可以把ip设置为127.0.0.1
10.10.96.88 arionvm1
10.10.96.89 thangool-test1
10.10.96.90 thangool-test2
这样就配置完毕
3.5运行hadoop
集群的话通过scp -r将改好的hadoop文件夹整个拷贝到所有的其他机器上即可,
此外集群建议关掉防火墙,否则可能无法连接,运行如下指令
[root@arionvm1 ~]# service iptables stop
然后集群与单机后面都一样的部分
[hadoop@arionvm1 opt]$ /opt/hadoop/bin/hadoop namenode -format
[hadoop@arionvm1 opt]$ cd /opt/hadoop/sbin/
[hadoop@arionvm1 opt]$ ./start-dfs.sh
[hadoop@arionvm1 opt]$ ./start-yarn.sh
大功告成了,我可以露出本文的唯一一个笑脸了
最后说一下,可以通过jps查看是否正常运行,还有wordcount测试部分,网上有很多,我略微提一下
[hadoop@arionvm1 hadoop]$ find . -name *examples*.jar
./share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.4.jar
新建几个文件,里面包含要统计的字符,放在一个文件夹内,这里我放在word文件夹内
[hadoop@arionvm1 for_test]$ hadoop dfs -copyFromLocal word /tmp/test
[hadoop@arionvm1 hadoop]$ hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.4.jar wordcount /tmp/test/ /tmp/output
如果报FileAlreadyExistsException可以运行
[hadoop@arionvm1 hadoop]$ hadoop dfs -rm -r /tmp/output
查看结果可以通过
[hadoop@arionvm1 hadoop]$ hadoop dfs -ls /tmp/output
[hadoop@arionvm1 hadoop]$ hadoop dfs -cat /tmp/output/part-r-00000