集群简介
- HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起。
- HDFS集群负责海量数据的存储,集群中的角色主要有:NameNode、DataNode、SecondaryNameNode。
- YARN集群负责海量数据运算时的资源调度,集群中的角色主要有:ResourceManager、NodeManager。
- 那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集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上。
本搭建的是集群模式,以三台主机为例,以下是集群规划:
hadoop215 | hadoop214 | hadoop217 | |
---|---|---|---|
HDFS | NameNode | SecondaryNameNode | |
DataNode | DataNode | DataNode | |
YARN | ResourceManager | ||
NodeManager | NodeManager | NodeManager | |
访问地址 | HDFS访问地址: http://hadoop215:9870 | YARN访问地址: http://hadoop214:9088 |
hadoop集群安装
1.下载相关软件
hadoop下载地址:https://mirrors.tuna.tsinghua... 目前我们使用hadoop3.3.1来实施。
下载地址: 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
集群配置
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
2.hdfs配置
进入hadoop的默认根目录下: vim ./etc/hadoop/hdfs-site.xml
dfs.namenode.http-address
0.0.0.0:9870
The address and the base port where the dfs namenode web ui will listen on.
dfs.namenode.secondary.https-address
0.0.0.0:9869
The secondary namenode HTTPS server address and port.
3.yarn设置
进入hadoop的默认根目录下: vim ./etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
hadoop214
yarn.resourcemanager.webapp.address
hadoop214:9088
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ
4.core设置
进入hadoop的默认根目录下: vim ./etc/hadoop/core-site.xml
fs.defaultFS
hdfs://hadoop215:8020
hadoop.tmp.dir
/opt/module/hadoop/data
hadoop.http.staticuser.user
root
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.系统访问
附件
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'.