虽然在一般的学习当中,8必用上集群,hadoop伪分布式配置已经够用,配置过程也很简单
但学hadoop不搭个集群说不过去。这里搭个hadoop集群,一边搞一边记录
说是集群,实际上只有一个master和一个slave,为了怜惜自己那一点的内存,为了不让CPU烧熟桌子
本搭建基于Hadoop 2,可适合任何 Hadoop 2.x.y 版本
安装CentOS6.4,两台
一台做Master,一台做Slave1,这里不做克隆了
在Windows使用VirtualBox安装CentOS教程
这步不必阐述,搭过虚拟机的同蟹都懂
在使用CentOS6过程中请注意,CentOS6和CentOS7的个别命令有些许不一样,如果你的是CentOS7,那么请注意有些命令间的差别
配置网络
为了虚拟机上各个节点都能互联,我们必须得配置网络,使它们使用同一个网段。
修改网络配置文件
Master节点上修改网卡配置
vi /etc//network-scripts/ifcfg-eth0
#eth0这里是我机子上的网卡名,注意查看自己机子上的网卡名
首先是改
BOOTPROTO=static
ONBOOT=yes
再然后是增加
IPADDR=192.168.100.10 #IP地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.100.2 #网关地址
DNS1=8.8.8.8 #DNS服务器地址
Slave1节点上修改网卡配置,基本和Master上的配置一样,但把IP地址改为192.168.100.11
配置联网方式
打开虚拟网络编辑器:
VMnet8(NAT模式)----子网IP设置为:192.168.100.0----NAT设置:网关改为192.168.100.2—确定----去掉使用本地DHCP服务将IP地址分配给虚拟机选项—确定
重启网卡
在Master节点和Slave1节点上重启网卡
service network restart
注:CentOS7上重启网卡的命令是
systemctl restart network
确保都重启成功,假如有一项重启失败,则证明你还有bug要修
我们先永久关闭掉Master和Slave1上的防火墙
#按顺序执行这两个命令
service iptables stop
chkconfig iptables off
CentOS7上关闭防火墙的命令
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
改主机名并配置主机名到IP地址的映射
Master上改主机名
vi /etc/sysconfig/network
修改HOSTNAME=Master
Slave1上改主机名
vi /etc/sysconfig/network
注:CentOS7上改主机名命令
vi /etc/hostname
添加HOSTNAME=Slave1
配置主机名到IP地址的映射(两个节点上都配一遍)
vi /etc/hosts
192.168.100.10 Master
192.168.100.11 Slave1
注:原来的/etc/hosts里面,只保留127.0.0.1 localhost
修改完之后我们都重启一下
reboot
测试能不能跑通,实现节点间互联
查看网络配置是否成功
ifconfig #显示的网络信息是否和我们配置的契合
Master上
ping baidu.com
ping 192.168.0.104
ping Slave1
Slave1上
ping baidu.com
ping 192.168.0.103
ping Master
如果ping不通则说明你还有bug要修
更换yum源
我们现在把两台虚拟机的默认yum源更换为国内的阿里云yum源,让下载安装及更新速度更快一些
#备份缓存
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#下载新的CentOS-Base.repo 到/etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
#添加EPEL
wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum clean all #清楚缓存
yum makecache #生成缓存
CentOS7上更换yum源,请参考这篇文章
CentOS 7的yum更换为国内的阿里云yum源
两个节点都创建hadoop用户
useradd -m hadoop -s /bin/bash # 创建新用户hadoop
passwd hadoop
visudo #为hadoop用户增加管理员权限,以避免后续遇到一系列权限问题
在root ALL=(ALL) ALL 这行下面增加
hadoop ALL=(ALL) ALL,如图所示,图中的间隔为tab
两个节点都登录hadoop用户
su hadoop #后续的操作在hadoop用户下执行
配置SSH无密码登录
一般情况下,CentOS 默认已安装了 SSH client、SSH server,我们在两个节点上打开终端执行如下命令进行检验
rpm -qa | grep ssh
如图,如果有显示openssh-server和openssh-client就证明已安装
假如没有安装,我们使用以下命令安装
sudo yum install openssh-clients
sudo yum install openssh-server
在安装 SSH client、SSH server之后,我们在Master和Slave1节点上检验是否能用ssh登录到本机
ssh localhost
如图,ssh在两个节点上均是能正常使用的,虽然每次登录时要输入密码
exit命令退出ssh连接后
我们在Master节点上设置无密码ssh登录本机
cd ~/.ssh #假如没有此目录,那么你需要ssh localhost后再执行这一步操作
rm ./id_rsa* #如果有之前瞎鼓捣生成的公钥的话,就删除,删除失败就跳过
ssh-keygen -t rsa #生成公钥,一直按回车就好
cat ./id_rsa.pub >> ./authorized_keys #让Master节点能无密码ssh本机
chmod 600 ./authorized_keys #修改文件权限为只读
检验一下是否能在Master节点上无密码ssh登录本机
ssh localhost
这时连接本机已经不需要密码了
成功了之后就使用exit命令退出ssh连接
我们已经能在Master节点上无密码ssh登录本机了
接下来虾一步
使Master节点能无密码ssh登录Slave1节点
这时我们的Master节点是能ssh连接到Slave1节点了,但每一次都得输入密码,我们设置使Master节点能无密码ssh登录Slave1节点。
在Master上
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ #在线复制公钥给Slave1
在Slave1上
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys #将Master传送过来的公匙加入授权
rm ~/id_rsa.pub # 用完删掉,过河拆桥
在Master上测试是否能无密码ssh登录到Slave1
ssh Slave1
这时已经不需要密码登录了
然后exit
两个节点上均安装Java环境
sudo yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel #使用此命令安装openjdk
查查刚才的jdk安装到哪里了
rpm -ql java-1.7.0-openjdk-devel | grep '/bin/javac'
此命令返回的路径去掉"bin/javac"就是我们jdk的安装位置,我们拿这个路径去配环境变量
像我这里的是/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.251.x86_64
vi ~/.bashrc
在文件后面加一行
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.251.x86_64
让环境变量生效
source ~/.bashrc
检验变量是否设置生效
java -version
我这里是ok了
在Master节点上安装Hadoop2
注意:是在Master节点上完成hadoop安装和配置。
下载Hadoop可以到这个网址https://mirrors.cnnic.cn/apache/hadoop/common/下载,选择版本时请选择Hadoop2.x.y版本。
下载时请下载 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。
下载时也强烈建议下载(假如有) hadoop-2.x.y.tar.gz.mds 这个文件,该文件包含了检验值可用于检查hadoop-2.x.y.tar.gz 的完整性,否则若文件发生了损坏或下载不完整,Hadoop 将无法正常运行。(假如想知道怎么验证文件完整性,请自行百度搜索,因为我这里下载的不是hadoop-2.x.y.tar.gz.mds就不做演示了)
插一句题外话:假如嫌浏览器下载太慢,那么可以复制下载链接到迅雷打开下载,BT下载就是香。
下载好了之后我们执行解压安装
sudo tar -zxf ~/Download/hadoop-2.7.7.tar.gz -C /usr/local #注意对应自己hadoop压缩包所在的位置
cd /usr/local/
sudo mv ./hadoop-2.7.7/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限
接虾来输入以下命令来检查 Hadoop 是否安装成功,成功则会显示 Hadoop 版本信息
cd /usr/local/hadoop
./bin/hadoop version
ojbk
配置PATH变量
将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用 hadoo、hdfs 等命令了。
在 Master 节点上
vi ~/.bashrc
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
source ~/.bashrc #使配置生效
如下图所示:
配置PATH变量
保存后执行 source ~/.bashrc
使配置生效。
在Master节点上配置Hadoop2
在Master上安装hadoop之后,紧接着,我们在Master节点上配置hadoop,这里并不具体解释每个配置文件是什么意思,感兴趣的童鞋可以自行跳转链接去查。
Hadoop 默认模式为单机模式,无需进行其他配置即可运行。
如果要做Hadoop集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件:slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
这里的配置是进入相应的xml文件找到一对configuration空标签,然后替换如下内容
cd /usr/local/hadoop/etc/hadoop
修改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>
修改 hdfs-site.xml,因为只有一个分片,所以dfs.replication为1,dfs.datanode.data.dir也只有一个
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</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>
修改mapred-site.xml(实际上它默认文件名为 mapred-site.xml.template)
<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>
修改 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>
修改 slaves
将作为 DataNode 的主机名写入该文件,每行一个。
在伪分布式配置时,默认为 localhost的,因为节点即作为 NameNode 也作为 DataNode执行。
分布式配置如果让 Master 节点既作为 NameNode,也作为DataNode,就保留 localhost;如果让Master节点作为NameNode,就删掉localhost。
我这里选择删除localhost
把Master 上的 /usr/local/Hadoop 文件夹复制到Slave1节点上
假如之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件和日志文件。在 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 #在线复制文件到Slave1上
在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 的格式化,之后不需要
hdfs namenode -format
如图
开启集群
注意:CentOS系统默认开启了防火墙,在开启 Hadoop 集群之前,需要关闭集群中每个节点的防火墙。有防火墙会导致 ping 得通但 telnet 端口不通,从而导致 DataNode 启动了,但 Live datanodes 为 0 的情况。我们前面的操作中已经关闭防火墙了,如果防火墙没关闭的请关闭再开启集群。
在Master执行
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
这时可以通过jps
可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程
在Slave1节点上可以看到DataNode 和 NodeManager
如图,集群搭建成功,高兴得像只两百斤的小胖子
关闭集群也是在Master上关闭,按顺序执行命令
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver
记一个bug,有事没事不要初始化namenode玩(血泪坑)。初始化一遍就好,假如初始化多遍导致Slave1节点上datanode不能启动,那么请看看这篇博客:[Hadoop启动datanode失败,clusterId有问题
监控集群
立一个小坑,有空再补。