Hadoop的安装与部署(分布式+高可用)
一、硬件环境
假设有4台机,IP及主机名如下:
192.168.100.105 c1 192.168.100.110 c2 192.168.100.115 c3 192.168.100.120 c4
二、软件环境
操作系统:Ubuntu Server 18.04
JDK:1.8.0
Hadoop:3.3.0/3.3.1
* 这里的ZooKeeper、Hadoop根目录都放在/home/目录下
三、部署规划
1.组件规划
* 以下是较合理的规划,但由于本文的操作部分是较早之前写好的,没按这份规划,先凑合着搭建了测试吧,熟悉后再自行调整。
组件说明:
DataNode:储存数据的节点,定时发送心跳包和数据块信息给NameNode。一般是每台机部署1个。
NameNode:与DataNode交互信息进行监控和索引数据目录。一般是部署2个节点(主、备)。
ZKFailoverController(ZKFC):主要是负责监控NameNode及选举。每个NameNode节点都会运行ZKFC服务。
JournalNode:同步主备NameNode的数据。至少要部署3个节点,必须是奇数个(3、5、7、…),因为系统最多只能容忍 (n-1)/2 个JN节点失败而不影响正常运行。
NodeManager:Yarn的节点状况监控服务。每台机都要部署。
ResourceManager:Yarn管理集群资源调度的服务,与NodeManager交互信息进行调度管理。一般是部署2个节点(主、备)。
2.目录规划
* 以下目录必须在安装Hadoop之前预先在每台机手动创建,否则启动Hadoop时会报错
四、运行环境配置
* 此步骤不能跳过,否则会出现各种报错
https://www.cnblogs.com/live41/p/15525826.html
五、安装和配置ZooKeeper
https://www.cnblogs.com/live41/p/15522363.html
六、下载安装包及配置系统环境变量
* 先登录root账号再进行以下操作
* 以下操作在每台机都要执行一次
1.下载及解压
https://downloads.apache.org/hadoop/common/
解压到/home/目录
2.创建必须的目录
* 由于ZooKeeper的所需目录在安装ZooKeeper时已创建,这里只创建Hadoop目录
cd /home/hadoop mkdir hdfs tmp cd hdfs mkdir name data journal
3.配置环境变量
vim ~/.bashrc
在末尾加入以下内容:
export HADOOP_HOME=/home/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_COMMON_HOME=/home/hadoop export HADOOP_HDFS_HOME=/home/hadoop export HADOOP_MAPRED_HOME=/home/hadoop export HADOOP_CONF_DIR=/home/hadoop/etc/hadoop export HDFS_DATANODE_USER=root export HDFS_NAMENODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_HOME=/home/hadoop export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
更新环境变量:
source ~/.bashrc
七、安装和配置Hadoop
* 在执行以下操作之前,记得要预先创建 三、2 的目录,否则启动Hadoop时会报错
* 不用在每台机操作,只需要在c1机操作,再通过scp命令同步配置文件给其它机
1.进入配置目录
cd /home/hadoop/etc/hadoop
2.编辑hadoop-env.sh
vim hadoop-env.sh
添加以下内容(如果已有,就把路径修改为对的):
export JAVA_HOME=/usr/bin/jdk1.8.0 export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
* 这里的JAVA_HOME根据你安装的路径来修改。
3.编辑yarn-env.sh
vim yarn-env.sh
添加以下内容(如果已有,就把路径修改为对的):
export JAVA_HOME=/usr/bin/jdk1.8.0
4.编辑core-site.xml
* 各属性的说明见下面附1的文章
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://ns6/</value> <!--对应hdfs-site.xml的dfs.nameservices属性--> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>c1:2181,c2:2181,c3:2181</value> </property> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>1000</value> </property> </configuration>
5.编辑hdfs-site.xml
* 各属性的说明见下面附1的文章
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/hdfs/data</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.nameservices</name> <value>ns6</value> <!--core-site.xml的fs.defaultFS使用该属性值--> </property> <property> <name>dfs.ha.namenodes.ns6</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.ns6.nn1</name> <value>c1:9000</value> </property> <property> <name>dfs.namenode.rpc-address.ns6.nn2</name> <value>c2:9000</value> </property> <property> <name>dfs.namenode.http-address.ns6.nn1</name> <value>c1:50070</value> </property> <property> <name>dfs.namenode.http-address.ns6.nn2</name> <value>c2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://c1:8485;c2:8485;c3:8485/ns6</value> <description> JournalNode的配置 格式是qjournal://host1:port1;host2:port2;host3:port3/journalID 默认端口号是8485,journalID建议使用nameservice的名称 </description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/hdfs/journal</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>HDFS的故障自动转移服务</description> </property> <property> <name>dfs.client.failover.proxy.provider.ns6</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>客户端(client)通过该类获取active NameNode</description> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> <description>隔离机制(fencing),防止主备切换时同时存在2个master的情况</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>~/.ssh/id_rsa</value> <!--/root/.ssh/id_rsa--> <description>隔离机制(fencing)使用的远程控制密钥</description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
6.编辑mapred-site.xml
* 各属性的说明见下面附1的文章
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobtracker.http.address</name> <value>c1:50030</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>c1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>c1:19888</value> </property> <property> <name>mapred.job.tracker</name> <value>http://c1:9001</value> </property> </configuration>
7.编辑yarn-site.xml
* 各属性的说明见下面附1的文章
<configuration> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yn6</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>c3</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>c4</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>c3:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>c4:8088</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>c1:2181,c2:2181,c3:2181</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> <description> ResourceManger会将应用的状态信息保存到yarn.resourcemanager.store.class配置的存储介质中, 重启后会加载这些信息,并且NodeManger会将还在运行的container信息同步到ResourceManager。 </description> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <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-aggregation.retain-seconds</name> <value>86400</value> </property> <property> <name>yarn.application.classpath</name> <value> /home/hadoop/etc/hadoop, /home/hadoop/share/hadoop/common/*, /home/hadoop/share/hadoop/common/lib/*, /home/hadoop/share/hadoop/hdfs/*, /home/hadoop/share/hadoop/hdfs/lib/*, /home/hadoop/share/hadoop/yarn/*, /home/hadoop/share/hadoop/yarn/lib/*, /home/hadoop/share/hadoop/mapreduce/* </value> </property> </configuration>
8.配置workers
vim workers
添加以下内容:
c1
c2
c3
c4
9.同步配置文件
把上面配置好的c1机的文件,通过scp同步到其它机。
cd /home/hadoop/etc/hadoop scp * c2:/home/hadoop/etc/hadoop scp * c3:/home/hadoop/etc/hadoop scp * c4:/home/hadoop/etc/hadoop
八、启动和停止Hadoop
* 只在c1机执行
1.启动JournalNode
hdfs --workers --daemon start journalnode
虽然配置了只在c1、c2、c3机运行journalnode,但用该命令时会把c4机的也运行起来
这是因为在workers文件配置了在4台机都运行。不用管,继续往下执行即可
* 另外,该命令的旧版仍能执行,只是会报警告信息,命令如下(不建议使用):
hadoop-daemons.sh start journalnode
旧版有2个相似文件:hadoop-daemon.sh和hadoop-daemons.sh,前者(无s)只执行本机的journalnode,后者(有s)执行所有机器的journalnode
2.格式化NameNode
hadoop namenode -format
格式化后同步namenode的信息文件给c2机。因为有2个NameNode节点,c1和c2
scp -r /home/hadoop/hdfs/name/current/ c2:/home/hadoop/hdfs/name/
3.格式化zkfc
hdfs zkfc -formatZK
zkfc = ZKFailoverController = ZooKeeper Failover Controller
zkfc用于监控NameNode状态信息,并进行自动切换。
4.启动HDFS和Yarn
start-dfs.sh start-yarn.sh
* 这步是最经常报错的,部分错误及解决方法见下面附2。
一般报的是以下2个错误(里面包含了解决方法):
https://www.cnblogs.com/live41/p/15464028.html
https://www.cnblogs.com/live41/p/15636229.html
只有第1次部署时需要用上面的操作,后面启动可以直接用全部启动脚本
start-all.sh
5.检查进程
jps
6.检查节点状态
hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 yarn rmadmin -getServiceState rm1 yarn rmadmin -getServiceState rm2
7.关闭Hadoop
stop-yarn.sh stop-dfs.sh
也可以直接用全部停止脚本
stop-all.sh
九、使用Hadoop
* 只在c1机执行
1.Web页面操作
2.命令操作
https://www.cnblogs.com/xiaojianblogs/p/14281445.html
附1:
1.官方文档
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
2.中文文档
core-site.xml、hdfs-site.xml、mapred-site.xml的属性详解
https://blog.csdn.net/h952520296/article/details/79993934
附2:
1.使用pdsh工具连接被拒绝
错误提示:
pdsh@connect: Connection refused
java.net.ConnectException: Call From c1/192.168.100.105 to c2:9000 failed on connection exception:
java.net.ConnectException: Connection refused;
解决方法:
https://www.cnblogs.com/live41/p/15464028.html
2.没有配置用root账号启动Hadoop
错误提示:
ERROR: Attempting to operate on hdfs namenode as root
ERROR: Attempting to operate on hdfs datanode as root
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: Attempting to operate on hdfs journalnode as root
ERROR: Attempting to operate on hdfs zkfc as root
解决方法:
https://www.cnblogs.com/live41/p/15636229.html
3.重新格式化后的IO错误
错误提示(会有多种不同提示,都可以用该方法解决):
Incompatible clusterIDs in /home/hadoop/hdfs/data
Failed to add storage directory [DISK]file
Directory /home/hadoop/hdfs/journal/ns6 is in an inconsistent state: Can't format the storage directory because the current directory is not empty.
解决方法:
在格式化之前,先把name、data、logs等目录里面的文件先清除掉。注意只是删除里面的文件,不删除目录
附3:
非高可用方式(没使用ZooKeeper)的安装步骤
https://www.cnblogs.com/live41/p/15467263.html