Hadoop完全分布式安装
(注:本教程简单的使用两个节点作为集群环境: 一个作为 Master 主节点,另一个作为 Slave1 从节点。)
一、准备工作
useradd -m hadoop -s /bin/bash # 创建新用户hadoop,这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为shell。
passwd hadoop #修改密码
su root #切换到root用户下
chmod u+w /etc/sudoers #添加sudoers文件的写权限
vi /etc/sudoers #编辑sudoers文件
找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)
chmod u-w /etc/sudoers #撤销sudoers文件写权限
连接网络并切换到hadoop用户下
vi /etc/sysctl.conf #配置网络
添加:
net.ipv6.conf.all.disable_ipv6=1 #禁止IPV6
net.ipv6.conf.default.disable_ipv6=1 #禁止默认的IPV6
sysctl -p #使配置文件生效
ip addr #此时就没有IPV6网络了
sestatus #关闭SELinux 状态 current mode:enforcing
setenforce 0 #临时关闭 current mode:permissive
vi /etc/selinux/config #修改配置文件使之永久生效
修改:
SELINUX=disabled
保存并退出
sudo vi /etc/sysconfig/network #修改主机名HOSTNAME=Master(从节点应为HOSTNAME=Slave1)
ifconfig #查看节点的IP地址
sudo vi /etc/hosts #修改自己所用节点的IP映射,将主节点和从节点的IP映射全部写入,并把原来localhost的IP映射删掉
reboot -h #重启
在Slave1从节点上重复上述步骤
配置完成后,在Master节点和Slave1节点上都要执行:
ping Master -c 3
ping Slave1 -c 3 # 只ping 3次,否则要按 Ctrl+c 中断,ping命令用来测试主机之间网络的连通性;-c<完成次数>:设置完成要求回应的次数;
ping 通的话会显示 time,显示的结果如图所示:
二、SSH无密码登陆节点
在 Master 节点的终端中执行:
cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa* # 删除之前生成的公匙(如果有)
ssh-keygen -t rsa # 一直按回车就可以(添加rsa类型密码)
cat ./id_rsa.pub >> ./authorized_keys
chmod 600 authorized_keys #修改权限
sudo service sshd restart #重启sshd服务
ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ #将上公匙传输到 Slave1 节点
在 Slave1 节点的终端中执行:
mkdir ~/.ssh #mkdir命令用来创建目录。该命令创建由dirname命名的目录,如果不存在该文件夹需先创建,若已存在则忽略。
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys #将 ssh 公匙加入授权
cd ~/.ssh/ #切换到.ssh目录下
chmod 600 authorized_keys #修改权限
rm ~/id_rsa.pub # 用完就可以删掉了
如果有其他 Slave 节点,也要执行将 Master 公匙传输到 Slave 节点、在 Slave 节点上加入授权这两步。
在 Master 节点的终端中执行:
ssh Slave1 #验证在 Master 节点上能否无密码 SSH 到Slave1节点
三、安装Java JDK (Master和Slave1都要安装)
(可使用Tab键进行文件名补全以节省时间,以下略)
sudo tar -zxvf ~/downloads/jdk-7u91-linux-x64.tar.gz -C /usr/local #将jdk压缩包解压到/usr/local目录下
vi ~/.bashrc #打开.bashrc环境配置文件
在文件最后面添加如下单独两行(指向 JDK 的安装位置):
export JAVA_HOME=/usr/local/jdk1.7.0_91
export PATH=$JAVA_HOME/bin:$PATH:
保存并退出
source ~/.bashrc #使变量设置生效(source的作用是用来执行一个脚本)
echo $JAVA_HOME # 检验变量值(echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串)
java -version
$JAVA_HOME/bin/java -version #与直接执行java -version一样
如果设置正确的话,$JAVA_HOME/bin/java -version 会输出 java 的版本信息,且和 java -version 的输出结果一样,如图所示:
四、安装并配置Hadoop (在Master节点上执行)
sudo tar -zxvf ~/downloads/hadoop-2.6.1.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local #进入此目录
sudo mv hadoop-2.6.1 hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop hadoop # 修改文件权限
(用户名:用户组 文件名)
cd ./hadoop/bin/hadoop version
#检查Hadoop是否可用,成功则会显示 Hadoop 版本信息
vi ~/.bashrc #配置hadoop环境变量,添加如下内容:
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
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_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
保存并退出
source ~/.bashrc #使变量设置生效(source的作用是用来执行一个脚本)
配置集群/分布式环境
修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件
cd /usr/local/hadoop/etc/hadoop #进入配置文件所在的目录
1、修改slaves文件
vi ./slaves #修改slaves文件,将作为 DataNode 的主机名写入该文件,每行一个,因此将文件中原来的localhost删除,只添加一行内容:slave1
2、修改core-site.xml文件
vi ./core-site.xml
改为下面的配置:
3、修改hdfs-site.xml文件
vi ./hdfs-site.xml
其中变量名dfs.replication 的值一般设为 3,但我们只有一个 Slave 节点,所以 dfs.replication 的值还是设为 1:
4、修改mapred-site.xml文件
vi ./mapred-site.xml
(可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:
5、修改yarn-site.xml文件
vi ./yarn-site.xml
cd /usr/local
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
sudo tar -zcf ~/hadoop.master.tar.gz ./hadoop #先压缩再复制
cd ~
sudo scp ./hadoop.master.tar.gz Slave1:/home/hadoop
在 Slave1 节点上执行:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local #解压
sudo chown -R hadoop /usr/local/hadoop #修改权限
同样,如果有其他 Slave 节点,也要执行将 hadoop.master.tar.gz 传输到 Slave 节点、在 Slave 节点解压文件的操作。
首次启动需要先在 Master 节点执行 NameNode 的格式化:
(在/usr/local/hadoop/bin目录下)
cd /usr/local/hadoop/bin #进入该目录
hdfs namenode -format # 首次运行需要执行初始化,之后不需要
CentOS系统需要关闭防火墙
在 Master 节点上执行:
sudo service iptables stop #关闭防火墙服务
sudo chkconfig iptables off #禁止防火墙开机自启,就不用手动关闭了
ssh Slave1 #登陆Slave1节点
sudo service iptables stop #关闭防火墙服务
sudo chkconfig iptables off #禁止防火墙开机自启,就不用手动关闭了
exit #退出Slave1节点,重新回到Master节点
在/usr/local/hadoop/bin目录下启动hadoop:
cd /usr/local/hadoop/bin
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程,在 Slave 节点可以看到 DataNode 和 NodeManager 进程,如图所示:
缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。
PS:
伪分布式、分布式配置切换时的注意事项
1. 从分布式切换到伪分布式时,不要忘记修改 slaves 配置文件;
2.在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以如果集群以前能 启动,但后来启动不了,特别是 DataNode 无法启动,不妨试着删除所有节点(包括 Slave 节点)上的 /usr/local/hadoop/tmp 文件夹,再重新执行一次 hdfs namenode -format,再次启动试试。
五、运行实例
hdfs dfs -mkdir -p /user/hadoop #首先创建 HDFS 上的用户目录
将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
通过查看 DataNode 的状态(占用大小有改变)http://master:50070/,
输入文件确实复制到了 DataNode 中。接着就可以运行 MapReduce 作业了:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/
hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
可以通过 Web 界面查看任务进度 http://master:8088/cluster,在 Web 界面点击 "Tracking UI" 这一列的 History 连接,可以看到任务的运行信息。
执行完毕后的输出结果:
hdfs dfs -cat output/*
关闭 Hadoop 集群也是在 Master 节点上执行的:
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver