集群简介

  1. HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起。
  2. HDFS集群负责海量数据的存储,集群中的角色主要有:NameNode、DataNode、SecondaryNameNode。
  3. YARN集群负责海量数据运算时的资源调度,集群中的角色主要有:ResourceManager、NodeManager。
  4. 那mapreduce是什么呢?它其实是一个分布式运算编程框架,是应用程序开发包,由用户按照编程规范进行程序开发,后打包运行在HDFS集群上,并且受到YARN集群的资源调度管理。

集群部署方式

Hadoop部署方式分三种:
1、Standalone mode(独立模式)
独立模式又称为单机模式,仅1个机器运行1个java进程,主要用于调试。

2、Pseudo-Distributed mode(伪分布式模式)
伪分布模式也是在1个机器上运行HDFS的NameNode和DataNode、YARN的 ResourceManger和NodeManager,但分别启动单独的java进程,主要用于调试。

3、Cluster mode(群集模式)-单节点模式-高可用HA模式
集群模式主要用于生产环境部署。会使用N台主机组成一个Hadoop集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上。

本搭建的是集群模式,以三台主机为例,以下是集群规划:

hadoop215hadoop214hadoop217
HDFSNameNode SecondaryNameNode
DataNodeDataNodeDataNode
YARN ResourceManager
NodeManagerNodeManagerNodeManager
访问地址HDFS访问地址: http://hadoop215:9870YARN访问地址: http://hadoop214:9088

hadoop集群安装

1.下载相关软件

hadoop下载地址:https://mirrors.tuna.tsinghua... 目前我们使用hadoop3.3.1来实施。
1.png
下载地址: wget https://mirrors.tuna.tsinghua...

jdk下载地址:国内镜像源https://repo.huaweicloud.com/...

2.解压jdk跟hadoop

我们下载完jdk跟hadoop之后,我们将其解压到/usr/local。

tar -zxvf jdk-8u192-linux-x64.tar.gz -C /usr/local
tar -zxvf hadoop-3.3.1.tar.gz -C /usr/local/

3.环境变量配置

vim /etc/profile

输入以下内容:

export JAVA_HOME=/usr/local/jdk1.8.0_192
export CLASSPATH=$CLASSPATH$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

export HADOOP_HOME=/usr/local/hadoop-3.3.1
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

生效

source /etc/profile

4.配置主机域名映射

vi /etc/hosts

 hadoop215 172.21.81.215
 hadoop214 172.21.81.214
 hadoop217 172.21.81.217

5.一个例子测试hadoop

 mkdir /tmp/wcinput
 echo "aaa bbb aaa ccc" >> /tmp/wcinput/aaa.txt
 echo "aaa bbb ccc ddd" >> /tmp/wcinput/aaa.txt
 cat /tmp/wcinput/aaa.txt 
 cd $HADOOP_HOME/share/hadoop/mapreduce
 hadoop jar hadoop-mapreduce-examples-3.3.1.jar wordcount /tmp/wcinput/ /tmp/wcoutput
 

然后进入: cd /tmp/wcoutput
我们可以看到:_SUCCESS part-r-00000 其中part-r-00000是我们的生成文件:

 cat part-r-00000 
 输出:
 aaa    3
 bbb    2
 ccc    2
 ddd    1

集群配置

3.png

hadoop集群分为如上部分

  • hadoop分为了hdfs跟yarn两部分。
  • hdfs:是分布式文件存储系统,里面的进程包括了3部分;NameNode、DataNode、SecondaryNameNode。DataNode是存储数据的,DataNode数据的索引是存放在NameNode的
    SecondaryNameNode是NameNode元数据的备份。
  • yarn:是资源调度,里面的进程分为了3部分:ResourceManager、NodeManager、HistoryServer;ResourceManager是一个主进程,用来管理其他进程的;NodeManager是每一个节点上都会存在的,ResourceManager只有一个节点上有。HistoryServer用于管理yarn运行的历史记录的。比如上面我们的mapred任务需要执行,他会通过ResourceManager去到NodeManager里面分配资源给mapred运行,执行过成中的记录会被记录在HistoryServer中。

1.查找对应配置文件

进入hadoop的跟目录,然后通过如下命令去查找对应的配置文件。

# 查找4个核心配置文件:刚开始是空的
find . -name "*.xml" | grep etc | grep -E 'yarn|hdfs-site|mapred|core'
# 查找4个核心配置文件的默认配置文件:其实就是模版
find . -name "*-default.xml" | grep -v rbf
# 分别编辑各配置文件
vim

image.png

对应的默认配置文件如下:
image.png

2.hdfs配置

进入hadoop的默认根目录下: vim ./etc/hadoop/hdfs-site.xml

<configuration>
<property>
 <!--nn web 端访问地址-->
  <name>dfs.namenode.http-address</name>
  <value>0.0.0.0:9870</value>
  <description>
    The address and the base port where the dfs namenode web ui will listen on.
  </description>
</property>
<property>
  <!--2nn web 端访问地址-->
  <name>dfs.namenode.secondary.https-address</name>
  <value>0.0.0.0:9869</value>
  <description>
    The secondary namenode HTTPS server address and port.
  </description>
</property>
</configuration>

3.yarn设置

进入hadoop的默认根目录下: vim ./etc/hadoop/yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
<!--指定MR走shuffle-->
   <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!--指定ResourceManager地址-->
   <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop214</value>
    </property>
     <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop214:9088</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_HOME,PATH,LANG,TZ</value>
  </property>
</configuration>

4.core设置

进入hadoop的默认根目录下: vim ./etc/hadoop/core-site.xml

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

5.配置workers

vim ./etc/hadoop/workers 添加如下节点:

hadoop214
hadoop215
hadoop217

6.配置hadoop环境变量

编辑: vim ./etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0_192

实现免密登录

ssh-genkey是生成密钥的工具,执行完成后生成公钥和密钥,这两个文件会默认保存在~/.ssh/路径下。常用的参数为:

  • -t: 指定生成密钥类型(rsa、dsa)。默认为rsa
  • -f: 指定存放私钥的文件,公钥文件名为私钥文件名加.pub后缀。默认为id_rsa
  • -P: 指定passphrase(私钥的密码),用于确保私钥的安全。默认为空
  • -C: 备注。默认为user@hostname

我们直接执行来生成密钥,所有的参数都可以为空,也就是一直回车确认:

 [root@iZ2zeesoaqp09k9k2q912dZ ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ZLaPNIFIWNzjxNLmA04gCP5u0Pqm72/zB0qg1cQRK2g root@iZ2zeesoaqp09k9k2q912dZ
The key's randomart image is:
+---[RSA 2048]----+
|= .=+*o          |
|o.o.=+O.         |
| E ++O..=        |
|. ooo.++ o       |
| .oo.  .S        |
| .+  . o +       |
| . o. . o .      |
|  o. +   .       |
| .=+o.o..        |
+----[SHA256]-----+
[root@iZ2zeesoaqp09k9k2q912dZ ~]# 

此时,生成的文件在~/.ssh/目录下,我们会看到这些文件:

[root@iZ2zeesoaqp09k9k2q912dZ .ssh]# ll
id_rsa    // 私钥文件  
id_rsa.pub    // 公钥文件
authorized_keys    // 存放客户端公钥的文件
known_hosts    // 确认过公钥指纹的可信服务器列表的文件
config    // 指定不同域名使用哪个密钥的配置文件

因为一台机器既能是客户端,又能是服务端,因此同时存在authorized_keys(在该机器为服务端时使用)和Known_hosts(在该机器为客户端时使用)。

我们的服务器会有很多的用户,如果所有的用户都用同一份密钥,可能就没办法划分权限或者区分用户,如多个用户提交git就需要按照用户名来生成密钥,用于区分用户。同时你可能也希望针对不同的服务器使用不同的密钥对,因此需要config配置文件来配置针对不同服务器的配置:

$vim ~/.ssh/config
Host a.baidu.com
User work
IdentityFile ~/.ssh/id_rsa

Host b.baidu.com
User zhaoshuaiqiang
IdentityFile ~/.ssh/zhaoshuaiqiang

这样在连接不同的服务器时,就会使用不同的密钥文件来登录。
在客户端生成密钥对之后,将公钥追加到服务器的authorized_keys文件中即可。

3台机器都执行上面的操作生成各自服务的免密文件。然后:

在hadoop215上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop214
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop215
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop217
从而让各个节点互相拥有其他节点的秘钥(流程与上图相同,就不再截图)

在hadoop214上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop214
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop215
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop217
从而让各个节点互相拥有其他节点的秘钥(流程与上图相同,就不再截图)

在hadoop217上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop214
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop215
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop217
从而让各个节点互相拥有其他节点的秘钥(流程与上图相同,就不再截图)

集群启动

之前我们都是在hadoop215的hdfs的主节点上进行操作的,上面操作完毕之后,我们将/usr/local下的hadoop-3.3.1以及jdk拷贝到hadoop214以及hadoop217机器上。然后按照以下进行集群启动。

1.格式化NameNode

格式化NameNode,在NameNode所在的节点215上执行

hdfs namenode -format

2.启动hfs

在NameNode所在节点215上执行

# 启动跟停止
start-dfs.sh
stop-dfs.sh

3.启动yarn

在ResourceManager所在节点214上执行

# 启动 停止
start-yarn.sh
stop-yarn.sh

4.系统访问

hdfs的访问:
image.png

yarn访问:
image.png

附件

1.hdfs报错:iZ2zeesoaqp09k9k2q912dZ: ssh: Could not resolve hostname iz2zeesoaqp09k9k2q912dz: Name or service not known

修改etc/profile配置文件,添加:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

执行source /etc/profile使文件生效。再次运行相同的命令没有报错。

2.hdfs的常见端口

https://blog.csdn.net/hmyqwe/...

问题排查

1.启动日志查看

通过yarn方式启动flink程序

$FLINK_HOME/bin/flink run -d -m yarn-cluster -yjm 1024m -ytm 2048m -ynm IntranetNewsES_first -yD env.java.opts="-Duser.timezone=GMT+8" -ys 3 $FLINK_HOME/jobs/gtc-governance-service-jk-2.3.0.jar --active pro --driver IntranetNewsES --topicName MinitorZip_wait_first --consumerType earliest --topicGlobName end_news_first --tableName discover_data_source --idName id  --sinkPara 3  --opertatorPara 3 --sourcePara 3 --processorType IntranetNewsES --groupType wait_first_yarn2

然后程序在yarn中显示killed,说明程序报错了,我们如何查看日志呢?首先在终端进行yarn-job提交启动的时候,会出现如下信息:

2023-01-12 16:36:28,631 INFO  org.apache.flink.yarn.YarnClusterDescriptor                  [] - Found Web Interface hadoop217:42503 of application 'application_1672313996434_0030'.

然后进入yarn控制台界面:
image.png
进入:userlogs
image.png
然后进入
image.png
点击进入查看对应日志


startshineye
91 声望26 粉丝

我在规定的时间内,做到了我计划的事情;我自己也变得自信了,对于外界的人跟困难也更加从容了,我已经很强大了。可是如果我在规定时间内,我只有3分钟热度,哎,我不行,我就放弃了,那么这个就是我自己的问题,因为你自己...