Hadoop集群搭建
搭建Hadoop集群是进行大数据技术基础学习的第一步,所以,把自己搭建Hadoop集群的过程记录下来。
使用CentOS 7 64位,Hadoop2.7.7
使用的系统是Linux的CentOS7的系统版本,是在阿里镜像站(链接:https://opsx.alibaba.com/mirror)下载的。需要注意的是,用阿里的镜像,在安装好虚拟机系统后,要在root用户里执行以下三步操作。
1、mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2、wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3、运行yum makecache生成缓存
可以在阿里镜像站, 点击centos那栏右边的帮助来获取这三步操作。
具体的虚拟机安装,在这里就不介绍了。
创建Hadoop用户,一般在第一次启动虚拟机的时候,就创建了Hadoop用户了。
登陆Hadoop用户后,通过su - 命令切换到root用户中。
执行 visudo
找到 root ALL=(ALL) ALL
这行,然后在这行下面增加一行内容:hadoop ALL=(ALL) ALL
(当中的间隔为tab),如下图所示:
保存并退出,vi的插入保存退出,就不用说了吧?!
切换到Hadoop用户中去,接下来要配置ssh的免密了。
首先检验系统上有没有ssh,执行
rpm -qa | grep ssh
如果已经安装好ssh了,会有以下出现
若没有以上的信息出现,则需要安装ssh服务,执行以下两行代码(如果已经安装过ssh服务的可以跳过这一步)
sudo yum install openssh-clients
sudo yum install openssh-server
接着登陆ssh查看是否安装成功。
ssh localhost
此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。
接着执行
exit # 退出刚才的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat id_rsa.pub >> authorized_keys # 加入授权
chmod 600 ./authorized_keys # 修改文件权限
这样ssh的免密登陆就设置成功了。可以重复试一次ssh localhost,记得exit退出。
接下来,安装Java环境jdk。
sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
接着需要配置一下 JAVA_HOME 环境变量,为方便,我们在 ~/.bashrc 中进行设置
vim ~/.bashrc
在文件最后面添加如下单独一行(指向 JDK 的安装位置),并保存:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
接着还需要让该环境变量生效,执行如下代码:
source ~/.bashrc
设置好后我们来检验一下是否设置正确:
echo $JAVA_HOME # 检验变量值
java -version
$JAVA_HOME/bin/java -version # 与直接执行 java -version 一样
好了,接下来安装Hadoop。我选用的是Hadoop2.7.7是一个比较稳定的版本。
首先通过Xshell把hadoop-2.7.7.tar.gz,压缩包传到虚拟机里。通过Xshell连接虚拟机后,直接输入rz,选择文件,就可以完成上传了。连接的是Hadoop用户的话,文件直接被传送到/home/hadoop/目录下了。ls显示目录列表。
解压压缩包。执行
sudo tar -zxf ~/hadoop-2.7.7.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.7.7/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
cd /usr/local/hadoop
./bin/hadoop version
明天再写关于集群配置的具体操作步骤吧!安装Hadoop集群的时候参考的是厦门大学大数据实验室的信息(链接:http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/)。
设置IP映射
配置好一台的Hadoop后,在虚拟机选择克隆,将虚拟机克隆两份。要配置一个具有两个节点的Hadoop集群。
克隆完成后,首先咱们改变三台的主机名,便于辨识。执行
sudo vim /etc/hostname
把原来的主机名删除,第一台更名为Master,第二、三台命名为Slave1、Slave2。重启后,就可以看到更改的主机名了。
接下来,我们设置三台机子的IP映射。在每一台执行
ifconfig #查看此虚拟机的ip
查看IP,或者在虚拟机桌面的右上角,点击 应用程序——系统工具——设置——网络设置 ,点击“优先连接”右下边那个齿轮状的图标,也可以查看IP。
然后执行
sudo vim /etc/hosts
在最下边,输入三台的IP还有主机名,IP与主机名之间的Tab键。在Slave1、2上边也要执行。
配置好后需要在各个节点上执行如下命令,测试是否相互 ping 得通,如果 ping 不通,后面就无法顺利配置成功:
ping Master -c 3 # 只ping 3次,否则要按 Ctrl+c 中断
ping Slave1 -c 3
ping Slave2 -c 3
例如,我连接Master,如果能成功,就是下边的样子
继续下一步配置前,请先完成所有节点的网络配置,修改过主机名的话需重启才能生效。
SSH无密码登陆节点
这个操作是要让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上。首先生成 Master 节点的公匙,在 Master 节点的终端中执行(因为改过主机名,所以还需要删掉原有的再重新生成一次):
cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa* # 删除之前生成的公匙(如果有)
ssh-keygen -t rsa # 一直按回车就可以
让 Master 节点需能无密码 SSH 本机,在 Master 节点上执行:
cat ./id_rsa.pub >> ./authorized_keys
完成后可执行 ssh Master
验证一下(可能需要输入 yes,成功后执行 exit
返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点(有多的节点,也需要上传的别的节点上):
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件,类似于 cp 命令,不过 cp 只能在本机中拷贝。执行 scp 时会要求输入 Slave1 上 hadoop 用户的密码(hadoop),输入完成后会提示传输完毕,出现100%。
接着在 Slave1 节点上,将 ssh 公匙加入授权:
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完就可以删掉了
在Slave2节点上,也进行相同的操作。
这样,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了,可在 Master 节点上执行如下命令进行检验,如下图所示:
配置PATH变量
将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用 hadoo、hdfs 等命令了,需要在 Master 节点上进行配置。首先执行
vim ~/.bashrc
加入一行:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
如下图所示:
保存后执行 source ~/.bashrc
使配置生效。在后边的相关程序的安装过程中,要多次配置环境变量,所以能记住vim ~/.bashrc和source ~/.bashrc还是比较方便的。
配置集群/分布式环境
集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
1, 文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。
本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,只添加两行内容:Slave1、Slaver2。
2, 文件 core-site.xml 改为下面的配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
3, 文件 hdfs-site.xml,dfs.replication 一般设为 3,但我们有两个 Slave 节点,所以 dfs.replication 的值还是设为 2:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
4, 文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:
修改文件名执行
mv mapred-site.xml.template mapred-site.xml
<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>
5, 文件 yarn-site.xml:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置好后,将 Master 上的 /usr/local/Hadoop 文件夹复制到各个节点上。因为之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件。在 Master 节点上执行:
cd /usr/local
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz Slave1:/home/hadoop
scp ./hadoop.master.tar.gz Slave2:/home/hadoop
在 Slave1 、Slave2节点上分别执行下边的几条命令:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
首次启动需要先在 Master 节点执行 NameNode 的格式化:
hdfs namenode -format # 首次运行需要执行初始化,之后不需要
关闭CentOS防火墙:
CentOS系统默认开启了防火墙,在开启 Hadoop 集群之前,需要关闭集群中每个节点的防火墙。有防火墙会导致 ping 得通但 telnet 端口不通,从而导致 DataNode 启动了,但 Live datanodes 为 0 的情况。
因为,咱们使用的是CentOS7系统,需要执行:
systemctl stop firewalld.service # 关闭firewall
systemctl disable firewalld.service # 禁止firewall开机启动
这时会出现,需要认证的提示,需要输入用户的密码就行了。
接着可以启动 hadoop 了,启动需要在 Master 节点上进行:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
或者执行
start-all.sh
mr-jobhistory-daemon.sh start historyserver
都是可以开启Hadoop集群的,需要注意的是,开启Hadoop集群的时候,所有的节点都要处于开机状态。
通过命令 jps
可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程,如下图所示:
缺少任一进程都表示出错。这里,会出现IP变更,导致Hadoop集群启动不成功的问题,这就需要查看IP与/etc/hosts 里的IP映射是否一致,若不一致,更改为一致就可以了。
也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://master:50070/。如果不成功,可以通过启动日志排查原因。
至此,Hadoop集群的搭建,就是全部完成了!
执行分布式实例
请参考厦门大学大数据实验室博客,链接:http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/,在这一页的后半部分,是关于“执行分布式实例”的演示,按照做,都能做出来。关于Hadoop集群的搭建,我第一次也是参考的这里(http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/)。