Hadoop3.3.1完全分布式部署

Hadoop目录

Hadoop3.3.1完全分布式部署(一)

Hadoop 是一种分析和处理大数据的软件平台,是一个用 Java 语言实现的 Apache 的开源软件框架,在大量计算机组成的集群中实现了对海量数据的分布式计算。
在这里插入图片描述

结构框架
在这里插入图片描述

推荐架构
在这里插入图片描述

1、HDFS

一个提供高可用的获取应用数据的分布式文件系统。

从字面上来看,SecondaryNameNode 很容易被当作是 NameNode 的备份节点,其实不然。可以通过下图看 HDFS 中 SecondaryNameNode 的作用。

在这里插入图片描述

NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。

fsimage - 它是在NameNode启动时对整个文件系统的快照
edit logs - 它是在NameNode启动后,对文件系统的改动序列

Secondary NameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。

  • 它定时到NameNode去获取edit logs,并更新到自己的fsimage上。
  • 一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
  • NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

一、安装

1、基础安装

$ yum install -y gcc vim wget
$ sudo yum install ssh
$ sudo yum install pdsh -y
1.1、配置JDK-18

JDK地址

安装参考

# JDK17
#wget https://download.oracle.com/java/17/archive/jdk-17_linux-x64_bin.tar.gz -P /var/opt/hadoopSoftware
# JDK19
#wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz -P /var/opt/hadoopSoftware

# JDK18(本文所选,但是需要ORACLE账号才可以下载)
tar -zxvf /var/opt/hadoopSoftware/jdk-8u361-linux-x64.tar.gz -C /var/opt/hadoopSoftware

在这里插入图片描述

配置环境变量,在profile.d下创建hadoop所需的环境变量

cat >> /etc/profile.d/my_env.sh <<Leo
# JAVA_HOME
export JAVA_HOME=/var/opt/software/jdk1.8.0_361
export PATH=\$PATH:\$JAVA_HOME/bin
Leo

使配置生效

source /etc/profile
1.2、下载并解压hadoop安装包
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz -P /var/opt/hadoopSoftware
tar -zvxf /var/opt/hadoopSoftware/hadoop-3.3.1.tar.gz -C /var/opt/hadoopSoftware

配置环境变量

cat >> /etc/profile.d/my_env.sh <<Leo
# HADOOP_HOME
export HADOOP_HOME=/var/opt/hadoopSoftware/hadoop-3.3.1
export PATH=\$PATH:\$HADOOP_HOME/bin
export PATH=\$PATH:\$HADOOP_HOME/sbin
# Hadoop run need add
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
Leo

生效

source /etc/profile
  • 查看配置的全局环境变量 echo $PATH

hadoop目录介绍

bin:和hdfs yarn mapred
sbin:启动停止相关的命令
share:一些参考

(Hadoop参考)
官网

在这里插入图片描述

本地运行模式测试 eg:
mkdir -p /var/opt/hadoopSoftware/hadoop-3.3.1/tinput
cat >> /var/opt/hadoopSoftware/hadoop-3.3.1/tinput/word.txt <<Leo
aa
bb
cc
cc
Leo

测试计算每个单词出现的次数(输入路径:tinput/ 输出路径:./timport)

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount tinput/ ./toutput

toutput]# cat part-r-00000
aa      1
bb      1
cc      2

2、完全分布式运行模式

1、概要:

前提:
1、准备三台server(关闭防火墙、静态ip、主机名)
2、安装JDK
3、安装Hadoop
4、配置环境变量
所需其他配置:
5、配置集群
6、单点启动
7、配置ssh
8、测试集群

2、编写集群分发脚本,把1~4步安装的同步到其他服务器:
mkdir -p /var/opt/hadoopSoftware/hadoopScript/bin
mkdir -p /var/opt/hadoopSoftware/hadoopScript/config

创建需要同步的服务器地址

cat /var/opt/hadoopSoftware/hadoopScript/config/hadoop_hosts
hadoop2
hadoop3
2.1、创建脚本vim /var/opt/hadoopSoftware/hadoopScript/bin/xsync,添加执行权限
#!/bin/bash

# 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Argument!
    exit;
fi

# 遍历所有的服务器
#for host in hadoop1 hadoop2 hadoop3
for host in `cat /var/opt/hadoopSoftware/hadoopScript/config/hadoop_hosts`
do
    echo =======================$host=======================
    # 遍历所有目录
    for file in $@
    do
        # 判断文件是否存在
        if [ -e $file ]
            then
                # 获取父目录名,例如有软连接他会cd到真正的数据目录
                pdir=$(cd -P $(dirname $file); pwd)
                # 获取当前文件名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file dose not exists!
        fi
    done
done

目前xsync只能同步当前目录下的文件,用法xsync bin/,如果同步根目录需要写xsync脚本的绝对路径/var/opt/hadoopSoftware/hadoopScript/bin/xsync

2.2、开始同步JDK、Hdoop、环境变量

2.2.1、开始同步(选用):

# 全局调用使用绝对路径
sudo /var/opt/hadoopSoftware/hadoopScript/bin/xsync /var/opt/hadoopSoftware
sudo /var/opt/hadoopSoftware/hadoopScript/bin/xsync /etc/profile.d/my_env.sh 
  • 注:每台服务器都需要重新刷新环境变量source /etc/profile(根据自身需求,后期可以使用ansible-playbook)

2.2.2、配置环境变量同步(本文选用如下方法):

或:如果想要应用这个脚本到全局可以进行如下环境变量设置(根据自身情况进行设置,仅参考):

cat >> /etc/profile.d/my_env.sh <<Leo
# hadoopScript_home
export HSCRIPT_HOME=/var/opt/hadoopSoftware/hadoopScript
export PATH=$PATH:$HSCRIPT_HOME/bin
Leo

同步开始:

xsync /var/opt/hadoopSoftware
xsync /etc/profile.d/my_env.sh
3、配置ssh免密

参考配置

配置hadoop1和hadoop2免密登录hadoop[1,2,3]

4、配置xml

官网参考:[Apache Hadoop 3.3.4 – Hadoop Cluster Setup]

4.1、集群部署规划如下:
hadoop1hadoop2hadoop3
HDFSNameNode
DataNode
DataNodeSecondaryNameNode
DataNode
YARNNodeManagerNodeManager
ResourceManager
NodeManager

注:NameNode、 NodeManager、 SecondaryNameNode最好放在不同的服务器上。

4.2、所需配置文件

1)默认配置文件:

默认文件名文件存放路径(cd $HADOOP_HOME)
core-default.xml$HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml
hdfs-default.xml$HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
yarn-default.xml$HADOOP_HOME/share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
mapred-default.xml$HADOOP_HOME/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

2)自定义配置文件:

文件位置$HADOOP_HOME/etc/hadoop

  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml
4.3、配置集群
1)核心配置文件
cat $HADOOP_HOME/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定NameNode地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1:8020</value>
    </property>
    
    <!-- 指定hadoop数据存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/opt/hadoopSoftware/hadoop-3.3.1/data</value>
    </property>
    
    <!-- 配置hadoop网页登录使用的静态用户为leojiang -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
</configuration>

2)HDFS配置文件
cat $HADOOP_HOME/etc/hadoop/hdfs-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>
    <!-- nn web 端访问地址 -->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop1:9870</value>
    </property>
    
    <!-- 2nn web 端访问地址 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop3</value>
    </property>
    
    <!-- datanode 地址 可以不配 -->
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:9864</value>
        <description>
            The datanode http server address and port.
        </description>
    </property>
    <!-- 如果为true(默认值),则namenode要求连接datanode的地址必须解析为主机名。如有必要,将执行反向DNS查找。所有从不可解析地址注册datanode的尝试都将被拒绝。建议保留该设置,以防止在DNS中断期间意外注册由excluded文件中hostname列出的datanode。只有在没有基础设施支持反向DNS查找的环境中,才将此设置为false。-->
    <!--
    <property>
      <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
      <value>false</value>
    </property>
    -->
    
</configuration>
3)YARN配置文件
cat $HADOOP_HOME/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定MR走shutffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- 指定ResourceManager的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop2</value>
    </property>
    
    <!-- 环境变量的继承 3.1.3需要配置HADOOP_MAPRED_HOME。3.2以上修复了就不用配置了-->
    <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_HOME,HADOOP_MAPRED_HOME</value>
    </property>
    
    
</configuration>
4)MapReduce配置文件
cat $HADOOP_HOME/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

</configuration>

修改完成后同步到所有服务器

xsync $HADOOP_HOME/etc/hadoop
5、启动整个集群
5.1、配置workers
# 注意: 不允许有任何空格、空行
vim $HADOOP_HOME/etc/hadoop/workers
hadoop1
hadoop2
hadoop3

同步文件到所有服务器

xsync $HADOOP_HOME/etc/hadoop/workers
5.2、启动集群

前提添加写权限否则会出现namenode无法启动的状况

chmod -R a+w $HADOOP_HOME

1、初始化文件系统(第一次运行,格式化集群

hadoop1 $ hdfs namenode -format

可以查看下生成的版本号

cat $HADOOP_HOME/data/dfs/name/current/VERSION

2、启动集群NameNode和DataNode守护进程:

启动:

hadoop1 $ $HADOOP_HOME/sbin/start-dfs.sh

查看启动的服务jps

3、启动ResourceManager (注意要在ResourceManager 的服务器上启动)

hadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh
5.3、页面地址:
# hdfs的NameNode
http://hadoop1:9870

# YARN的ResourceManager
http://hadoop2:8088
6、集群测试
6.1、上传文件到集群测试
# 先在hadoop上创建目录
hadoop fs -mkdir /tinput

# 上传…….txt文件
hadoop fs -put tinput/word.txt /tinput

在这里插入图片描述

6.2、上传大文件测试
hadoop fs -put ../jdk-8u361-linux-x64.tar.gz /tinput

数据在datanode下存储

# 查看datanode存储的数据可以使用如下方式还原,每一台服务器存储的都一样
cd data/dfs/data/current/BP-12……/current/finalized/subdir0/subdir0/blk……/……

# word.txt
cat blk_1073741825

# 还原 jdk-8u361-linux-x64.tar.gz
cat blk_1073741826 >>tmp.tar.gz
cat blk_1073741827 >>tmp.tar.gz
# 解压后可以发现这个就是我们之前导入的jdk压缩包
tar -zxvf tmp.tar.gz
6.3、hadoop集群测试
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /tinput /toutput

在这里插入图片描述

7、集群崩溃处理
1)先停止集群
hadoop2 $ $HADOOP_HOME/sbin/stop-yarn.sh
hadoop1 $ $HADOOP_HOME/sbin/stop-dfs.sh
2)删除每个集群上的
rm -rf $HADOOP_HOME/data/ $HADOOP_HOME/logs/
3)格式化集群
hadoop1 $ hdfs namenode -format
4)启动集群
hadoop1 $ $HADOOP_HOME/sbin/start-dfs.sh
hadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh
8、配置历史服务器
8.1、配置mapred-site.xml

文件中添加如下配置

hadoop1$ vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
    <!-- 配置历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop1:10020</value>
    </property>
    
    <!-- 配置历史服务web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop1:10888</value>
    </property>
</configuration>
8.2、同步配置
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
8.3、在hadoop1上启动历史服务器

如果yarn启动需要关闭重启yarn

hadoop2 $ $HADOOP_HOME/sbin/stop-yarn.sh
hadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh

启动历史服务器

hadoop1 $ mapred --daemon start historyserver
8.4、查看历史服务器是否启动
hadoop1 $ jps
8.5、查看JobHistory
# 先在hadoop上创建目录
hadoop fs -mkdir /tinput

# 上传…….txt文件
hadoop fs -put tinput/word.txt /tinput

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /tinput /toutput2
9、配置日志聚合功能

功能:将程序运行日志信息上传到HDFS系统上

  • 注:开启日志聚合功能,需要重启NodeManager、ResourceManager、HistoryServer。

在这里插入图片描述

1)配置yarn-site.xml
hadoop1 $ vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
    <!-- 开启日志聚合功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    
    <!-- 设置日志聚合服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop1:19888/jobhistory/logs</value>
    </property>
    
    <!-- 设置日志保留时间为7天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
</configuration>
2)同步配置
hadoop1 $ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3)关闭重启NodeManager、ResourceManager、HistoryServer

关闭

hadoop1 $ mapred --daemon stop historyserver
hadoop2 $ $HADOOP_HOME/sbin/stop-yarn.sh

重启

hadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh
hadoop1 $ mapred --daemon start historyserver
10、集群启停总结:
1、整体启动停止(推荐)
1)整体启动、停止HDFS
hadoop1 $ $HADOOP_HOME/sbin/stop-dfs.sh

hadoop1 $ $HADOOP_HOME/sbin/start-dfs.sh
2)整体启动体制YARN
hadoop2 $ $HADOOP_HOME/sbin/stop-yarn.sh

hadoop2 $ $HADOOP_HOME/sbin/start-yarn.sh
3)启停historyserver
hadoop1 $ $HADOOP_HOME/bin/mapred --daemon stop historyserver

hadoop1 $ mapred --daemon start historyserver
2、各个服务组件分别启/停
1)启/停HDFS组件
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
2)启/停YARN组件
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
3)启停historyserver
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver

[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
11、编写Hadoop集群常用脚本
1)批量启停hadoop服务
hadoop1 $ vim $HSCRIPT_HOME/bin/myhadoop

cat myhadoop

#!/bin/bash

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

case $1 in
"start")
        echo "=============== 启动 hadoop 集群 ==============="
        echo "--------------- 启动 hdfs ---------------"
        ssh hadoop1 "$HADOOP_HOME/sbin/start-dfs.sh"
        echo "--------------- 启动 yarn ---------------"
        ssh hadoop2 "$HADOOP_HOME/sbin/start-yarn.sh"
        echo "--------------- 启动 historyserver ---------------"
        ssh hadoop1 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
;;
"stop")
        echo "=============== Shutdown hadoop 集群 ==============="
        echo "--------------- 停止 historyserver ---------------"
        ssh hadoop1 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"   
        echo "--------------- 停止 yarn ---------------"
        ssh hadoop2 "$HADOOP_HOME/sbin/stop-yarn.sh"
        echo "--------------- 停止 hdfs ---------------"
        ssh hadoop1 "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
        echo "Input Args Error.."
;;
esac

使用:

# 赋权
hadoop1 $ chmod +x $HSCRIPT_HOME/bin/myhadoop

# 启动
hadoop1 $ myhadoop start
# 停止
hadoop1 $ myhadoop stop
2)查看所有服务器Java进程脚本:jpsall
hadoop1 $ vim $HSCRIPT_HOME/bin/jpsall

创建所需查看服务器的host地址

cat /var/opt/hadoopSoftware/hadoopScript/config/all_hadoop_hosts
hadoop1
hadoop2
hadoop3

cat jpsall

#!/bin/bash

for host in `cat /var/opt/hadoopSoftware/hadoopScript/config/all_hadoop_hosts`
do
    echo ======== $host ========
    ssh $host jps
    echo -e "\n"
done

运行:

# 赋权
hadoop1 $ chmod +x $HSCRIPT_HOME/bin/jpsall

# 执行检查
hadoop1 $ jpsall
12、常用端口号
端口名称Hadoop3.x
NameNode 内部通信端口8020、9000、9820
NameNode HTTP UI9870
MapReduce 查看执行任务端口8088
历史服务器通信端口19888

注:长时间无法关闭集群

因为linux默认会30天清理一次/tmp临时文件,而集群配置文件hadoop-env.sh中的默认pid存储位置就在这里,这就造成了因集群长时间运行后,无法正常找到集群的pid

解决:手动kill掉他们,然后配置自己的hadoop tmp目录即可

hadoop1 $ vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# Where pid files are stored.  /tmp by default.
#export HADOOP_PID_DIR=/tmp
export HADOOP_PID_DIR=$HADOOP_HOME/tmp

同步到其他服务器

hadoop1 $ mkdir -p $HADOOP_HOME/tmp
hadoop1 $ chmod 777 $HADOOP_HOME/tmp
hadoop1 $ xsync $HADOOP_HOME/tmp

实践

Hadoop_HDFSHadoop_MapReduceHadoop_Yarn



参考网站

Hadoop官网:http://hadoop.apache.org/
Hadoop下载:https://www.apache.org/dyn/closer.cgi/hadoop/common/

Hadoop历史版本下载:http://archive.apache.org/dist/hadoop/core/
Hadoop文档:http://hadoop.apache.org/docs/

Hive官网:http://hive.apache.org/
Hive下载:http://mirror.bit.edu.cn/apache/hive/

Hive历史版本下载:http://archive.apache.org/dist/hive/
Hive文档:https://cwiki.apache.org/confluence/display/Hive

HBase官网:http://hbase.apache.org/
HBase下载:http://mirrors.sonic.net/apache/hbase/

HBase历史版本下载:http://archive.apache.org/dist/hbase/
HBase文档:http://hbase.apache.org/book.html
HBase中文文档:http://abloz.com/hbase/book.html

Spark官网:http://spark.apache.org/
Spark下载:http://spark.apache.org/downloads.html
Spark文档:http://spark.apache.org/docs/latest/

Zookeeper官网:http://zookeeper.apache.org/
Zookeeper下载:http://zookeeper.apache.org/releases.html#download

Flume官网:http://flume.apache.org/
Flume下载:http://flume.apache.org/download.html
Flume文档:http://flume.apache.org/documentation.html

Mahout官网:http://mahout.apache.org/
Mahout下载:http://mahout.apache.org/general/downloads.html

Tez官网:http://tez.apache.org/

cdh5版本:

下载地址:http://archive.cloudera.com/cdh5/cdh/5/
文档地址:http://archive.cloudera.com/cdh5/cdh/5/

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值