一.基础环境:
1.基于Centos7的服务器四台:
192.168.1.25
192.168.1.26
192.168.1.27
192.168.1.29
java环境(JDK1.8)
HADOOP版本:2.6.5
Zookeeper版本:3.4.8
Hbase版本:1.2.5
Hive版本:2.3.6
SPARK版本:2.3.0
二.搭建hadoop集群
集群分为一台主namenode,一台备用namenode,四台均为datanode,下面开始配置服务器。
1.修改服务器主机名(四台服务器)。
为了方便对集群进行管理,需要永久修改四台服务器的主机名:
hostnamectl set-hostname 修改后的名字
注意,主机名不能包含下划线。各服务器的主机名设置好之后,开始配置hosts文件:(每台服务器都要配置),增加以下内容:
192.168.1.25 hadoop1
192.168.1.26 hadoop2
192.168.1.27 hadoop3
192.168.1.34 hadoop4
2.关闭防火墙(四台服务器)。
systemctl stop firewalld.service
禁用防火墙:systemctl disable firewalld.service
查看防火墙状态firewall-cmd --state
重启 reboot
3. SSH免密登录
服务器被攻击后,集群的其中一台服务器无法免密登录,因此我删除所有公钥密钥,重新整理了一遍hadoop集群SSH免密登录。
1.首先,如果没有安装ssh的话,先安装
sudo yum install sshd或者
sudo yum install openssh-server
2.在主服务器中,执行 ssh-keygen -t rsa 命令,输入三次回车后会在隐藏文件夹~/.ssh下生成一个公钥id_rsa.pub与一个私钥id_rsa。
3.主服务器下,将自己的公钥内容复制到authorized_keys文件中,执行命令:
cat id_rsa.pub >> authorized_keys
4.登录到其它服务器,同样执行ssh-keygen -t rsa生成公钥与私钥,分别在每台服务器上执行ssh-copy-id -i hadoop1,将从服务器上的公钥内容复制到主服务器的authorized_keys中。
5.登陆到主服务器,修改隐藏文件夹.ssh与authorized_keys权限,chmod -R 700 ~/.ssh,chmod -R 600 ~/.ssh/authorized_keys,注:必须修改整两个权限分别为600与700,否则ssh无法使用,会拒绝访问。
6.登陆到主服务器,将authorized_keys文件复制到其他服务器上:
scp /root/.ssh/authorized_keys hadoop2:/root/.ssh/ #拷贝到hadoop2上
scp /root/.ssh/authorized_keys hadoop3:/root/.ssh/ #拷贝到hadoop3上
scp /root/.ssh/authorized_keys hadoop4:/root/.ssh/ #拷贝到hadoop4上
至此hadoop集群间的免密登录完成。
4.hadoop集群时间同步
1.在主服务器下查看时间服务是否启动
service ntpd status
2.如果没有启动,则执行:
service ntpd start
3.同时设置开机自启动
chkconfig ntpd on
4.编辑 /etc/ntp.conf:
将server 0,1,2,3四行命令注释掉
5.重启ntp服务
service ntpd restart
6.在其它服务器上写定时任务,每隔十分钟同步一次主服务器时间
crontab -e
*/10 * * * * /usr/sbin/ntpdate hadoop1
7.主服务器则跟随BIOS系统时间同步
修改/etc/sysconfig/ntpd,修改为SYNC_HWCLOCK=yes,最后分别在每台服务器手动同步一次即可完成。
5.配置hadoop集群
1.将下载好的hadoop.tar.gz文件放到/usr/local目录下,解压:
tar zxvf /home/hadoop/hadoop-2.6.5.tar.gz
重命名:mv hadoop-2.6.5 hadoop
2.配置hadoop环境变量(四台均需配置)
vim /etc/profile
HADOOP_HOME=/usr/local/hadoop
PATH=PATH
export HADOOP_HOME PATH
配置好后输入 source /etc/profile,使配置生效
3.修改hadoop文件内容
先进入hadoop文件目录
cd /usr/local/hadoop/etc/hadoop
修改core-site.xml(高可用模式)
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181,hadoop4:2181</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
修改hdfs-site.xml文件
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>hadoop1,hadoop2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.hadoop1</name>
<value>hadoop1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.hadoop1</name>
<value>hadoop1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.hadoop2</name>
<value>hadoop2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.hadoop2</name>
<value>hadoop2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4:8485/ns</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/app/journal</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled.ns</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.replication</name>
<value>4</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:50090</value>
</property>
<property>
<name>dfs.http.address</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>65536</value>
修改mapred-site.xml文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml文件
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<!-- 指定当前机器master188作为rm1 -->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181,hadoop4:2181</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
修改slaves文件
hadoop1
hadoop2
hadoop3
hadoop4
修改masters文件,如果没有则创建
hadoop1
6.分发节点
将主节点hadoop文件发送至其它服务器
cd /usr/local
scp -r hadoop root@hadoop2:/usr/local
scp -r hadoop root@hadoop3:/usr/local
scp -r hadoop root@hadoop4:/usr/local
7.启动hadoop集群
首先,在主服务器上格式化namenode:
hadoop namenode -format
然后启动在主服务器上启动hadoop集群
cd /usr/local/hadoop/sbin
./start-all.sh