Hadoop完全分布集群搭建及高可用搭建
一、Hadoop完全分布式搭建(Centos 7系统)
1、关闭防火墙
systemctl stop firewalld #关闭防火墙
systemctl start firewalld #开启防火墙
systemctl disable firewalld #设置开机禁用防火墙
systemctl enable firewalld #设置开机启用防火墙
systemctl status firewalld #查看防火墙状态
2、设置主机名
hostnamectl set-hostname master && bash #设置主机名为master,立即生效.
hostnamectl set-hostname worker1 && bash #设置主机名为worker1,立即生效.
hostnamectl set-hostname worker2 && bash #设置主机名为worker2,立即生效.
3、配置主机名映射hosts文件
vim /etc/hosts #进入hosts文件
192.168.10.100 master #IP地址 主机名
192.168.10.101 worker1 #IP地址 主机名
192.168.10.102 worker2 #IP地址 主机名
3、设置静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33 #进入配置IP文件
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp" #改为static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="29eb0e94-b7d2-445a-93d9-d6755d24f55a"
DEVICE="ens33"
ONBOOT="no" #改为yes
IPADDR=192.168.10.100 #设置静态IP
GATEWAY=192.168.10.2 #配置网关
DNS1=192.168.10.2 #配置DNS
systemctl restart network #重启网络服务
4、配置jdk环境变量
vim /etc/profile #进入环境变量配置文件
#添加以下内容--------------------
export JAVA_HOME=/opt/jdk1.8.0
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
#---------------------------------
source /etc/profile #使用source命令你个使配置文件生效
5、配置SSH免密登录
ssh-keygen -t rsa #在主节点使用命令,一直按回车
ssh-copy-id worker1 #将公共密钥填充到另一个节点worker1上
ssh-copy-id worker2 #将公共密钥填充到另一个节点wokrer2上
ssh worker1 #验证是否免密成功
ssh worker2 #验证是否免密成功
6、配置Hadoop环境变量
vim /etc/profile #进入环境变量配置文件
#添加以下内容--------------------
export HADOOP_HOME=/opt/hadoop3.3.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#---------------------------------
source /etc/profile #使用source使配置文件生效
7、修改Hadoop配置文件
配置文件路径在hadoop中etc文件夹
修改hadoop-env.sh
export JAVA_HOME=/usr/local/program/jdk8 #jdk文件路径
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
修改core-site.xml文件
<configuration>
<!-- 在configuration标签内添加以下内容 -->
<!-- fs.default.name已经过时了,现在一般都用fs.defaultFS-->
<!-- NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 临时文件存放位置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/app/hadoop/tmp</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<!-- namenode存放的位置,老版本是用dfs.name.dir -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/hadoop3/hdfs/name</value>
</property>
<!-- datanode存放的位置,老版本是dfs.data.dir -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/hadoop3/hdfs/data</value>
</property>
<!-- 设置副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- namenode运行在哪儿节点,默认是0.0.0.0:9870,在hadoop3.x中端口从原先的50070改为了9870 -->
<property>
<name>dfs.namenode.http-address</name>
<value>master:9870</value>
</property>
<!-- secondarynamenode(备用节点)运行在哪个节点,默认0.0.0.0:9868 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9868</value>
</property>
</configuration>
<!--------------------------------- 其它配置权限 -------------------------------------->
<!-- 关闭文件上传权限检查 -->
<property>
<name>dfs.permissions.enalbed</name>
<value>false</value>
</property>
修改yarn-site.xml
<configuration>
<!-- resourcemanager运行在哪个节点 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- nodemanager获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 关闭虚拟内存检查 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
修改mapred-site.xml
<configuration>
<!-- 设置mapreduce在yarn平台上运行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配了上面这个下面这个也得配, 不然跑mapreduce会找不到主类。MR应用程序的CLASSPATH-->
<property>
<name>mapreduce.application.classpath</name>
<value>/opt/hadoop3.3.6/share/hadoop/mapreduce/*:/opt/hadoop-3.3.6/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
修改workers
vim workers
# 删掉里面的localhost,添加以下内容,你的两个从节点的ip映射
worker1
worker2
8、分发文件
# 分发jdk,$PWD:获取当前所在目录的绝对路径
scp -r jdk1.8.0_162 root@worker1:$PWD
scp -r jdk1.8.0_162 root@worker2:$PWD
# 分发hadoop
scp -r hadoop-3.3.3 root@worker1:$PWD
scp -r hadoop-3.3.3 root@worker2:$PWD
# 分发/etc/hosts
scp /etc/hosts root@worker1:/etc/
scp /etc/hosts root@worker2:/etc/
# 分发/etc/profile
scp /etc/profile root@worker1:/etc/
scp /etc/profile root@worker2:/etc/
# 然后在两个从节点上执行 source /etc/profile
9、格式化namenode
hdfs namenode -format
10、启动集群并测试
# 启动hadoop
start-all.sh
# 查看进程
jps
主节点进程
ResourceManager
NodeManager
Jps
DataNode
SecondaryNameNode
NameNode
从节点
DataNode
NodeManager
从节点
DataNode
NodeManager
二、Hadoop安装zookeeper(Centos 7系统)
1、安装zookeeper
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
2、配置环境变量
export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZK_HOME/bin
3、更改文件名字zoo.cfg
cd conf #进入zookeep的conf文件夹
mv zoo-sample.cfg zoo.cfg #将zoo-sample.cfg改名为zoo.cfg
4、修改zoo.cfg配置文件
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\zookeeper\\data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
#server.1 = 主机ip(主机映射名):A:B
#server.2 = 主机ip(主机映射名):A:B
#server.3 = 主机ip(主机映射名):A:B
server.1 = 主机ip(主机映射名):2888:3888
server.2 = 主机ip(主机映射名):2888:3888
server.3 = 主机ip(主机映射名):2888:3888
配置文件相关说明
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
initLimit:LF初始通信时限,集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
syncLimit:LF同步通信时限,集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
clientPort:客户端连接端口,这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
autopurge.snapRetainCount:保留数量。
autopurge.purgeInterval:清理时间间隔,单位:小时。
server.N = YYY:A:B,其中N表示服务器编号,YYY表示服务器的IP地址,A为LF通信端口,表示该服务器与集群中的leader交换的信息的端口。B为选举端口,表示选举新leader时服务器间相互通信的端口(当leader挂掉时,其余服务器会相互通信,选择出新的leader)。一般来说,集群中每个服务器的A端口都是一样,每个服务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能时A端口和B端口不一样。
5、创建myid文件
#在dataDir=D:\\zookeeper\\data文件下创建myid
vim myid
#在myid中填写数字序号,序号和zoo.cfg中server序号相同
6、分发zookeeper
scp -r /opt/zookeeper/ root@worker1:/opt/
scp -r /opt/zookeeper/ root@worker2:/opt/
7、zookeeper基本命令
zkServe.sh start #开启zookeeper服务
zkServer.sh status #关闭zookeeper服务
三、Hadoop高可用搭建(Centos 7系统)
1、修改配置文件
修改core-site.xml
<configuration>
<!-- 在ha模式中指定hdfs集群的逻辑名称:把多个NameNode的地址组装成一个集群 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://my-hdfs</value>
</property>
<!-- 声明hadoop工作目录:hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/app/hadoop/tmp</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户:Root-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 指定zookeeper集群的地址:zkfc要连接的zkServer地址,用于管理hdfs集群 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,worker1:2181,worker2:2181</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<!-- 指定逻辑名称,自动寻找NameNode节点 -->
<property>
<name>dfs.nameservices</name>
<value>my-hdfs</value>
</property>
<!-- 把定义的逻辑名称指向各个namenode的别名,即集群中NameNode节点 -->
<property>
<name>dfs.ha.namenodes.my-hdfs</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.my-hdfs.nn1</name>
<value>master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hdfs.nn2</name>
<value>worker1:8020</value>
</property>
<!-- 指定namenode别名对应的IP地址即NameNode连接地址:NameNode的http通信地址-->
<property>
<name>dfs.namenode.http-address.my-hdfs.nn1</name>
<value>master:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hdfs.nn2</name>
<value>worker1:9870</value>
</property>
<!-- 配置JournalNode集群的地址,指定编辑日志的共享目录 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;worker1:8485;worker2:8485/my-hdfs</value>
</property>
<!-- 指定JouralNode节点存放编辑日志的存储路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/program/hadoop/datas/qjm</value>
</property>
<!-- namenode存放的位置,老版本是用dfs.name.dir -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/hadoop3/hdfs/name</value>
</property>
<!-- datanode存放的位置,老版本是dfs.data.dir -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/hadoop3/hdfs/data</value>
</property>
<!-- 开启自动故障转移功能: client用于确定哪个NameNode为Active -->
<property>
<name>dfs.client.failover.proxy.provider.my-hdfs</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 指定ha出现故障时的隔离方法 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<!-- 指定隔离主机的私钥路径(主备节点间相互免密钥,指定私匙地址)-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 开启自动故障转移功能 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--副本数量,默认3个-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- secondarynamenode(备用节点)运行在哪个节点,默认0.0.0.0:9868 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9868</value>
</property>
</configuration>
修改mapred-stie.xml
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配了上面这个下面这个也得配, 不然跑mapreduce会找不到主类。MR应用程序的CLASSPATH-->
<property>
<name>mapreduce.application.classpath</name>
<value>/opt/hadoop3.3.6/share/hadoop/mapreduce/*:/opt/hadoop-3.3.6/share/hadoop/mapreduce/lib/*</value>
</property>
<!-- 指定mapreduce jobhistory地址:历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- 任务历史服务器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<!-- 配置运行过的日志存放在hdfs上的存放路径 -->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/history/done</value>
</property>
<!-- 配置正在运行中的日志在hdfs上的存放路径 -->
<property>
<name>mapreudce.jobhistory.intermediate.done-dir</name>
<value>/history/done/done_intermediate</value>
</property>
<!--以下必须配置,否则运行MapReduce会提示检查是否配置-->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/program/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/program/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/program/hadoop</value>
</property>
</configuration>
修改yarn-site.xml文件
<configuration>
<!-- 开启resourcemanager(RM)高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>my-hdfs</value>
</property>
<!-- 指定RM的名字、逻辑列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>worker1</value>
</property>
<!-- YARN资源管理器(ResourceManager)的Web用户界面的地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>worker1:8088</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,worker1:2181,worker2:2181</value>
</property>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 指定resourcemanager的状态信息存储在zookeeper集群上 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 关闭虚拟内存检查 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
2、分发文件
# 分发hadoop配置好的文件
scp -r /opt/hadoop/ root@worker1:/opt/
scp -r /opt/hadoop/ root@worker2:/opt/
3、第一次启动顺序
启动zookeeper
zkServer.sh start #三个节点都要启动
zkServer.sh status #查看状态受否正常
4、启动JournalNode
hdfs --daemon start journalnode #三个节点都要启动
5、格式化namenode
hdfs namenode -format #格式化namenode,主节点格式化
#格式化前清除目录数据,data文件,name文件
6、格式化ZKFC,启动ZKFC
hdfs zkfc -formatZK #格式化ZKFC,主节点格式化
hdfs --daemon start zkfc #启动ZKFC,主节点启动
7、启动namenode
hdfs --daemon start namenode #主节点启动
8、启动副节点namenode
hdfs namenode -bootstrapStandby #副节点启动namenode,同步namenode
9、启动其他节点
start-all.sh
3、其次启动顺序
hdfs --daemon start zkfc #主节点启动
zkServer.sh start #三个节点都要启动
start-all.sh start #主节点启动
4、查看节点个数
主节点
[root@node001 hadoop]# jps
18946 QuorumPeerMain
25123 NameNode
26628 DFSZKFailoverController
26182 DataNode
27368 ResourceManager
27561 NodeManager
24666 JournalNode
27965 Jps
副节点
[root@node002 hadoop]# jps
26515 Jps
25939 NameNode
21860 QuorumPeerMain
26055 DataNode
26217 DFSZKFailoverController
26398 NodeManager
25247 JournalNode
其它节点
[root@node003 hadoop]# jps
28421 NodeManager
27783 DataNode
28727 Jps
24650 QuorumPeerMain
27583 JournalNode