在centos7上搭建hadoop大数据平台


首先准备三台装好centos7系统的服务器

一、安装搭建java环境

1、安装方法

CentOS8上使用 yum 直接安装,环境变量自动配置好

2、查看是否已安装

看到下面结果,说明已经安装配置 jdk

[root@localhost ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

3、卸载

查看系统是否自带 jdk

rpm -qa |grep java
rpm -qa |grep jdk
rpm -qa |grep gcj

如果有输出信息,批量卸载系统自带

rpm -qa | grep java | xargs rpm -e --nodeps

如果使用 yum 安装的 jdk,请使用下面命令卸载

yum -y remove java-1.8.0-openjdk-headless.x86_64

4、安装

4.1 检查 yum 中有没有 java1.8 包

yum list java-1.8*

4.2 开始安装

yum install java-1.8.0-openjdk* -y

5、验证

[root@localhost ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

二、 Hadoop安装

1、下载

要获得发行版,请从Apache 下载镜像之一下载最新的 。

##下载好上传
rz -y
选择文件上传
##解压
tar zxvf hadoop-3.3.3.tar.gz

2、准备启动 Hadoop 集群

也可以使用centos7是自带的java环境,不过还是建议大家自己安装java,自带的java环境可以通过下面的方式找到路径。

使用ls -lrt命令,可以找到自带java的路径向下深入。
 ls -lrt /usr/bin/java
 /usr/bin/java -> /etc/alternatives/java

##当得到到一个真实的路径,一般就是了。
ls -lrt /etc/alternatives/java
 /etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin
 ## 设置为 Java 安装的根目录
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre

2.1配置Hadoop守护进程的环境

在etc/hadoop/hadoop-env.sh配置中添加PID目录以及日志目录

export HADOOP_PID_DIR =/home/zxhy/hadoop-3.3.3/pid
export HADOOP_LOG_DIR =/home/zxhy/hadoop-3.3.3/log

2.2配置系统环境变量

在/etc/profile.d中的一个新建一个简单脚本hadoop.sh,内容如下:

#如果是自己安装的java修改为自己安装的路径
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

export HADOOP_HOME=/home/zxhy/hadoop-3.3.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

2.3 配置etc/hadoop/core-site.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 名称节点 URI -->
   <property>
   	<name>fs.defaultFS</name>
   	<value>hdfs://hadoop01:19000</value>
   </property>
<!-- SequenceFiles中使用的读/写缓冲区的大小。 -->
   <property>
   	<name>io.file.buffer.size</name>
   	<value>131072</value>
   </property>
<!-- 配置HDFS网页登录使用的静态用户为root。 -->
   <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
   </property>
<!-- 文件存储目录。 -->
   <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/zxhy/hadoop-3.3.3/data/tmp</value>
   </property>
   <property>
   	<name>hadoop.proxyuser.root.hosts</name>
   	<value>*</value>
   </property>
   <property>
   	<name>hadoop.proxyuser.root.groups</name>
   	<value>*</value>
   </property>
</configuration>

2.4配置etc/hadoop/hdfs-site.xml文件

创建两个目录/home/zxhy/hadoop-3.3.3/data/name、/home/zxhy/hadoop-3.3.3/data/file用于存放日志和文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- NameNode 持久存储命名空间和事务日志的本地文件系统上的路径。 -->
  <property>
  	<name>dfs.namenode.name.dir</name>
  	<value>/home/zxhy/hadoop-3.3.3/data/name</value>
  </property>
<!-- DataNode的本地文件系统上应存储其块的路径的逗号分隔列表。 -->
  <property>
  	<name>dfs.datanode.data.dir</name>
  	<value>/home/zxhy/hadoop-3.3.3/data/file</value>
  </property>
</configuration>

2.5配置etc/hadoop/yarn-site.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
  	<name>yarn.resourcemanager.hostname</name>
  	<value>hadoop01</value>
  </property>
  <property>
  	<name>yarn.nodemanager.aux-services</name>
  	<value>mapreduce_shuffle</value>
  </property>
  <property>
  	<name>yarn.nodemanager.vmem-chech-enabled</name>
  	<value>false</value>
  </property>
  <!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
  <property>
      <name>yarn.nodemanager.pmem-check-enabled</name>
      <value>false</value>
  </property>
  <property>
      <name>yarn.nodemanager.vmem-check-enabled</name>
      <value>false</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>
  <!-- 启用自动恢复 -->
  <property>
      <name>yarn.resourcemanager.recovery.enabled</name>
      <value>true</value>
  </property>
  <!-- 启用日志聚集功能 -->
  <property>
      <name>yarn.log-aggregation-enabled</name>
      <value>true</value>
  </property>
  <!-- 设置日志聚集服务器地址 -->
  <property>
      <name>yarn.log.server.url</name>
      <value>http://hadoop01:19888?jobhistory/logs</value>
  </property>
  <!-- 设置日志保留时间为7天 -->
  <property>
      <name>yarn.log-aggregation.retain-seconds</name>
      <value>604800</value>
  </property>
</configuration>

2.6配置etc/hadoop/mapred-site.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>hadoop01:10020</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.intermediate-done-dir</name>
		<value>/home/zxhy/hadoop-3.3.3/data/jobhistory/tmp</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.done-dir</name>
		<value>/home/zxhy/hadoop-3.3.3/data/jobhistory/done</value>
	</property>
</configuration>

3、配置集群设备的ip

3.1设置无密码 ssh

为用于运行 Hadoop 的帐户建立 ssh 信任(通过无密码 ssh 或其他方式,例如 Kerberos),在每个节点上执行下面命令

#现在检查您是否可以在没有密码的情况下 ssh 到 localhost:
$ ssh localhost
#如果没有密码就无法 ssh 到 localhost,请执行以下命令:

$ ssh-keygen -t rsa -P  -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

把id_rsa.pub 文件通过scp复制到hadoop01的.ssh目录下,合并秘钥

#在第二个节点执行复制命令
scp /root/.ssh/id_rsa.pub root@hadoop01:$PWD/id_rsa.pub2
 #在第三个节点执行复制命令
scp /root/.ssh/id_rsa.pub root@hadoop01:$PWD/id_rsa.pub3
 #在第一个节点合并秘钥
cat id_rsa.pub >> authorized_keys
cat id_rsa.pub2 >> authorized_keys
cat id_rsa.pub3 >> authorized_keys
chmod 0600 ~/.ssh/authorized_keys
#然后把authorized_keys在复制到hadoop02和hadoop02上
scp authorized_keys root@hadoop02:$PWD
scp authorized_keys root@hadoop03:$PWD
#然后测试下用ssh能无密码连上其他节点不,如果不需要密码则成功。
ssh hadoop02

也可以使用命令直接复制公钥到其他服务器上

ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03

同样在其他两个机子上也执行同样的命令,就可以完成公钥的复制,这样其他两个机子就可以无密码访问其他两个服务器。

3.2设置主机的hostname

以三个节点为例,分别设置hostname为hadoop01、hadoop02、hadoop03

#修改每个机器的hostname
vi /etc/hostname
#修改为hadoop01
#修改每个机器的hosts
vi /etc/hosts
#修改为下面的ip,ip为每个节点的ip
192.168.1.251 hadoop01
192.168.1.250 hadoop02
192.168.1.249 hadoop03

3.3配置集群主机ip

列出您的etc/hadoop/workers文件中的所有工作人员主机名或 IP 地址,每行一个。帮助程序脚本(如下所述)将使用etc/hadoop/workers文件一次在多个主机上运行命令。它不用于任何基于 Java 的 Hadoop 配置。为了使用此功能,。

#修改每个机器的hostname
vi /etc/hadoop/workers
#修改为下面内容,每一行一个hostname
hadoop01
hadoop02
hadoop03

3.4设置同步命令脚本

在hadoop/bin目录下创建一个下xysnc的文件,编辑文件内容为下面内容,这个是方便服务器之间同步更改后的文件的。 使用方式是:xsync 文件/文件夹

#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if [ $pcount -lt 1 ]
then
   echo Not Enough Arguement!
   exit;
fi

#2. 遍历集群所有机器
#也可以采用:
#for host in hadoop{102..104};
for host in hadoop102 hadoop103 hadoop104
do
   echo ====================    $host    ====================
   #3. 遍历所有目录,挨个发送
   for file in $@
   do
       #4 判断文件是否存在
       if [ -e $file ]
       then
           #5. 获取父目录
           pdir=$(cd -P $(dirname $file); pwd)
           echo pdir=$pdir
           
           #6. 获取当前文件的名称
           fname=$(basename $file)
           echo fname=$fname
           
           #7. 通过ssh执行命令:在$host主机上递归创建文件夹(如果存在该文件夹)
           ssh $host "mkdir -p $pdir"
           
   		#8. 远程同步文件至$host主机的$USER用户的$pdir文件夹下
           rsync -av $pdir/$fname $USER@$host:$pdir
       else
           echo $file does not exists!
       fi
   done
done

4、启动 Hadoop 集群

要启动 Hadoop 集群,您需要同时启动 HDFS 和 YARN 集群。

#首次启动 HDFS 时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format
在指定节点上使用以下命令启动 HDFS NameNode 作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
#在每个指定节点上使用以下命令启动一个 HDFS DataNode 作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
#使用以下命令启动 YARN,在指定的 ResourceManager 上以yarn运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
#运行脚本以在每个指定主机上启动 NodeManager 作为yarn:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
#启动一个独立的 WebAppProxy 服务器。作为yarn在 WebAppProxy 服务器上运行。如果多个服务器与负载平衡一起使用,则应在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
#使用以下命令启动 MapReduce JobHistory Server,在指定服务器上以mapred身份运行:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver

#前面我们配置了etc/hadoop/workers和 ssh 可信访问,则可以使用实用程序脚本启动所有 HDFS 进程。作为
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh

5、停止 Hadoop 集群

使用以下命令停止 NameNode,在指定的 NameNode 上以hdfs运行:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
#在每个指定节点上使用以下命令停止一个 HDFS DataNode 作为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
#使用以下命令停止 YARN,在指定的 ResourceManager 上以yarn运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
#运行脚本以在每个指定主机上停止 NodeManager 作为yarn:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
#停止一个独立的 WebAppProxy 服务器。作为yarn在 WebAppProxy 服务器上运行。如果多个服务器与负载平衡一起使用,则应在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop  proxyserver
#使用以下命令停止 MapReduce JobHistory Server,在指定服务器上以mapred身份运行:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver

#前面我们配置了etc/hadoop/workers和 ssh 可信访问,则可以使用实用程序脚本启动所有 HDFS 进程。作为
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh

编写一个一键启动和停止脚本命名为myhadoop.sh,放到hadoop目录的sbin目录下。 使用方式为

#启动
./myhadoop.sh start
#停止
./myhadoop.sh stop

下面为脚本内容

#!/bin/bash

if [ $# -lt 1 ]
then
   echo "No Args Input..."
   exit ;
fi

this="${
           
    BASH_SOURCE-$0}"
bin=$(cd -P -- "$(dirname -- "${this}")" >/dev/null && pwd -P)

if [[ -n "${HADOOP_HOME}" ]]; then
 HADOOP_HOME_DIR="${HADOOP_HOME}"
else
 HADOOP_HOME_DIR="${bin}/../"
fi

case $1 in
"start")
       echo " =================== 启动 hadoop集群 ==================="

       echo " --------------- 启动 hdfs ---------------"
       ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/start-dfs.sh"
       echo " --------------- 启动 yarn ---------------"
       ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/start-yarn.sh"
       echo " --------------- 启动 historyserver ---------------"
       ssh hadoop01 "${HADOOP_HOME_DIR}/bin/mapred --daemon start historyserver"
;;
"stop")
       echo " =================== 关闭 hadoop集群 ==================="

       echo " --------------- 关闭 historyserver ---------------"
       ssh hadoop01 "${HADOOP_HOME_DIR}/bin/mapred --daemon stop historyserver"
       echo " --------------- 关闭 yarn ---------------"
       ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/stop-yarn.sh"
       echo " --------------- 关闭 hdfs ---------------"
       ssh hadoop01 "${HADOOP_HOME_DIR}/sbin/stop-dfs.sh"
;;
*)
   echo "Input Args Error..."
;;
esac

jps的集群脚本,用jps脚本查看所有的机器进程是否启动

#!/bin/bash

for host in hadoop01 hadoop02 hadoop03
do
	echo ============= $host =============
	ssh $host jps
done

因为yarn的启动需要hdfs退出安全模式后才可以,所以我们加入下面脚本到start-yarn.sh的最开始,当hdfs完全启动并且退出安全模式后,再启动yarn

while true 
do
	monitor=`hdfs dfsadmin -safemode get`
	if [[ $monitor =~ "OFF" ]]
	then
		break
	else
		echo "hdfs Safe mode is ON ,please wait。"
	fi
	sleep 5
done

6、web管理界面

先把防火墙关闭了,否侧不能访问。

#关闭防火墙。
systemctl stop firewalld.service
#永久关闭防火墙。
systemctl disable firewalld.service

按照之前的设置访问web管理界面 名称节点 http://hadoop01:9870/ ,默认 HTTP 端口为 9870。 资源管理器 http://hadoop01:8088/ ,默认 HTTP 端口为 8088。 MapReduce JobHistory 服务器 http://hadoop01:19888/,默认 HTTP 端口为 19888。

经验分享 程序员 微信小程序 职场和发展