在搭建 hadoop 集群的过程中还是遇到很多问题的,我尽量的以初学者的口吻来写这篇文章,尽量做到详尽,当然不明白、不清楚的地方可以随时留言或找到我的联系方式与我沟通。
一、总体环境说明
操作系统: cenos 6.4 ,三台192.168.9.92、192.168.9.93、192.168.9.94
jdk版本: 1.7.0_75
hadoop版本: 2.5.2 (目的与hbase兼容)
hadoop集群3个节点,一主两从,如下:
角色 | ip | 用户 | 运行进程 |
---|---|---|---|
master | 192.168.9.92 | hadoop | JobHistoryServer,ResourceManager,NameNode,NodeManager,DataNode,Main |
slave1 | 192.168.9.93 | hadoop | NodeManager,DataNode |
slave2 | 192.168.9.94 | hadoop | NodeManager,DataNode |
二、设置环境变量
安装 hadoop 前需要提前配置好三台机器的 hostname,之间ssh无密码可登陆,Java环境的搭建,bashrc 的一些变量设置等,详细如下
2.1 设置机器hostname别名
设置别名的目的是机器间相互识别可以不用ip,配置文件中也可以不用ip,通用性上更强一些。
在 master 机器上面执行下面的命令:
1 2 3 4 5 | # 当前ssh窗口即可生效 hostname master # 每次重启以后均生效 vi /etc/sysconfig/network HOSTNAME=master |
同样,在 slave1 、slave2 机器上面执行相同的命令,只需要更改最后一句为相应的角色名称
1
| HOSTNAME=slave1
|
1
| HOSTNAME=slave2
|
添加Hosts映射关系,三台机器上面分别都执行操作 vi /etc/hosts
添加如下内容 ,之后在每台机器上面ping
一下,确保能够连接彼此。
1 2 3 | 192.168.9.92 master 192.168.9.93 slave1 192.168.9.94 slave2 |
2.2 配置 JDK 环境
下载 Java 对应的版本,地址如下jdk-7u75-linux-i586.tar_0.gz,配置环境变量即可完成java环境的配置,详情看脚本 :
1 2 3 4 5 6 7 8 9 10 | # 解压到 /opt/下面 tar -zxf jdk-7u75-linux-i586.tar_0.gz -C /opt/ # 配置java环境,最好在全局 /etc/profile 配置中修改,这样所有用户均可以使用 vi /etc/profile JAVA_HOME=/opt/jdk1.7.0_75 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME |
使修改的配置立即生效,终端中执行source /etc/profile
。
测试是否ok,执行命令which java
,若出现/opt/jdk1.7.0_75/bin/java
表示已经ok 或者 java -version
,出现java version "1.7.0_75"
也表明ok。
2.3 配置集群之间SSH无密码登陆
1、为了hadoop集群的安全与方便管理,我们要另外新建用户,并设置密码,命令如下:
1 2 | # 创建账号hadoop并赋予密码nopass.2 sudo adduser hadoop && sudo passwd hadoop |
2、给hadoop账户赋予root权限 vi /etc/sudoers
添加如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | hadoop ALL=(ALL) ALL ``` 3、配置集群各个节点之间的ssh无密码互信,也就是从master开始,ssh到master(localhost)、slave1和slave2上都不需要密码,反向ssh到master同样,互信设置需要在`hadoop`用户下执行命令如下: ``` bash ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys # 这步很重要,必须要授予读写的权限 r=4,w=2,x=1 chmod 600 ~/.ssh/authorized_keys # 拷贝授权认证公钥 scp ~/.ssh/authorized_keys hadoop@master:/home/hadoop/.ssh/ scp ~/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/ scp ~/.ssh/authorized_keys hadoop@slave2:/home/hadoop/.ssh/ |
这样就将生成的授权秘钥拷贝到了slave1和slave2的/home/hadoop/.ssh目录下,从 master 机器 ssh到 slave1 、slave2 都不再需要密码了,同理,在slave1、slave2机器上执行上面的命令即可完成slave 到master之间的无密码登录。(其实,操作完后,slave之间也是可以无密码登录的,只是不需要而已)
测试下 ,不使用密码登录即ok
1 2 3 | ssh hadoop@master ssh hadoop@slave1 ssh hadoop@slave2 |
三、Hadoop 集群的安装
hadoop 下载地址 :https://hadoop.apache.org/releases.html
hadoop 的安装其实很简单,解压完毕后,修改配置文件、环境变量就完成了安装,需要在每个节点都安装,为了写了一键安装部署脚本,执行hadoop_install.sh
后即可用启动命令进行测试,尽量做到简单方便的运维,提供的脚本如往常一样再本文最后给出,下面就一步步解释下:
1、 解压 hadoop-2.5.2.tar.gz
文件
1
| tar -zxvf hadoop-2.5.2.tar.gz -C /home/hadoop/
|
2、修改环境变量vi /home/hadoop/.bashrc
,添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | export HADOOP_HOME=$HOME/hadoop-2.5.2 export HADOOP_MAPRED_HOME=${HADOOP_HOME} export HADOOP_COMMON_HOME=${HADOOP_HOME} export HADOOP_HDFS_HOME=${HADOOP_HOME} export YARN_HOME=${HADOOP_HOME} export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HADOOP_LOG_DIR=${HADOOP_HOME}/logs export HADOOP_PID_DIR=/var/hadoop/pids # 解决启动时候的错误 export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" |
3、 修改 hadoop 文件目录中的各项配置文件 ,配置文件详细说明见
3.1、修改core-site.xml
配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <!--hadoop运行时的临时文件的目录--> <value>/home/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration> |
3.2 、修改hdfs-site.xml
,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/dfs/data</value> </property> <property> <!-- 值不应大于datanode数量 --> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration> |
备注:访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hdfs-site.xml中的dfs.webhdfs.enabled为true。
3.3 、修改mapred-site.xml
,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> </configuration> |
备注:jobhistory是Hadoop自带了一个历史服务器,记录Mapreduce历史作业。默认情况下,jobhistory没有启动,可用以下命令启动:$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver
3.4、 修改yarn-site.xml
,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <configuration> <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>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration> |
3.5、 修改两个启动命令文件 hadoop-env.sh
和 yarn-env.sh
,添加 JAVA_HOME 变量 :
1
| export JAVA_HOME=/opt/jdk1.7.0_75
|
3.6 、 修改 slaves
配置,代码如下,添加两台slaves机器:
1 2 | slave1 slave2 |
以上就是整个安装过程,下面测试下是否安装ok
四、Hadoop 集群的测试
4.1 启动 hadoop,验证页面是否ok
1 、格式化磁盘,格式化hadoop使用的文件磁盘,并不是物理上的磁盘,需要在每个节点上都执行下面的命令
1
| source $HADOOP_HOME/bin/hdfs namenode –format
|
2、 启动hadoop ,注意:只需要在 master 节点上启动即可,会自动启动slave各个节点
1 2 3 4 5 6 7 8 | # start-dfs.sh 此命令启动了namenode、secondaryNamenode以及datanode # start-yarn.sh 此命令启动了ResourceManager和NodeManager,相当于hadoop1中的jobtracker和TaskTracker $HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh # 或者使用这一个命令代替 # $HADOOP_HOME/sbin/start-all.sh |
3、 停止 hadoop , 注意:只需要在 master 节点上执行即可
1 2 3 4 5 6 7 8 9 10 | $HADOOP_HOME/sbin/stop-all.sh ``` 4、测试是否启动ok,使用java进程查看命令`jps`,终端中输入即可,看到如下内容即表示ok ``` bash 7692 ResourceManager 8428 JobHistoryServer 7348 NameNode 14874 Jps 7539 SecondaryNameNode |
5、 HTTP效果,通过浏览器查看集群运行状态,访问 http://192.168.9.92:50070/、http://192.168.9.92:8088/、http://192.168.9.92:19888/ 即可看到下图的效果
6、单独重启丢失的DataNode节点
如果某个DataNode节点Dead(由于死机或人为原因等),可以在不重启整个Hadoop服务的情况下进行单独重启。
方法如下:
在NameNode的hadoop-2.5.2/sbin目录下,执行命令启动HDFS DataNode
./hadoop-daemons.sh start datanode
./yarn-daemons.sh start nodemanager
或者单独启动NameNode节点,命令如下:
1 2 | ./hadoop-daemon.sh start namenode ./yarn-daemon.sh start resourcemanager |
上述四个命令都可以指定—config参数,后面跟hadoop的集群配置文件所在目录(即$HADOOP_HOME/etc/hadoop),大家可通过参数-h查看命令帮助信息
注意:上面命令不会影响已经启动的hdfs或yarn服务,只会把丢失节点的服务启动起来。
4.2 运行Hadoop自带的wordcount示例
1、 创建input文件
1 2 3 | cd /home/hadoop/ echo "My first hadoop example. Hello Hadoop in input. " > input ls |
2、创建用户目录,必须是 /user/用户名
1
| $HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hadoop
|
3、上传文件
1
| $HADOOP_HOME/bin/hadoop fs -put input /user/hadoop
|
4、 执行 wordcount 程序
1
| $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar wordcount /user/hadoop/input /user/hadoop/output
|
5、验证结果
1
| $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/output/part-r-00000
|
1 2 3 4 5 6 7 | Hadoop 1 My 1 example.Hello 1 first 1 hadoop 1 in 1 input. 1 |