Hadoop2.X64 分布式安装指南
1 前言
Hadoop 安装有如下三种方式:
单机模式:安装简单,几乎不用作任何配置,但仅限于调试用途;
伪分布模式:在单节点上同时启动 NameNode、DataNode、JobTracker、TaskTracker、Secondary Namenode 等 5 个进程,模拟分布式运行的各个节点;
完全分布式模式:正常的 Hadoop 集群,由多个各司其职的节点构成。
2 系统需求
以下说明 Hadoop 2.7.2 安装的基本需求环境。
2.1 系统硬件
Intel x86_64 PC 机器,主机安装 VMware-workstation9.0,虚拟化安装 3 台虚拟机,虚拟机网络采用 NAT 方式。
master 192.168.100.10 内存 2.0G 硬盘 40G
slave1 192.168.100.20 内存 1.0G 硬盘 40G
slave2 192.168.100.30 内存 1.0G 硬盘 40G
网关 192.168.100.2 VMNet8:192.168.100.1
2.2 系统软件
操作系统:CentOS 6.5 x64 版本
指令:
YARN——Resource Manager,NodeManager
HDFS——NameNode,DataNode,SecendryNameNode
3 准备环境
3.1 关闭防火墙
暂时关闭:
service iptables stop
service ip6tables stop
永久关闭(关闭其自启动):
chkconfig iptables off
chkconfig ip6tables off
查看指令:
service iptables status
设置规则:iptables -L
3.2 关闭 SELinux(系统安全模式,不利于部分操作需关闭)
用下面命令执行,并修改内容如下所示:
vi /etc/sysconfig/selinux
SELINUX=enforcing修改为:SELINUX=disabled
3.3 配置节点IP地址(单机配置)
vi/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:54:18:A8
TYPE=Ethernet
UUID=bddbf7e2-09c1-4c04-a34e-95d22b0a1c88
ONBOOT=yes
NM_CONTROLLED=yes
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=192.168.100.10
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
设置完毕后 运行如下命令 重启 linux 的网络,使新配置的 ip 生效
sudo /etc/init.d/networkrestart
再次运行 ipconfig 确认 ip 地址是否生效
3.3.1 访问外网
如需要将虚拟机访问外网,还需要配置 DNS
修改对应网卡的 DNS 的配置文件
# vi /etc/resolv.conf
修改以下内容
nameserver 180.76.76.76
nameserver 114.114.114.114
3.4 创建hadoop 用户
此步骤所有节点都要操作
useradd hadoop
添加完用户之后,再设置 hadoop 用户的密码:
passwd hadoop
设置完密码,再将 hadoop 用户增加到sudoer 列表中,授予 hadoop 用户有 sudo 执行权
sudo vi /etc/sudoers,找到下面这一行。
root ALL=(ALL) ALL
在这一行的下面,再添加一行。
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
保存时由于是用户操作,可用“:wq!”强制保存。不需要更改文件修改权限。(若用权限修改,修改完后需改回原权限“440”,否则执行sudo会报错。)
3.5 用户与权限
建议将自行安装的软件统一放置在/opt 目录下,所以将/opt 修改为用户的:(-R指文件夹全部文件及子文件夹)
$ sudo chown -R hadoop:hadoop/opt
3.6 修改节点主机名(分机中也需要操作)
修改/etc/sysconfig/network 中的 hostname
sudo vi/etc/sysconfig/network
HOSTNAME=localhost.localdomain# 修改HOSTNAME=master
3.7 添加hosts 记录
修改/etc/hosts 文件
sudo vi /etc/hosts 增加(可保留文件内容追加即可。)
192.168.100.10 master
(若是存在分机,还需要进行以下配置:)
192.168.100.20 slave1
192.168.100.30 slave2
shutdown -r now #最后,重启服务器即可使用户名生效。
3.8 SSH 安装与配置
安装 SSH(在ubuntu中是apt-get)
sudo yum install ssh
启动 SSH
service sshd start
设置开机运行
chkconfig sshd on
SSH 配置:
修改 sudo vi/etc/ssh/sshd_config 将 ssh 服务的密钥认证打开 需要把被注释掉这几行打开
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile.ssh/authorized_keys
修改完毕后 重启 ssh 服务
sudo /etc/init.d/sshd restart
3.9 无密码登陆
通过建立 hadoop 用户之间相互信任(此步骤所有节点都要操作)
3.9.1设置 master无密码自登陆
切换至 hadoop 用户下执行
ssh-keygen
这条命令是生成其无密码密钥对,询问其保存路径时 直接回车采用默认路径。生成的
密钥对:id_rsa 和 id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。
然后将自己的公钥以及其他服务器 hadoop 用户的公钥放置 hadoop 宿主目录下的 .ssh/authorized_keys 中,注意 authorized_keys 默认不存在,需要手动创建,并且必须设置权限为 700。
cat ~/.ssh/id_rsa.pub >~/.ssh/authorized_keys
chmod 700~/.ssh/authorized_keys
测试,第一次登录可能需要 yes 确认,之后就可以直接登录了:
$ ssh localhost
Last login: Sat Jul 1822:57:44 2015 from localhost
对于 slave1 和 slave2,进行无密码自登陆设置,操作同上。
3.9.2设置主机-> 从机的无密码登录
$ cat ~/.ssh/id_rsa.pub | sshhadoop@slave1 'cat - >> ~/.ssh/authorized_keys'
$ cat ~/.ssh/id_rsa.pub | sshhadoop@slave2 'cat - >> ~/.ssh/authorized_keys'
测试:
[hadoop@master ~]$ sshhadoop@slave1
Last login: Sat Jul 1823:25:41 2015 from master
[hadoop@master ~]$ sshhadoop@slave2
Last login: Sat Jul 1823:25:14 2015 from master
3.9.3设置从机-> 主机的无密码登录
分别在 slave1、slave2 上执行:
$ cat ~/.ssh/id_rsa.pub | sshhadoop@master 'cat - >> ~/.ssh/authorized_keys'
测试:
[hadoop@slave1 ~]$ sshhadoop@master
Last login: Sat Jul 1823:25:41 2015 from slave1
3.10 安装 Java
(建议每台机器的 JAVA_HOME 路径信息相同)此步骤所有节点都要操作下载 jkd:
(http://www.oracle.com/technetwork/java/javase/downloads/index.html)
下载后解压至自己指定的目录如 /opt/
$ tar –zxvfjdk-8u91-linux-x64.tar.gz –C /opt/
3.10.1 配置java
则 JAVA_HOME 地址可以如下配置,在/etc/profile 中修改:
$ sudo vi / etc/profile
在末尾加入:
# set java
exportJAVA_HOME=/opt/jdk1.8.0_91
exportJRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar
exportPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
注:如果是 32 位的 Linux,请安装 jdk-7u45-linux-i586 的 32 位 Java。
添加之后执行 source /etc/profile使新增的环境变量生效
然后执行 java --version 检查 java 版本是否已经替换为 jdk1.8.0_91
3.11 设置系统时间
查看当前系统时间 date 命令
当发现虚拟机时间与外部时间不一致时,需要设置正确时间,有两种方法:
方法 1:手动设置
date -s "2007041413:58:00"
date -s "2007-04-1413:58:00"
date -s "2007/04/1413:58:00"
方法 2:通过网络授时进行设置
ntpdate time.ntp.org
ntpdate cn.ntp.org.cn
ntpdate 58.220.207.226
注意:如系统未安装 ntpdate,可以用如下命名先安装:
sudo yum -y install ntpdate
3.12 克隆虚拟机产生的问题
在使用 vmware 克隆一个系统的时候,是减少本地物理内存的一个好办法,但是在克隆完成后往往出现网络配置上的问题,以下是修改办法。
cat/etc/udev/rules.d/70-persistent-net.rules
vi /etc/sysconfig/network-scripts/ifcfg-eth0
将rules中的pci地址复制到ifcfg-eth0中
重启服务
sudo service network restart或者 sudo /etc/init.d/network restart
用ifconfig指令查看ip现状。
4 安装配置hadoop-2.7.2
4.1 Hadoop 2.7.2
从 Apache 官方可以下载到 Hadoop 2.7.2 的发布代码,或者在 CNNIC 下载:
http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.2/hadoop
-2.7.2.tar.gz
4.2 Hadoop 路径配置
$ tar xzvfhadoop-2.7.2.tar.gz –C /opt
然后建议使用软连接:
$ ln -s /opt/hadoop-2.7.2/opt/hadoop
4.3 全局配置
在/etc/profile 的末尾加入:
# set hadoop
exportHADOOP_HOME=/opt/hadoop
exportCLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
exportPATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
确保可以在任意位置执行 hadoop 命令。
然后将配置文件启用:
$ source /etc/profile
4.4 增加目录配置:
创建 Hadoop 的数据存储目录,并修改属主权限:
$ sudo mkdir /data
$ sudo chown -R hadoop:hadoop/data
$ mkdir –p /data/hadoop/dfs/
$ mkdir –p /data/hadoop/tmp
4.5 Master上操作
解压 hadoop-2.7.2.tar.gz 到/opt/hadoop进入配置文件目录
cd /opt/hadoop/etc/hadoop
在这里主要修改一下几个文件:(文件内容有些参数根据自己实际情况修改)
slaves core-site.xml hadoop-env.shhdfs-site.xml
mapred-site.xml (此文件默认不存在,需从其对应的 template 复制一份)
yarn-env.sh yarn-site.xml
4.5.1 修改slaves 文件
添加以下两行(目的:添加 slave节点,可以是主机的 ip 或者是主机名,建议写主机名,这里是dateManger的节点。slave1和slave2在分机创建后可以添加)
master
slave1
slave2
4.5.2 修改core-site.xml
添加以下内容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/data/hadoop/tmp</value>
</property>
</configuration>
4.5.3 修改hdfs-site.xml 文件
添加以下内容
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
4.5.4 修改mapred-site.xml 文件
添加以下内容
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.5.5 修改yarn-site.xml 文件
添加以下内容
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>
4.5.6 修该hadoop-env.sh 文件
修改 JAVA_HOME 值(export JAVA_HOME= /opt/jdk1.8.0_91 )
4.5.7 修改yarn-env.sh 文件
修改 JAVA_HOME 值(export JAVA_HOME= /opt/jdk1.8.0_91 )
4.5.8 传送文件至各个节点保持一致
将修改后的所有文件都复制(覆盖)到各个节点hadoop 目录
scp -r /opt/hadoop/slave1:/opt/
scp -r /opt/hadoop/slave2:/opt/
5 启动 hadoop
5.1 初始化 hadoop
切换至 hadoop 用户,执行命令:
hdfs namenode -format
初始化完之后会自动的在/data/hdoop/dfs/下面创建
/data/hdoop/dfs/name/目录
每次初始化都会对 dfs 进行操作,一般只要初始化一次就可以了,因为如果 dfs 里面有数据的话会把它给弄丢的
5.2 启动 hadoop
1.start-dfs.sh
此时master 上会产生:(两个进程)
SecondaryNameNode
NameNode
Slave 节点上会产:(一个进程)
DataNode
2.start-yarn.sh
此时master 上会产生:(多出来一个)
ResourceManager
NameNode
SecondaryNameNode
slave 节点上会产:
DataNode
NodeManager
访问yarn网页 :http://192.168.100.10:8088
访问hdfs网页 :http://192.168.100.10:50070
至此,hadoop 已经启动
5.3 验证 hadoop
1.用hadoop 用户执行,运行Test ——pi运算
hadoop jar/opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar pi 10 10
2.可以运行Test Case2 word count
$mkdir input
$echo ‘hello,world’ >>input/file1.in
$echo ‘hello, hadoop’>> input/file2.in
./bin/hadoop fs -mkdir -p/user/hadoop/test_wordcount/
./bin/hadoop fs –put input/user/hadoop/test_wordcount/in
$ hadoop jar/opt/hadoop/share/hadoop//mapreduce/hadoop-mapreduce-examples-2.7.2.jar
wordcount/user/hadoop/test_wordcount/in /user/hadoop/test_wordcount/out
6 常见问题
6.1 异常处理
如果发生任何启动异常,关闭进程后,需要清空数据:
$ rm -rf /data/hadoop/dfs/*
$ rm -rf /data/hadoop/tmp/*
然后重新执行格式化:
$ hdfs namenode -format
6.2 slave 节点DataNode 无法启动
我搭建了很多次,这个问题每次都出现,所以总结了一下:
① 防火墙没关 解决办法:你懂得
② 所有节点 hosts 链表不统一,或有错误解决办法:你懂得
③ 因为多次 format namenode 造成 namenode 和 datanode 的 clusterID 不一致
解决方法:
方法一:更改 slave Cluster ID 与 master 相同
修改每一个datanode上面的CID(位于dfs/data/current/VERSION文件夹中)使两者一
致
方法二:删除所有节点/data/hadoop/dfs/data/下 curren 目录 然后重新 start-dfs.sh
即可
6.3 datanode 无法启动
dataNode 无法启动是配置过程中最常见的问题,主要原因是多次 format
namenode 造成 namenode 和 datanode 的 clusterID 不一致。建议查看 datanode 上面
的 log 信 息 。 解 决 办 法 : 修 改 每 一 个 datanode 上 面 的 CID( 位 于
dfs/data/current/VERSION 文件夹中)使两者一致。
1. clusterID 不一致,namenode 的 cid 和 datanode 的 cid 不一致,导致的原因是
对 namenode 进行 format 的之后,datanode 不会进行 format,所以 datanode 里面的
cid 还是和 format 之前 namenode 的 cid 一样,解决办法是删除 datanode 里面的
dfs.datanode.data.dir 目录和 tmp 目录,然后再启动start-dfs.sh
2.即使删除 iptables 之后,仍然报Datanode denied communication with namenode:
DatanodeRegistration 错误,参考文章
http://stackoverflow.com/questions/17082789/cdh4-3exception-from-the-logs-after-s
tart-dfs-sh-datanode-and-namenode-star,可以知道需要把集群里面每个 host 对应的ip
写入/etc/hosts 文件就能解决问题。
7 常见命令
集群状态:http://192.168.100.10:8088
HDFS 状态:http://192.168.100.10:50070
查看集群状态:./bin/hdfs dfsadmin-report
查看文件块组成:./bin/hdfs fsck /-files -blocks
$sbin/hadoop-daemon.sh startnamenode # 启动 namenode
$sbin/hadoop-daemon.sh startdatanode # 启动 datanode
$sbin/yarn-daemon.sh startnodemanager #启动 nodemanager
$sbin/yarn-daemon.sh startresourcemanager # 启动resourcemanager
$sbin/yarn-daemon.shstartproxyserver #启动 web App proxy, 作用类似 jobtracker,
若 yarn-site.xml 里没有设置 yarn.web-proxy.address 的 host 和端口,或者设置了和
resourcemanager 相同的 host 和端口,则 hadoop 默认 proxyserver 和 resourcemanager 共享 host:port
$sbin/mr-jobhistory-daemon.shstart historyserver
安全模式是 hadoop 的一种保护机制,在启动时,最好是等待集群自动退出,然后进行文件操作。