Appearance
Hadoop3.x 高可用安装
基础配置
配置主机名
根据机器不同,设置不同的主机名,命令:
bash
$ hostnamectl set-hostname xxx配置hosts
修改所有节点的 /etc/hosts,添加以下内容
bash
xxx.xxx.xxx.xx1 hadoop01
xxx.xxx.xxx.xx2 hadoop02
xxx.xxx.xxx.xx3 hadoop03
... 更多节点以此类推配置免密
伪分布式,也必须要先生成 authorized_keys 文件!!!
注意hadoop或其他用户执行时root需要换成对应用户
bash
# 生成自己个公钥 【每个节点】
$ ssh-keygen -t rsa # 或 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 在 【第一个节点】 执行, 作用:将第一个节点自身的密钥信息加入文件中,以实现对自身的免密登陆
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 在 【除第一个节点外】 的节点执行, 作用:将执行节点的公钥发给第一个节点
$ sh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop01
# 在 【第一个节点】 执行, 作用:将完整的授权信息更新到每个节点
$ scp ~/.ssh/authorized_keys root@hadoop02:/root/.ssh
$ scp ~/.ssh/authorized_keys root@hadoop03:/root/.ssh
# scp ~/.ssh/authorized_keys root@xxxx:/root/.ssh # 更多节点以此类推
# 给authorized_keys添加权限【每个节点】
chmod 644 ~/.ssh/authorized_keys测试是否可以免密连接
bash
$ ssh root@hadoop02关闭防火墙
依次执行下列命令,最后查看防火墙状态
bash
$ systemctl stop firewalld.service # 停止firewall
$ systemctl disable firewalld.service # 禁止firewall开机启动
$ systemctl status firewalld.service # 查看firewall状态关闭selinux
修改文件 /etc/sysconfig/selinux,将 SELINUX=enforcing 改为 SELINUX=disabled。然后重启后用 sestatus 命令查看状态
bash
$ sestatus
SELinux status: disabled安装net-tools
bash
$ yum -y install net-tools
# 验证安装是否成功
$ netstat -nltp配置hadoop用户
本次安装计划在hadoop用户下,安装和使用hadoop集群 。命令如下:
bash
# 首先创建用户
$ useradd hadoop
# 配置密码
$ passwd hadoop # 方式1
$ echo "hadoop:password" | chpasswd # 方式2
# 配置sudo权限
$ vi /etc/sudoers
# 在101行左右,添加一行:
hadoop ALL=(ALL) NOPASSWD:ALL基本目录信息
bash
程序目录: /data/software
数据目录: /data/soft_data
日志目录: /data/soft_logsbash
$ mkdir -p /data/software /data/soft_data /data/soft_logs
$ chown -R hadoop: /data/software /data/soft_data /data/soft_logs时钟同步
编辑时间服务配置文件: vi /etc/ntp.conf
shell
# 此处:xxx.xxx.xxx.xxx为时钟服务器地址/域名
server xxx.xxx.xxx.xxx
fudge xxx.xxx.xxx.xxx stratum 10启动ntpd服务并设置开机启动
bash
$ service ntpd start
$ systemctl enable ntpd
$ systemctl enable ntpdate
$ systemctl is-enabled ntpdjdk
使用jdk1.8
安装zookeeper
下载、解压、改名【每个zk节点】
https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
bash
# 解压改名 这里在/data/software目录
$ tar -zxf apache-zookeeper-3.6.3-bin.tar.gz
$ mv apache-zookeeper-3.6.3-bin zookeeper建立相关的目录,存放数据和日志【每个zk节点】
bash
$ mkdir -p /data/soft_data/zookeeper/data
$ mkdir -p /data/soft_logs/zookeeper/logs为每台服务器在data目录下,生成myid文件,不同服务器myid内值不能相同。从1开始,依次增加【节点多的话,一般3个/5个节点即可】
bash
$ echo 1 > /data/soft_data/zookeeper/data/myid # 节点1
$ echo 2 > /data/soft_data/zookeeper/data/myid # 节点2
$ echo 3 > /data/soft_data/zookeeper/data/myid # 节点3修改zookeeper的配置文件,复制zoo_sample.cfg为zoo.cfg【每个zk节点】
bash
$ cd /data/software/zookeeper/conf
$ cp zoo_sample.cfg zoo.cfg
# 修改zoo.cfg,以下为配置信息
dataDir=/data/soft_data/zookeeper/data
dataLogsDir=/data/soft_logs/zookeeper/logs
# 副本数
autopurge.snapRetainCount=3
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
4lw.commands.whitelist=*配置环境变量
bash
$ cat > /etc/profile.d/zookeeper-env.sh <<"EOF"
export ZOOKEEPER_HOME=/data/software/zookeeper
export PATH=${ZOOKEEPER_HOME}/bin:$PATH
EOF
$ source /etc/profile启动关闭
bash
$ zkServer.sh start
$ zkServer.sh stop
$ zkServer.sh status安装Hadoop
https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz 【以3.2.2为例】
https://archive.apache.org/dist/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz
解压
在/data/software目录
所有配置所有节点均执行
bash
$ tar zxvf hadoop-3.2.2.tar.gz
$ mv hadoop-3.2.2 hadoop配置 HDFS
此下面的所有配置所有节点均执行
配置core-site.xml
xml
<!-- HDFS主入口,hacluster仅是作为集群的逻辑名称,可随意更改但务必与hdfs-site.xml中dfs.nameservices值保持一致 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hacluster</value>
</property>
<!-- 默认的hadoop.tmp.dir指向的是/tmp目录,将导致namenode与datanode数据全都保存在易失目录中,此处进行修改 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/soft_data/hadoop/tmp</value>
</property>
<!-- 用户角色配置,不配置此项会导致web页面报错(不能操作数据) -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<!-- zookeeper集群地址,如是集群以逗号进行分隔 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 权限配置 hadoop.proxyuser.{填写自己的用户名}.hosts-->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<!-- 可以不加,有需要再加上 -->
<!-- 解决journalnode连接不上,导致namenode启动问题 -->
<!-- 也有可能是网络的问题,参考该文章:https://blog.csdn.net/tototuzuoquan/article/details/89644127 -->
<!-- 在dev环境中出现连不上journalnode问题,添加该配置,以增加重试次数和间隔 -->
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish a server connection.</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
</property>配置hadoop-env.sh
bash
export JAVA_HOME=/data/software/java
export HDFS_NAMENODE_USER="hadoop"
export HDFS_DATANODE_USER="hadoop"
export HDFS_ZKFC_USER="hadoop"
export HDFS_JOURNALNODE_USER="hadoop"配置hdfs-site.xml
xml
<!-- 副本数配置 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 集群名称,此值在接下来的配置中将多次出现务必注意同步修改 -->
<property>
<name>dfs.nameservices</name>
<value>hacluster</value>
</property>
<!-- 所有的namenode列表,此处也只是逻辑名称,非namenode所在的主机名称 -->
<property>
<name>dfs.ha.namenodes.hacluster</name>
<value>nn1,nn2</value>
</property>
<!-- namenode之间用于RPC通信的地址,value填写namenode所在的主机地址 -->
<!-- 默认端口8020,注意hacluster与nn1要和上文的配置一致 -->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hacluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<!-- namenode的web访问地址,默认端口9870 -->
<property>
<name>dfs.namenode.http-address.hacluster.nn1</name>
<value>hadoop01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn2</name>
<value>hadoop02:9870</value>
</property>
<!-- journalnode主机地址,最少三台,默认端口8485 -->
<!-- 格式为 qjournal://jn1:port;jn2:port;jn3:port/${nameservices} -->
<!-- a shared edits dir must not be specified if HA is not enabled -->
<!-- 伪分布式时,取消该配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hacluster</value>
</property>
<!-- 故障时自动切换的实现类,照抄即可 -->
<property>
<name>dfs.client.failover.proxy.provider.hacluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 故障时相互操作方式(namenode要切换active和standby),这里我们选ssh方式 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 修改为自己用户的ssh key存放地址 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- namenode日志文件输出路径,即journalnode读取变更的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/soft_logs/hadoop/journalnode</value>
</property>
<!-- 启用自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 解决 DataXceiver error processing WRITE_BLOCK operation src -->
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
<description>
Specifies the maximum number of threads to use for transferring data
in and out of the DN.
</description>
</property>配置workers
填入所有datanode的主机名称,不能留有空格
bash
hadoop01
hadoop02
hadoop03配置环境变量
bash
$ cat > /etc/profile.d/hadoop-env.sh <<"EOF"
export HADOOP_HOME=/data/software/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
EOF
$ source /etc/profile修改进程最大文件打开数
bash
$ vi /etc/security/limits.conf
* - nofile 1000000
* - nproc 1000000首次启动集群
bash
【启动journalnode】 ——> 【格式化并启动namenode】——>【同步namenode信息】——>【格式化zk】——>【启动HDFS】启动JournalNode
所有JournalNode节点执行
bash
$ hdfs --daemon start journalnode初始化NameNode
在 【任意NameNode节点】 上执行格式化命令,出现successfully formated即为执行成功
仅在一个NameNode节点执行,不要重复执行!!!
bash
$ hdfs namenode -format出现
Unable to check if JNs are ready for formatting.bash# 删除所有节点 /data/soft_data/hadoop/journalnode/hacluster 目录下的文件 rm -rf /data/soft_data/hadoop/journalnode/hacluster/{in_use.lock,current,edits.sync}也有可能是网络问题
xml# 也有可能是网络的问题,参考该文章:https://blog.csdn.net/tototuzuoquan/article/details/89644127 # 在dev环境中出现连不上journalnode问题,添加该配置,以增加重试次数和间隔 <property> <name>ipc.client.connect.max.retries</name> <value>100</value> <description>Indicates the number of retries a client will make to establish a server connection.</description> </property> <property> <name>ipc.client.connect.retry.interval</name> <value>10000</value> <description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description> </property>
启动NameNode
在初始化的节点执行
bash
$ hdfs --daemon start namenode其他NameNode节点同步信息
伪分布式没有此步骤
在除了初始化NameNode节点外的NameNode执行
bash
$ hdfs namenode -bootstrapStandby格式化zookeeper节点
伪分布式没有此步骤
在初始化NameNode的节点执行
出现Successfully created即为成功
bash
$ hdfs zkfc -formatZKssh启动hdfs集群
在初始化NameNode的节点执行
bash
$ start-dfs.sh查看各个节点的进程
日常启停HDFS
bash
$ start-dfs.sh
$ stop-dfs.sh
# 若报错:publickey,gssapi-keyex,gssapi-with-mic,password
# 是因为ssh配置问题,需要生成~/.ssh/authorized_keys文件WEB页面查看
访问: http:///NameNode节点IP:9870 会有一个active和一个standby
配置 YARN及其HA
配置目录:/data/software/hadoop/etc/hadoop
使用yarn来管理HDFS集群的资源分配
配置hadoop-env.sh
因为Hadoop3限制必须要声明角色运行进程,所以在配置文件中加以说明
bash
export YARN_NODEMANAGER_USER="hadoop"
export YARN_RESOURCEMANAGER_USER="hadoop"配置mapred-site.xml
xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop02:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop02:19888</value>
</property>
<!-- mapred-site.xml中设置Map和Reduce任务的内存配置如下:(value中实际配置的内存需要根据自己机器内存大小及应用情况进行修改) -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1024M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx1024M</value>
</property>配置yarn-site.xml
xml
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 固定写法 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- yarn的集群id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
</property>
<!-- 启用HA -->
<!-- 伪分布式时,请设置为false,会出现 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!-- webapp的地址务必要配置,不然yarn可以启动但是无法执行map任务,大坑 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop03:8088</value>
</property>
<property>
<name>hadoop.zk.address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 持久化方式,既然启用了ZK那就把信息存储到ZK里面 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 自动检测硬件配置,视机器配置酌情开启,默认关闭 -->
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>false</value>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop02:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 配置yarn资源,要根据实际情况配置,避免各种问题-->
<!-- 每个节点可用内存,单位MB,一般为实际内存*0.8 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>true</value>
<description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
<name>yarn.nodemanager.vemem-pmem-ration</name>
<value>2.1</value>
<description>Ration between virtual memory to physical memory when setting memoery limits for containers</description>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<!-- 参考配置,暂不配置 -->
<!--
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
<value>1</value>
</property>
-->启动yarn
bash
$ start-yarn.shweb页面查看
访问: http:///ResourceManager节点IP:8088
配置 历史服务器
配置目录:/data/software/hadoop/etc/hadoop
为了查看程序的历史运行情况,需要配置一下历史服务器
配置mapred-site.xml
xml
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop02:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop02:19888</value>
</property>启动历史服务器
bash
$ mapred --daemon start historyserver
# 关闭
$ mapred --daemon stop historyserver日志聚集
配置目录:/data/software/hadoop/etc/hadoop
每个yarn节点
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上
配置yarn-site.xml
xml
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop02:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>其他
bash
# 查看集群可用空间等
hdfs dfsadmin -report
# 查看空间使用情况
hadoop fs -du -h /
# 查看namenode是否处于只读模式下
hdfs dfsadmin -safemode get