Hadoop集群的部署
网上很多关于hadoop集群部署的文章, 我这里重新整理下,毕竟,别人的经历,让你按照着完整走下来,总有或多或少的问题。
小技巧分享:
有些初学者喜欢在自己机器上安装虚拟机来部署hadoop,毕竟,很多同学的学习环境都是比较受限的。
我这里则直接选择了阿里云的机器,买了三台ECS作为学习环境。毕竟,最低配一个月才40多块,学习还是要稍微投入点的。
一、 基础环境准备
Windows不熟练,小主只有选择Linux了。
官方提示如下,Linux所需软件包括:
JavaTM1.5.x,必须安装,建议选择Sun公司发行的Java版本。
ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。
rsync也是需要安装的。
so, 首先选择买几台Linux服务器,然后去准备基础环境。
阿里云官网www.aliyun.com, 注册一个账号,很便捷,支持支付宝付款。这年头,如果没有支付宝,就真的奥特曼了。
购买一台ECS(当然,最便宜的一种),选择的是aliyun redhat 5.7 64.(哦,不是要买三台吗?不急,后面可以展示下云计算的威力,花点小钱,节约大把时间,何乐不为呢?)
检查这个机器的基础环境:
[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, 就这样,基础工具就这样准备好啦。
二、系统环境准备
权限问题
我们尽量要规避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 <configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>iZ94cjwg86gZ:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/home/hadoop/hadoop-2.6.0/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/hadoop/hadoop-2.6.0/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration> mapred-site.xml [hadoop@iZ94cjwg86gZ hadoop]$ cat mapred-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 也许,你想知道这些配置项的意思。 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