准备工作
1、准备三台虚拟机,参考:CentOS7集群环境搭建(3台)-CSDN博客
2、配置虚拟机之间免密登录,参考:CentOS7集群配置免密登录-CSDN博客
3、虚拟机分别安装jdk,参考:CentOS7集群安装JDK1.8-CSDN博客
4、下载Hadoop安装包,下载地址:链接:https://pan.baidu.com/s/1f1DmqNNFBvBDKi5beYl3Jg?pwd=6666
搭建Hadoop集群
集群部署规划
一、上传并解压Hadoop安装包
1、将hadoop3.3.4.tar.gz使用XFTP上传到opt目录下面的software文件夹下面
2、进入到Hadoop安装包路径
cd /opt/software
3、解压安装文件到/opt/moudle下面
tar -zxvf hadoop-3.3.4.tar.gz -C /opt/moudle/
4、查看是否解压成功
cd /opt/moudle
ll
5、重命名
mv hadoop-3.3.4/ hadoop
6、将Hadoop添加到环境变量
1、获取Hadoop安装路径
进入Hadoop目录下输入
pwd
#输出
opt/moudle/hadoop
2、打开/etc/profile.d/my_env.sh文件
sudo vim /etc/profile.d/my_env.sh
在profile文件末尾添加hadoop路径:(shitf+g)
#HADOOP_HOME
export HADOOP_HOME=/opt/moudle/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
3、保存后退出
esc键然后
:wq
4、分发环境变量文件
分发脚本之前配置的有可以去前面的文章看看
sudo /home/user/bin/xsync /etc/profile.d/my_env.sh
5、source 使之生效(3台节点)
[user@hadoop102 module]$ source /etc/profile.d/my_env.sh
[user@hadoop103 module]$ source /etc/profile.d/my_env.sh
[user@hadoop104 module]$ source /etc/profile.d/my_env.sh
二、配置集群
1、核心配置文件
配置core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
文件内容如下(在<configuration><configuration>中间输入):
我这样配置不知道为啥用不了(直接用的root用户)加红的地方换成root
<!-- 把多个NameNode的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property><!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/moudle/hadoop/data</value>
</property>
<!-- 配置NN故障转移的 ZK集群-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property><!-- 配置HDFS网页登录使用的静态用户为user -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>user</value>
</property><!-- 配置该user(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.user.hosts</name>
<value>*</value>
</property>
<!-- 配置该user(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.user.groups</name>
<value>*</value>
</property>
<!-- 配置该user(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.user.users</name>
<value>*</value>
</property>
2、HDFS配置文件
配置hdfs-site.xml
vim hdfs-site.xml
文件内容如下在<configuration><configuration>中间输入:
<!-- NameNode数据存储目录 --><property><name>dfs.namenode.name.dir</name><value>file://${hadoop.tmp.dir}/name</value></property><!-- DataNode数据存储目录 --><property><name>dfs.datanode.data.dir</name><value>file://${hadoop.tmp.dir}/data</value></property><!-- JournalNode数据存储目录 --><property><name>dfs.journalnode.edits.dir</name><value>${hadoop.tmp.dir}/jn</value></property><!-- 完全分布式集群名称 --><property><name>dfs.nameservices</name><value>mycluster</value></property><!-- 集群中NameNode节点都有哪些 --><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><!-- NameNode的RPC通信地址 --><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop102:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop103:8020</value></property><!-- NameNode的http通信地址 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop102:9870</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop103:9870</value></property><!-- 指定NameNode元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value></property><!-- 访问代理类:client用于确定哪个NameNode为Active --><property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><!-- 使用隔离机制时需要ssh秘钥登录--><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/user/.ssh/id_rsa</value></property>
<!-- 启用nn故障自动转移 -->
<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value>
</property> <!-- 测试环境指定HDFS副本的数量1 --><property><name>dfs.replication</name><value>3</value></property>
3、YARN配置文件
配置yarn-site.xml
vim yarn-site.xml
文件内容如下(在<configuration><configuration>中间输入):
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 启用resourcemanager ha --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 声明两台resourcemanager的地址 --><property><name>yarn.resourcemanager.cluster-id</name><value>cluster-yarn1</value></property><!--指定resourcemanager的逻辑列表--><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property>
<!-- ========== rm1的配置 ========== --><!-- 指定rm1的主机名 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop102</value></property><!-- 指定rm1的web端地址 --><property><name>yarn.resourcemanager.webapp.address.rm1</name><value>hadoop102:8088</value></property><!-- 指定rm1的内部通信地址 --><property><name>yarn.resourcemanager.address.rm1</name><value>hadoop102:8032</value></property><!-- 指定AM向rm1申请资源的地址 --><property><name>yarn.resourcemanager.scheduler.address.rm1</name> <value>hadoop102:8030</value></property><!-- 指定供NM连接的地址 --> <property><name>yarn.resourcemanager.resource-tracker.address.rm1</name><value>hadoop102:8031</value></property><!-- ========== rm2的配置 ========== --><!-- 指定rm2的主机名 --><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop103</value></property><property><name>yarn.resourcemanager.webapp.address.rm2</name><value>hadoop103:8088</value></property><property><name>yarn.resourcemanager.address.rm2</name><value>hadoop103:8032</value></property><property><name>yarn.resourcemanager.scheduler.address.rm2</name><value>hadoop103:8030</value></property><property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name><value>hadoop103:8031</value></property><!-- 指定zookeeper集群的地址 --> <property><name>yarn.resourcemanager.zk-address</name><value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value></property><!-- 启用RM自动故障转移 --> <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.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单个容器允许分配的最大最小内存 --><property><name>yarn.scheduler.minimum-allocation-mb</name><value>512</value></property><property><name>yarn.scheduler.maximum-allocation-mb</name><value>4096</value></property><!-- yarn容器允许管理的物理内存大小 --><property><name>yarn.nodemanager.resource.memory-mb</name><value>4096</value></property><!-- 关闭yarn对物理内存和虚拟内存的限制检查 --><property><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value></property><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>
4、MapReduce配置文件
配置mapred-site.xml
vim mapred-site.xml
文件内容如下(在<configuration><configuration>中间输入):
<!-- 指定MapReduce程序运行在Yarn上 --><property><name>mapreduce.framework.name</name><value>yarn</value></property>
5、配置workers
vim /opt/moudle/hadoop/etc/hadoop/workers
在该文件中增加如下内容(localhost删除):
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
三、配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1、配置mapred-site.xml
vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property><name>mapreduce.jobhistory.address</name><value>hadoop102:10020</value>
</property><!-- 历史服务器web端地址 -->
<property><name>mapreduce.jobhistory.webapp.address</name><value>hadoop102:19888</value>
</property>
四、配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:
1、配置yarn-site.xml
vim yarn-site.xml
在该文件里面增加如下配置。
<!-- 开启日志聚集功能 -->
<property><name>yarn.log-aggregation-enable</name><value>true</value>
</property><!-- 设置日志聚集服务器地址 -->
<property> <name>yarn.log.server.url</name> <value>http://hadoop102:19888/jobhistory/logs</value>
</property><!-- 设置日志保留时间为7天 -->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>
五、分发Hadoop
xsync /opt/moudle/hadoop/
六、启动Hadoop-HA
1、在3个JournalNode节点上,输入以下命令启动journalnode服务
进入/opt/moudle/hadoop
hdfs --daemon start journalnode
2、在hadoop102[nn1]上,对其进行格式化,并启动
hdfs namenode -format
hdfs --daemon start namenode
3、在hadoop103[nn2]上,同步nn1的元数据信息
hdfs namenode -bootstrapStandby
4、启动hadoop103[nn2]
hdfs --daemon start namenode
5、格式化zkfc(102)
zookeeper必须先启动
zk.sh start具体参考zookeeper集群安装
hdfs zkfc -formatZK
6、在所有nn节点(102、103)启动zkfc
hdfs --daemon start zkfc
7、在所有节点上(3台),启动datanode
hdfs --daemon start datanode
8、第二次启动可以在NameNode所在节点执行start-dfs.sh启动HDFS所有进程
(这一步不用管)关闭之时,提示我权限不够,我直接用root用户操作,然后在hadoop-env.sh中加入以下几行
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_JOURNALNODE_USER="root"
export HDFS_ZKFC_USER="root"
在yarn-env.sh中加入了以下几行 :然后分发给三台机器
export YARN_NODEMANAGER_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
start-dfs.sh
stop-dfs.sh
9、在ResourceMamager所在节点执行start-yarn.sh 启动yarn所有进程
start-yarn.sh
stop-yarn.sh
10、部署完成可以通过start-all.sh和stop-all.sh控制Hadoop-HA所有节点的启停
start-all.sh
stop-all.sh
Hadoop群起脚本
1、在/home/user/bin目录下创建hdp.sh
2、写入以下内容
#!/bin/bash
if [ $# -lt 1 ]
thenecho "No Args Input..."exit ;
fi
case $1 in
"start")echo " =================== 启动 hadoop集群 ==================="echo " --------------- 启动 hdfs 和 yarn ---------------"ssh hadoop102 "/opt/moudle/hadoop/sbin/start-all.sh"echo " --------------- 启动 historyserver ---------------"ssh hadoop102 "/opt/moudle/hadoop/bin/mapred --daemon start historyserver"
;;
"stop")echo " =================== 关闭 hadoop集群 ==================="echo " --------------- 关闭 historyserver ---------------"ssh hadoop102 "/opt/moudle/hadoop/bin/mapred --daemon stop historyserver"echo " --------------- 关闭 hdfs 和 yarn ---------------"ssh hadoop102 "/opt/moudle/hadoop/sbin/stop-all.sh"
;;
*)echo "Input Args Error..."
;;
esac
3、增加(+x指的是增加可以运行权限)权限
chmod +x hdp.sh
4、启动集群
hdp.sh start
查看进程
xcall.sh jps
5、关闭集群
hdp.sh stop
查看进程
xcall.sh jps
UI
http://hadoop102:9870/dfshealth.html#tab-overview
http://hadoop102:8088/clusterhttp://hadoop102:8088/cluster
至此Hadoop集群就顺利搭建完成,遇见错误可以私我,共勉~