介绍

本文这里的hadoop3.1.3的集群仅仅指hadoop本身的搭建,不涉及到其他框架整合;Flink实时电商实战项目中HDFS部分是基于此版本,B站上有这个版本的安装视频:
Flink实时电商项目实战
项目框架链接
提取码:whqf
gitee地址

搭配环境

VMware16(注意不要使用15,容易蓝屏,如果出现蓝屏,大概率是系统兼容性问题,建议改用16,激活码搜索即可,很方便)
安装硬件,安装虚拟机;

账户:root 密码:root

用户名:chenxu 密码:root

配置IP时要注意:VMware、win10、Hadoop都要配置;

Hadoop静态IP地址更改

进入终端命令行:su root (输入密码)

输入命令:vim etc/sysconfig/network-scripts/ifcfg-ens33

dhcp表示动态获取IP地址,改为static;

增加内容:

#IP地址

IPADDR=192.168.10.100 #100表示hadoop100

#网关

GATEWAY=192.168.10.2

#域名解析器

DNS1=192.168.10.2

输入完之后按一下ESC进入EX模式,输入wq保存并退出;

  • 配置主机名称:vim /etc/hostname

  • 配置Linux克隆机主机名称映射hosts文件,打开/etc/hosts;(这么做的目的是为了让)以后修改IP时方便修改;

  • 加入以下内容:

IP地址及hostname:
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
  • 重启克隆机
  • 切换root用户,ifconfig指令查看IP是否配置好;

模板虚拟机准备

远程控制Xshell安装完毕后,连接远程服务器;

账号密码:root;

配置主机名称映射,进入"C:\Windows\System32\drivers\etc"路径下的hosts文件中,加入之前加入的IP和主机名称内容;

可以先修改hosts文件的属性,改为可更改后再修改;(也可以直接复制出来修改,修改完之后再粘贴回去)

下载Xftp(从windows传输文件到虚拟机种);

安装epel-release;

yum install -y epel-release

关闭防火墙自启动:

  • systemctl stop firewalld
  • systemctl disable firewalld.service

创建一个系统用户,并修改用户密码:(安装时已创建,不需要再创建)

useradd 用户名

passwd 密码

给用户赋予root权限:

输入命令vim /etc/sudoers

找到%wheel ALL=(ALL) ALL这一行,在下一行加上

用户名 All=(ALL) NOPASSWD:ALL

其中,nopass表示以后不需要密码,可获得root权限,也可以不加NOPASS;

后续使用用户时,加上sudo,有root效果;

切换root账号:

卸载对应安装的JDK

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

其中rpm -qa | grep -i java命令是一个遍历查询指令;

重启虚拟机;

克隆虚拟机:

​ 先克隆3台:hadoop100、hadoop102、hadoop103、hadoop104;

先关闭现行的虚拟机,再克隆;

​ 在VMware列表中删除,并不会直接删除源文件,要选择在磁盘中删除;

进入新生成的克隆虚拟机,进入root权限后,只需要再次输入命令

vim /etc/sysconfig/network-scripts/ifcfg-ens33

修改IPADDR,之后输入命令vim /etc/hostname 修改hostname;

输入命令 vim /etc/hosts(之前已经修改完毕,可以不用动);

Hadoop102部署JDK

部署完之后,拷贝至其他;

tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

解压文件至…目录;

配置JDK环境变量;

cd /etc/profile.d进入特定文件夹中,创建一个文件sudo vim my_env.sh,不要更改原文件;

进入存放JDK的module目录下,运用pwd命令找到JDK的路径;

在my_env.sh文件中写上:

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin

接下来

source /etc/profile

部署hadoop

解压安装

tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

配置环境变量

找到hadoop的目录,pwd获得路径;

cd /etc/profile.d/my_env.sh 进入之前创建好的文件,

添加内容:

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH= P A T H : PATH: PATH:HADOOP_HOME/bin
export PATH= P A T H : PATH: PATH:HADOOP_HOME/sbin

然后输入source /etc/profile

注意etc、bin、sbin目录,以后要用到;

完全分布式运行模式;

1、准备3台客户机

2、安装JDK/etc

4、安装hadoop

5、配置环境变量

6、配置集群

7、单点启动

8、配置ssh

9、群起并测试集群

hadoop102已经准备好了,现在的目标就是将hadoop102拷贝至其他服务器;

命令 scp(完全拷贝)

​ 1、具体命令行为:scp -r $文件路径/名称 目的地用户@主机:目的地路径/名称;

scp -r hadoop-3.1.3 chenxu@hadoop103:/opt/module(从102复制到-103)

注意:如果其他服务器没有对应文件权限,赋予其module777权限;

​ 2、也可以去要粘贴的地址,将文件拉过来:

scp -r chenxu@hadoop102:/opt/module/hadoop-3.1.3 ./(从103把102的信息拉过去)

即在之前的命令行后 加一个要粘贴的地址;文件名也改到第一个地址后;

​ 3、scp -r chenxu:hadoop102:/opt/module/* chenxu@hadoop104:/opt/module/(从103把102的信息复制到104)

案例实操:

1、前提:hadoop102、hadoop103、hadoop104都已经创建好的/opt/module,/opt/software两个目录,并且已经把这个目录修改为chenxu:chenu;

rsync(同步命令)

用于备份和镜像;(只复制不用的文件)

rsync -av 内容 目的地用户@主机:路径或者文件名称

​ 实操:删掉hadoop-3.1.3目录下的wcinput和wcoutput文件,再从hadoop102同步过去:

xsync(集群分发)

用法:xsync + 要同步的文件名;

期望脚本在任何路径下都能使用(脚本要放在声明了全局环境变量的路径中):

echo $PATH查看全局变量位置:为了简单,这里直接用已经存在的路径;在/usr/local/bin目录下创建bin目录,存放脚本(vim xsync);(脚本执行地址 /usr/local/bin)

脚本实现:

#!/bin/bash

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

#2.遍历集群所有机器
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)

                #6.获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

chmod 777 xsync 赋予权限;

运行,发现其他几台服务器创建成功;

分发环境变量;

sudo xsync /etc/profile.d/my_env.sh

注意:如果是用sudo(即root权限)来执行,可能会找不到命令,此时可以用绝对路径:sudo ./bin/xsync /etc/profile.d/my_env.sh这种格式;

然后在103和104服务器上source一次;

ssh

ssh +主机 进入对应主机,exit退出;
免密配置方法:

进入/home/chenxu用户目录----ls -al查看虽有隐藏文件----发现有ssh文件,里面有一个known-hosts(注意,只有用过,即ssh访问过的文件才有)—输入命令行ssh-keygen -t rsa,然后三次回车;

注意:

[root@localhost ~]``# cd /root/.ssh/       【root用户就在root目录下的.ssh目录】
[root@localhost ~]``# cd /home/omd/.ssh/  【普通用户就是在家目录下的.ssh目录】

3个集群都配置一次:

ssh-copy-id hadoop102,ssh-copy-id hadoop103,ssh-copy-id hadoop104,配置完成;

然后对hadoop103、hadoop104做同样操作;

或者也可以这样做:(推荐)

也可以把每一个账户的root账号进行同样的ssh免密配置,这里只对hadoop102的root做操作;(直接cd进入根目录,找到.ssh/目录操作)

现在再调用xsync,可以不用再输出密码;

集群配置

NameNode、SecondaryNameNode、ResourceManager不要安装再同一台服务器;

四个配置文件:

1、核心配置文件:core-site.xml;

配置前两个;

<!-- 指定NameNode的地址 -->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop-3.1.3/data</value>
</property>

2、HDFS配置文件:hdfs-site.xml;

<!-- nn web端访问地址 -->
<property>  
    <name>dfs.namenode.http-address</name>
    <value>hadoop102:9870</value>
</property>
<!-- 2nn wen端访问地址 -->
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:9868</value>
</property>

9870和9868分别为两者以后的访问端口;
(9868一般不需要用,但是9870使用频率会很高,记住这个端口号)

3、Yarn配置文件

yarn-site.xml

  <!-- 指定MR走shuffle -->
  <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
  </property>
<!-- 指定ResourceManager的地址 -->
  <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>hadoop103</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>

4、MapReduce配置文件

mapred-site.xml;

    <!-- 指定MapReduce -->
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

接下来把配置好的hadoop分发到hadoop103和hadoop104;

群起集群

1、配置workers

找到/opt/module/hadoop-3.1.3/etc/hadoop目录下的workers文件,添加内容:(作为主机名称)

hadoop102
hadoop103
hadoop104

注意:不能有空格和空行

2、启动集群

​ 如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,NameNode和DataNode的id会不一致,集群找不到以往数据,会报错;所以需要格式化NameNode的话,一定要先停止namenode和datanode,并且删除所有机器的data和logs目录(再module/hadoop-3.1.3目录下,再进行格式化;

初始化:hdfs namenode -format,初始化后hadoop-3.1.3目录下多出data和logs文件夹;(data/dfs/name/current下可以看到镜像文件和Version,即当前版本的版本号)

启动集群:/opt/module/hadoop-3.1.3/sbin/目录下

启动 start-dfs.sh;

找到各自服务器的hadoop-3.1.3/jps目录下的文件是否与之前要配置NameNode、SecondaryNameNode和ResourceManager的位置一致;

如果其他文件创建失败,可能是权限不够导致的;

接下来在配置了ResourcrManager的节点(hadoop103)上启动Yarn;

sbin/start-yarn.sh;

此时我们可以得到两个web页面:

hadoop102:9870(Utilities—Browse Directory);hadoop103:8088(yarn资源调度监控网);

3、集群测试
1、上传文件

在hadoop-3.1.3目录下:

  • 上传小文件:在Browse Directory中监控到上传的文件;

hadoop fs -mkdir /input 上传并建立一个目录

hadoop fs -put wcinput/word.txt /wcinput 上传本地文件到/wcinput中,如果接收目录不存在,会自动创建;

上传文件之后,可以下载;tail the file可以查看文件信息;

  • 上传大文件:hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz

    ​ 实际上这些数据只是在页面上展示,而不是存储在这里,实际存储在DataNode中,而DataNode的数据存储在hadoop-3.1.3/data目录下;

具体路径为:

/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1173909124-192.168.10.102-1616131443559/current/finalized/subdir0/subdir0;

2、拼接文件

如果涉及到解压型文件,可以用文件名 + >> +文件类型的形式来追加

比如:cat blk_1073741826>> tmp.tar.gz,cat blk_1073741826>> tmp.tar.gz就取出来了,解压之后就是之前上传的JDK文件;

3、执行一些程序(这个涉及到yarn的资源调度)

例子:执行一个wordcount程序

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput(集群模式下的计算 输入和输出结果都需要在集群的路径中) /wcoutput(观察9870端口的Browse Directory窗口的路径信息)

运行过程中观察yarn提供的网站(8088端口),发现有任务正在进行;

yarn的服务端口号是8032,即提交任务的端口是8032;

4、配置历史服务器

配置在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>

然后分发给其他服务器:xsync mapred-site.xml

重启一下yarn;

进入hadoop102 ,bin/mapred --daemon start historyserver;(mapred是命令 在bin目录下 daemon表示守护进程或者说是后台启动;historserver是历史服务器)

查看是否启动:jps(JobHistoryServer)

启动之后,可以在页面的History选项中查看历史状态,configuration中可以擦看历史参数状态;

5、集群异常/崩溃

比如不小心把三个服务器的某一data文件删了:

1:先kill进程;(停掉所有的集群)

2:删除所有服务器的data和logs;

3:进行初始化;

4:启动集群;

​ 之所以要全部删除再初始化,是因为每一个DataNode和NameNode都有自己的ID,是唯一对应的,如果信息不全部删除,是无法匹配的;

6、日志聚集功能

好处:查看程序运行情况,方便开发调试;

概念:应用运行完成以后,将程序运行日志上传到HFDS系统上,所有服务器日志聚集到HFDS,用户可以直接查看;

注意:开启日志查看功能,需要重新启动NodeManager,ResourceManager,HistoryServer;

具体步骤:

进入hadoop102服务器的/etc/hadoop目录下;

配置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>

之后分发配置 xsync yarn-site.xml

前往hadoop102服务器关闭NodeManager,ResourceManager和HistoryServer:

mapred --daemon stop historyserver

前往hadoop103服务器hadoop-3.1.3目录下关闭yarn:

sbin/stop-yarn.sh

开启yarn:

sbin/start-yarn.sh

再次启动NodeManager,ResourceManager和HistoryServer:

mapred --daemon start historyserver

这样后续执行命令就会自动生成日志并保存;

可以进入hadoop102服务器的hadoop-3.1.3/目录下执行一个命令hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2试试;

7、集群启动和停止方式总结:
各个模块分开启动/停止(配置ssh是前提)(常用)

整体启动/停止 HDFS

start-dfs.sh/stop-dfs.sh

整体启动/停止YARN

start-yarn.sh/stop-yarn.sh

各个服务逐一启动停止:

分别启动/停止HDFS组件:

hdfs --daemon start/stop namenode/datanode/secondarynamenode;

启动/停止YARN:

yarn --daemon start/stop resourcemanager/nodemanager;

部分信息总结

Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):

进入hadoop102根目录 cd /usr/local/bin----

vim myhadoop.sh;创建好之后先赋予权限,方便修改;

#!/bin/bash

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

case $1 in
"start")
    echo "=============启动 hadoop集群 ============="
    echo " --------------启动hdfs --------------"
    ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
    echo " --------------启动yarn --------------"
    ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
    echo "-------------- 启动historyserver --------------"
    ssh hadoop104 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"       
;;
"stop")
    echo " ===========关闭 hadoop集群"
    echo "------------关闭historyserver ----------------"
    ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
    echo "-------------关闭yarn ---------------------"
    ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
    echo " ------------关闭hdfs --------------------"
    ssh hadoop104 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac    

myhadoop.sh start/stop控制启动和停止;

5.2、查看3台服务器的进程

进入hadoop102根目录 cd /usr/local/bin----

sudo vim jpsall:

#!/bin/bash

for host in hadoop102 hadoop103 hadoop104

do
    echo =========== $host ============
    ssh $host jps
done

jpsall直接启动即可;

然后利用xsync分发程序,记得开放其他服务器bin目录的权限

集群同步时间的坑

注意,这里最好不要去固定你的集群时间,让他自动连网同步即可,如果集群时间不一致:
下载ntpd服务,可以自行搜索;
先查看一下状态
systemctl status ntpd
再重启一下服务
sudo systemctl start ntpd
这里会涉及到后续hbase的启动问题,有时候hbase不能同时启动3个region server并不是其他问题,就是时间不一致导致的;

6、部分端口信息

hadoop3.x:

- HDFS NameNode 内部通讯接口:8020/9000/9820
- HDFS NameNode 对用户的查询接口:web端9870(服务端口号9820- Yarn查看任务运行情况:web端8088(服务端口号8032- 历史服务器: web端19888(不用直接进入,点击history选项进入)(服务端口号10020)

hadoop2.x:

- HDFS NameNode 内部通讯接口:8020/9000
- HDFS NameNode 对用户的查询接口:50070
- Yarn查看任务运行情况:8088
- 历史服务器 19888

2181:zookeeper的端口号:
2888:单个服务器与集群Leader服务器交换信息的端口号
3888:执行选举时服务器相互通信的端口号                   
    
6379:Redis的端口号
    
16010:HBASE的web端口号
16000:HBASE的服务端口号
                   
8485:journalnode默认的端口号

9092:kafka的端口号

41414:flume监控的端口
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐