本章节阐述为在指定版本环境下示例安装,其它环境可根据实际情况参考安装
一. 环境版本
软件 | 版本 | 下载地址 | 提取码 |
---|---|---|---|
centos | CentOS-7.6-x86_64 | 自行安装 | 6s86 |
java jdk | 1.8 tar.gz 格式 | 自行百度安装 百度云下载 | xfdm |
java jdk | 1.8 rpm 格式 | 自行百度安装官网下载 | iexu |
zookeeper | 3.6.3 | 下载 | – |
Hadoop | 3.2.2 | 官网下载 | – |
Hadoop | 3.2.2 | 百度云下载 | ed08 |
Hadoop 官网地址:https://hbase.apache.org/book.html#hadoop
二. 环境准备
-
这里准备 4 台服务器,环境准备 参考上期博客:环境准备
-
四台服务器分配
服务器一 服务器二 服务器三 服务器四 IP 192.168.1.131 192.168.1.132 192.168.1.133 192.168.1.134 映射主机名 n1 n2 n3 n4 集群主节点 NameNode NameNode 数据节点 DataNode DataNode DataNode DataNode 监控节点 NodeManager NodeManager NodeManager NodeManager Yarn集群主控节点 ResourceManager ResourceManager 负责NameNode信息同步 JournalNode JournalNode JournalNode DFSZKFConler DFSZKFConler zookeeper zk0 zk1 zk2 zk3 NameNode 和 SecondaryNameNode 不要安装在同一台服务器
ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台机器上。4台服务器 /etc/hosts 均需配置以下信息
192.168.1.131 n1
192.168.1.132 n2
192.168.1.133 n3
192.168.1.134 n44台主机名改为对应 n1、n2、n3、n4
三. 创建用户
- 创建 isi 程序用户, 创建 \u01 文件夹,授权给 isi 用户
参考上期博客:创建用户
四. 上传解压
-
使用isi用户登录 n1服务器
su isi
-
切换到 /u01 文件夹下,上传 hadoop-3.2.2.tar.gz,这里使用在线下载
cd /u01 wget https://downloads.apache.org/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz tar zxvf hadoop-3.2.2.tar.gz
五. hadoop环境配置(n1)
-
切换root用户
su root
-
将以下hadoop配置写入/etc/profile中
# hadoop export HADOOP_HOME=/u01/hadoop-3.2.2 export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
-
应用刷新 profile
srouce /etc/profile
-
测试是否配置成功。
六. hadoop相关配置文件
-
创建文件夹
su isi cd /u01/hadoop-3.2.2 mkdir logs mkdir data
-
修改 hadoop-3.2.2/etc/hadoop/hadoop-env.sh,取消并修改添加export JAVA_HOME=,使其值为我们解压出jdk的位置
vi etc/hadoop/hadoop-env.sh
# 安装的java目录 export JAVA_HOME=/usr/local/java/jdk1.8.0_141 # 文件最后追加 export HDFS_NAMENODE_USER=isi export HDFS_DATANODE_USER=isi export HDFS_SECONDARYNAMENODE_USER=isi export YARN_RESOURCEMANAGER_USER=isi export YARN_NODEMANAGER_USER=isi
-
修改 hadoop-3.2.2/etc/hadoop/core-site.xml
vi etc/hadoop/core-site.xml
#添加以下内容, n1是 namenode 节点的IP映射
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://casic</value> <description>逻辑名称,必须与hdfs-site.xml中的dfs.nameservices值保持一致</description> </property> <property> <name>hadoop.tmp.dir</name> <value>/u01/hadoop-3.2.2/data</value> <description>namenode上本地的hadoop临时文件夹</description> </property> <! -- <property> <name>hadoop.http.staticuser.user</name> <value>isi</value> <description>默认用户</description> </property> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> <description></description> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> <description></description> </property> -- > <property> <name>io.file.buffer.size</name> <value>131072</value> <description>读写文件的buffer大小为:128K</description> </property> <property> <name>ha.zookeeper.quorum</name> <value>n1:2181,n2:2181,n3:2181,n4:2181</value> <description>zookeeper地址</description> </property> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>10000</value> <description>hadoop链接zookeeper的超时时长设置为10s</description> </property> </configuration>
-
修改hadoop-3.2.2/etc/hadoop/hdfs-site.xml
vi etc/hadoop/hdfs-site.xml
#添加以下内容
<configuration> <property> <name>dfs.replication</name> <value>2</value> <description>Hadoop中每一个block的备份数</description> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- 存储路径 --> <property> <name>dfs.namenode.name.dir</name> <value>/u01/hadoop-3.2.2/data/dfs/name</value> <description>namenode上存储hdfs名字空间元数据目录</description> </property> <property> <name>dfs.datanode.data.dir</name> <value>/u01/hadoop-3.2.2/data/dfs/data</value> <description>datanode上数据块的物理存储位置</description> </property> <!-- <property> <name>dfs.namenode.secondary.http-address</name> <value>n1:9869</value> <description></description> </property> --> <!--指定hdfs的nameservice为 casic ,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>casic</value> <description>指定hdfs的nameservice,需要和core-site.xml中保持一致</description> </property> <property> <name>dfs.ha.namenodes.casic</name> <value>nn1,nn2</value> <description>casic为集群的逻辑名称,映射两个namenode逻辑名</description> </property> <!-- RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.casic.nn1</name> <value>n1:8020</value> <description>namenode1的RPC通信地址</description> </property> <property> <name>dfs.namenode.rpc-address.casic.nn2</name> <value>n2:8020</value> <description>namenode2的RPC通信地址</description> </property> <!-- http通信地址 --> <property> <name>dfs.namenode.http-address.casic.nn1</name> <value>n1:50070</value> <description>namenode1的http通信地址</description> </property> <property> <name>dfs.namenode.http-address.casic.nn2</name> <value>n2:50070</value> <description>namenode2的http通信地址</description> </property> <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://n1:8485;n2:8485;n3:8485/casic</value> <description>指定NameNode的edits元数据的共享存储位置(JournalNode列表)</description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/u01/hadoop-3.2.2/data/journaldata</value> <description>指定JournalNode在本地磁盘存放数据的位置</description> </property> <!-- 容错 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>开启NameNode故障自动切换</description> </property> <property> <name>dfs.client.failover.proxy.provider.gky</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>失败后自动切换的实现方式</description> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/u01/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
-
修改hadoop-3.2.2/etc/hadoop/mapred-site.xml
vi etc/hadoop/mapred-site.xml
#添加以下内容
<configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>job执行框架: local, classic or yarn</description> </property> <!-- <property> <name>mapreduce.application.classpath</name> <value>/u01/hadoop-3.2.2/etc/hadoop:/u01/hadoop-3.2.2/share/hadoop/common/lib/*:/u01/hadoop-3.2.2/share/hadoop/common/*:/u01/hadoop-3.2.2/share/hadoop/hdfs/*:/u01/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/u01/hadoop-3.2.2/share/hadoop/mapreduce/*:/u01/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/u01/hadoop-3.2.2/share/hadoop/yarn/*:/u01/hadoop-3.2.2/share/hadoop/yarn/lib/*</value> </property> --> <property> <name>mapreduce.jobhistory.address</name> <value>n1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>n1:19888</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/u01/hadoop-3.2.2</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/u01/hadoop-3.2.2</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/u01/hadoop-3.2.2</value> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> <description>map阶段的task工作内存</description> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> <description>reduce阶段的task工作内存</description> </property> </configuration>
-
修改hadoop-3.2.2/etc/hadoop/yarn-site.xml
vi etc/hadoop/yarn-site.xml
#添加以下内容
<configuration> <!-- Site specific YARN configuration properties --> <!--启用resourcemanager ha--> <!--是否开启RM ha,默认是开启的--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> <description>开启resourcemanager高可用</description> </property> <!--声明两台resourcemanager的cluster ID --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrcasic</value> <description>指定yarn集群中的id</description> </property> <!-- 指定resourcemanager的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> <description>指定resourcemanager的名字</description> </property> <!-- 分别指定resourcemanager的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>n3</value> <description>设置rm1的名字</description> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>n4</value> <description>设置rm2的名字</description> </property> <!--如果不添加以下内容的话运行mapreduce的时候会出现问题。这里怀疑是AM和RM通信有问题;一台是备RM,一台活动的RM,在YARN内部,当MR去活动的RM为任务获取资源的时候没问题,但是去备RM获取时就会出现这个问题。--> <property> <name>yarn.resourcemanager.address.rm1</name> <value>n3:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>n3:8030</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>n3:8088</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>n3:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm1</name> <value>n3:8033</value> </property> <property> <name>yarn.resourcemanager.ha.admin.address.rm1</name> <value>n3:23142</value> </property> <property> <name>yarn.resourcemanager.address.rm2</name> <value>n4:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>n4:8030</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>n4:8088</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>n4:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm2</name> <value>n4:8033</value> </property> <property> <name>yarn.resourcemanager.ha.admin.address.rm2</name> <value>n4:23142</value> </property> <!--启用自动恢复,当任务进行一半,rm坏掉,就要启动自动恢复,默认是false--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面。--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- zookeeper 地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>n1:2181,n2:2181,n3:2181,n4:2181</value> <description>指定zk集群地址</description> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> <description>运行mapreduce程序必须配置的附属服务</description> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/u01/hadoop-3.2.2/tmpdata/yarn/local</value> <description>nodemanager本地存储目录</description> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/u01/hadoop-3.2.2/tmpdata/yarn/log</value> <description>nodemanager本地日志目录</description> </property> </configuration>
-
修改集群下的 hadoop-3.2.2/etc/hadoop/workers 文件
vi etc/hadoop/workers
#添加以下内容
n1 n2 n3 n4
七. 分发其它节点
- 分发 n1 中的 Hadoop 到 n2、n3、n4
scp -r /u01/hadoop-3.2.2 n2:/u01/ scp -r /u01/hadoop-3.2.2 n3:/u01/ scp -r /u01/hadoop-3.2.2 n4:/u01/
- 修改n3 节点, yarn-site.xml 上添加 HA id
<property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value> </property>
- 修改n4 节点, yarn-site.xml 上添加 HA id
<property> <name>yarn.resourcemanager.ha.id</name> <value>rm2</value> </property>
八. 启动hadoop和测试
-
启动 zookeeper
启动 所有 zookeeper 节点/bin/zkServer.sh start conf/zoo.cfg
-
启动每个 journalnode
在 (n1、n2、n3 )journalnode节点用如下命令启动journalnode./sbin/hadoop-daemon.sh start journalnode
-
在( n1) 格式化NameNode,使用start-all开启所有进程,并且使用jps查看进程情况。
./bin/hdfs namenode -format
如果出现 has been successfully formatted. 则表示格式化成功
如果出现 Retrying connect to server: n2/192.168.1.132:8485. Already tried 0 time(s)
执行以下命令,启动集群再执行格式化命令./sbin/start-dfs.sh ./bin/hdfs namenode -format
激活第一个启动 n1 为 active 节点
./bin/hdfs --daemon start namenode
-
在另一个namenode ( n2) 同步 主namenode
./bin/hdfs namenode -bootstrapStandby ./sbin/start-dfs.sh
-
在 (n1) 格式 zkfc
./bin/hdfs zkfc -formatZK
-
在 (n1) 启动 yarn
./sbin/start-yarn.sh
-
在 (n1) 启动历史日志服务器
./bin/mapred --daemon start historyserver
-
在 (n1、n2) 启动httpfs服务
powershell ./bin/hdfs --daemon start httpfs
补充:如果想单独启动zkfc使用以下命令
powershell ./bin/hdfs --daemon start zkfc
-
使用 jps 查看服务
n1
n2
n3
n4
-
查看集群界面
浏览器访问:http://n1:50070
此时看到四个节点状态正常
n1 为 active 状态 -
强制节点变为active(手动故障转移
如果两个 namenode 都为 standby 状态
这时可以先强制手动是其中一个节点变为active./bin/hdfs haadmin -transitionToActive nn1 --forcemanual
-
其它界面信息
浏览器访问:http://n2:8042