Hadoop集群的部署


        网上很多关于hadoop集群部署的文章, 我这里重新整理下,毕竟,别人的经历,让你按照着完整走下来,总有或多或少的问题。

小技巧分享:

        有些初学者喜欢在自己机器上安装虚拟机来部署hadoop,毕竟,很多同学的学习环境都是比较受限的。j_0057.gif

        我这里则直接选择了阿里云的机器,买了三台ECS作为学习环境。毕竟,最低配一个月才40多块,学习还是要稍微投入点的。j_0067.gif


一、 基础环境准备

Windows不熟练,小主只有选择Linux了。

官方提示如下,Linux所需软件包括:

  1. JavaTM1.5.x,必须安装,建议选择Sun公司发行的Java版本。

  2. ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。

  3. rsync也是需要安装的。


so, 首先选择买几台Linux服务器,然后去准备基础环境。

  1. 阿里云官网www.aliyun.com, 注册一个账号,很便捷,支持支付宝付款。这年头,如果没有支付宝,就真的奥特曼了。

  2. 购买一台ECS(当然,最便宜的一种),选择的是aliyun redhat 5.7 64.(哦,不是要买三台吗?不急,后面可以展示下云计算的威力,花点小钱,节约大把时间,何乐不为呢?)

  3. 检查这个机器的基础环境:

[hadoop@iZ94cjwg86gZ ~]$ uname -a
Linux iZ94cjwg86gZ 2.6.32-220.23.2.al.ali1.1.alios6.x86_64 #1 SMP Sun Jan 4 15:01:53 CST 2015 x86_64 x86_64 x86_64 GNU/Linux

[hadoop@iZ94cjwg86gZ ~]$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.4) (rhel-1.41.1.10.4.5.alios6-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

[hadoop@iZ94cjwg86gZ ~]$ python --version
Python 2.6.6
[hadoop@iZ94cjwg86gZ ~]$
Hey, 兄弟,真不赖,什么Java/Python安装起来也不轻松。不用操心,太好了。


检查下, Java中的JPS工具是否有,后面会依赖这个工具。这个时候,你会纳闷,咦,怎么检查呢,Java目录在哪里呢?
这个时候,你会发现两个命令可以帮你,一个是find, 当然,另外一个就是rpm。这里就不介绍这些命令了。(如果有问题,大家搜索下就了解了)
rpm -qa|grep java
[hadoop@iZ94cjwg86gZ ~]$ rpm -qa|grep java
libvirt-java-0.4.7-1.3.alios6.noarch
java-1.6.0-openjdk-devel-1.6.0.0-1.41.1.10.4.5.alios6.x86_64
libvirt-java-devel-0.4.7-1.3.alios6.noarch
tzdata-java-2011l-4.4.alios6.noarch
java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.5.alios6.x86_64

[hadoop@iZ94cjwg86gZ ~]$ rpm -ql java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.5.alios6.x86_64|grep bin
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/java
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/keytool
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/orbd
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/pack200
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/rmid
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/rmiregistry
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/servertool
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/tnameserv
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin/unpack200
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/libinstrument.so
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/zi/Asia/Harbin



哦, maybe  /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/就是java的主目录啦~~~~~~~~~

[hadoop@iZ94cjwg86gZ bin]$ pwd
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin
[hadoop@iZ94cjwg86gZ bin]$ ls jps
jps
[hadoop@iZ94cjwg86gZ bin]$

[hadoop@iZ94cjwg86gZ bin]$ rpm -qa|grep rsync
rsync-3.0.6-5.4.alios6.1.x86_64
[hadoop@iZ94cjwg86gZ bin]$

Fortunately,  Java环境, Python环境, rsync 都是ok的。
另外,就是集群管理,毫无疑问, PSSH需要有一个的,不然, 一台机器一台机器操作, 没有人愿意。

安装setuptools,即easy_install。
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e 
tar zxf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11 & python setup.py install 

然后, easy_install pssh, 就这样,基础工具就这样准备好啦。

    


二、系统环境准备


  1. 权限问题

我们尽量要规避Hadoop的root操作权限,因此,我们需要新建一个用户:hadoop。

useradd hadoop
password hadoop 
比较重要的就是:hadoop的sudo权限
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
hadoop   ALL=(ALL)  NOPASSWD: ALL
如果你想设置只有某些命令可以sudo的话,hadoop   ALL= (root) NOPASSWD: /sbin/mount, (root) NOPASSWD: /bin/umount, (root) NOPASSWD: /mnt/mount, (root) NOPASSWD: /bin/rm, (root) NOPASSWD: /usr/bin/make, (root) NOPASSWD: /bin/ln, (root) NOPASSWD: /bin/sh, (root) NOPASSWD: /bin/mv, (root) NOPASSWD: /bin/chown, (root) NOPASSWD: /bin/chgrp, (root) NOPASSWD: /bin/cp, (root) NOPASSWD: /bin/chmod

然后,hadoop账号的下日常工具也要能用才行,~/.bash_profile文件需要增加一些内容。
PATH=$PATH:$HOME/bin
PATH=$PATH:$HOME/bin:/sbin:/usr/sbin/:/usr/bin:/usr/local/bin:/usr/local/python27/bin/:/home/hadoop/hadoop-2.6.0/bin
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/
export JAR_HOME=$JAVA_HOME/jre/
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAR_HOME/lib
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

添加完毕后,sourece ~/.bash_profile即可。



三、准备单台Hadoop环境

Maybe, 你可以专门准备一个Hadoop目录,比如, /home/hadoop就是你的主目录。

su - hadoop

下载hadoop 2.6.0:
cd /home/hadoop/
wget http://mirrors.hust.edu.cn/apache/hadoop/core/stable2/hadoop-2.6.0.tar.gz

tar -xzvf hadoop-2.6.0.tar.gz

修改配置文件:
cd /home/hadoop/hadoop-2.6.0/etc/hadoop

hadoop-env.sh

# The java implementation to use.
export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/

yarn-env.sh
[hadoop@iZ94cjwg86gZ hadoop]$ cat yarn-env.sh |grep -i java

# some Java parameters
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64

hdfs-site.xml

 
  dfs.namenode.secondary.http-address
  iZ94cjwg86gZ:9001
 

  
   dfs.namenode.name.dir
   file:/home/hadoop/hadoop-2.6.0/dfs/name
 

 
  dfs.datanode.data.dir
  file:/home/hadoop/hadoop-2.6.0/dfs/data
  

 
  dfs.replication
  3
 

 
  dfs.webhdfs.enabled
  true
 



mapred-site.xml
[hadoop@iZ94cjwg86gZ hadoop]$ cat mapred-site.xml






  
   mapreduce.framework.name
   yarn
 



     也许,你想知道这些配置项的意思。 ok, 我的回答是:管他呢!(其实,我也不知道,没有关系,慢慢来吧)

ok, 就这样,我们的第一台机器就准备好了。



四、准备Hadoop集群环境


        剩下的,就是靠云计算的便捷了;

        阿里云ECS可以通过打快照的方式,将我们刚才做的工作做成自定义镜像,无需在其他机器上重复做了。How amazing!!!

        我们进入下一个环节,集群环境准备:

        首先,我利用这个新制作的镜像,重新购买了两台机器。然后,分别进入后,发现,god, 确实啥都有了!!kickstart装机系统可以out了。科技改变生活。

        ok, Anyway, Now, 我们拥有了三台ECS。一个月大概100块吧。这年头,买个苹果都要2块,当然,如果是个苹果手表呢,100块体验云计算多划算~~~~


        我们聊到了3台阿里云ECS部署,单机部署已经完成了,现在剩下的,就是集群部署了。


部署集群,主要是三点:

1、 SSH免登方案


Master机器ip1,我们进入hadoop账号:

ssh-keygen

ssh-copy-id -i ~/.ssh/id_rsa.pub   ip1
ssh-copy-id -i ~/.ssh/id_rsa.pub   ip2


2、 Host配置方案:


Master机器IP1:

[hadoop@iZ94cjwg86gZ ~]$ cat /etc/hosts
127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
ip1                iZ94cjwg86gZ
ip2                iZ94eg0rzu5Z
ip3                iZ94tmf2zfuZ


利用pssh分发hosts文件:

[hadoop@iZ94cjwg86gZ ~]$ cat hadoop.slave.list
ip2
ip3

pscp -h /tmp/hadoop.slave.list /etc/hosts  /etc/hosts

pssh -h /tmp/hadoop.slave.list -i "cat /etc/hosts"

      





五、 启动hadoop集群


启动hadoop集群:

[hadoop@iZ94cjwg86gZ ~]$ start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
15/06/12 11:16:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [iZ94cjwg86gZ]
iZ94cjwg86gZ: starting namenode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-namenode-iZ94cjwg86gZ.out
iZ94eg0rzu5Z: starting datanode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-datanode-iZ94eg0rzu5Z.out
iZ94tmf2zfuZ: starting datanode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-datanode-iZ94tmf2zfuZ.out
Starting secondary namenodes [iZ94cjwg86gZ]
iZ94cjwg86gZ: starting secondarynamenode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-secondarynamenode-iZ94cjwg86gZ.out
15/06/12 11:17:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.6.0/logs/yarn-hadoop-resourcemanager-iZ94cjwg86gZ.out
iZ94eg0rzu5Z: starting nodemanager, logging to /home/hadoop/hadoop-2.6.0/logs/yarn-hadoop-nodemanager-iZ94eg0rzu5Z.out
iZ94tmf2zfuZ: starting nodemanager, logging to /home/hadoop/hadoop-2.6.0/logs/yarn-hadoop-nodemanager-iZ94tmf2zfuZ.out



检查服务是否启动成功:

[hadoop@iZ94cjwg86gZ ~]$ pssh -h hadoop.all.list -i "jps"
[1] 11:14:15 [SUCCESS] 10.116.49.32
25869 Jps
17158 NodeManager
17041 DataNode
[2] 11:14:15 [SUCCESS] 10.116.146.133
15744 DataNode
15861 NodeManager
24566 Jps
[3] 11:14:15 [SUCCESS] 10.116.52.102
13796 SecondaryNameNode
13595 NameNode
13953 ResourceManager
31596 JobHistoryServer
27148 Jps
hadoop namenode -format


格式化hadoop集群:

hadoop namenode -format


关闭hadoop集群:

从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。
$ bin/stop-all.sh 
Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).
${HADOOP_HOME}就是安装路径.


六、 验证Hadoop集群

相关步骤及命令
1.先在本地磁盘上建立两个文件file1和file2
      $ echo ”Hello world Bye world" > >~/input/file1
      $ echo ”hello hadoop bye hadoop” > >~/input/file2
2.在HDFS上建立一个input目录
       $ hadoop fs -mkdir /tmp/input
3.将file1和file2拷贝到hdfs的input目录下
       $ hadoop fs -put input/* /tmp/input
4.检查hdfs上有没有file1,file2
     $ hadoop fs -ls /tmp/input
5.执行wordcount
   hadoop jar hadoop-examples-1.0.0.jar wordcount  /tmp/input  /tmp/output
6.运行完成,查看结果
   hadoop fs -cat /output/part-r-00000