前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的 Hadoop 3.2.2 之旅 【收藏夹吃灰系列】

我的 Hadoop 3.2.2 之旅 【收藏夹吃灰系列】

作者头像
Lenis
发布2021-04-19 15:56:48
7040
发布2021-04-19 15:56:48
举报
文章被收录于专栏:有关SQL有关SQL

图 | Lenis

清明小假期结束了。

以往经验告诉我,三天不练手,代码倒着走!

这样的心情,大学时代更有体会。每次假期回家,总要带回一大包书,告诉自己要奋斗,要看书,结果回校前一夜,发现包里的书,安静如初。如果不赶紧翻出来品上一两页,缓解下心焦,那可耻的厌恶感,总挥之不去。

不知道什么时候起,我养成了习惯,假期中,即使拿不出10个小时来读书和写代码,每天也总得练上 2-3 小时,让自己不空着。

这次也不例外,离上次搭建 Hadoop,过去有段时间了。趁着这个假期,我从头到尾,把 Hadoop 3.2.2 给搭了起来。以下是实况记录,如果能帮到各位,那也算是没白糟蹋这段好时光!

首先,说下文章的结构图。

本次实验,完成的事情全部包括在这张 xmind 图中了。

环境搭建篇

1 CentOS 的虚拟化安装

成功安装 Hadoop,第一要务是正确安装 Linux 操作系统。

本次安装,选择 CentOS. CentOS 有很多版本,选择哪个,需根据 Hadoop 版本来判定。

我在写这篇文章时,查询过 Hadoop 官方文档,当前它最新版本是 Hadoop 3.2.2. 安装指南中,着重阅读 Prerequisites(预备) 部分,发现它并未对 CentOS 的版本提出要求,而仅要求 CentOS 安装 Java 即可。所以,本次安装选用最新的 CentOS 8.

Hadoop 官网: https://hadoop.apache.org/docs/stable/

CentOS 的下载非常快,需要时从官网下载最新版本,而不一定非得存储起来。如今的网络环境,给我可怜的 SSD 存储系统减轻了不少经济压力。但需说明一点,官方宣布,CentOS 8 支持服务将于 2021 年底失效,而 CentOS 7 则到 2024 年才退役。所以,生产环境使用 CentOS 7 还是 8 ,需要提前考虑好!

CentOS 官网:https://www.centos.org/

image.png

本次实验用途搭建的 Hadoop 环境,我采取三台独立虚拟机做法。

代码语言:javascript
复制
D:\vm\HadoopCluster
 - Yarn
  - NodeA
  - NodeB

D:\vm\HadoopCluster 是总目录,分目录 Yarn, NodeA, NodeB 分别存放主从服务器虚拟机。如果你有充足预算,当然可以用三台物理机来模拟。作为极客,配置个 5,6 台主机,很重要。如果没有,单机配置足够强大,勉强也凑合。

所有 CentOS 虚拟机的密码都是 : SparkAdmin

虚拟机软件用 Vmware. 预配置8G 内存,4核,和50GB 硬盘.

2 创建专属Hadoop软件的用户

为每台服务器,创建如下的账户:

用户名:HadoopAdmin 密码: SparkAdmin

一个小铺垫:其实 Hadoop 是基础,是开胃菜,从 SparkAdmin 就不难猜到,之后还将有 Hive 和 Spark.小伙伴们,赶紧收藏加关注!

为了和其他应用隔离开来,有必要为 Hadoop 单独建立一个应用目录。

配置软件安装目录:/opt/Hadoop. 用户 HadoopAdmin 对 /opt/Hadoop 具有无限访问权限 当使用 HadoopAdmin 登录时,没有权限建立目录,所以要先登录 root 账户:

代码语言:javascript
复制
$su
--输入 HadoopAdmin密码
#cd /opt
#mkdir Hadoop
#chown hadoopadmin Hadoop
#exit

3 主从服务器之间的无密登录

主机名与网络映射

新建三台虚拟机时,采用了“建一复二”的策略,说人话,就是新建一台,复制两台。

这三台都使用了相同的主机名,所以需要修改他们,分别为:namenode, nodea, nodeb

为了防止修改错误,先把 /etc/hosts 备份起来:

代码语言:javascript
复制
$ su
# cp /etc/hosts /etc/hosts.backup
# exit

修改 /etc/hosts 文件:

代码语言:javascript
复制
# 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1       namenode        namenode.hadoop

注释掉第一行,加上 namenode

事实上,修改 hosts 文件,并不解决问题,而是要修改 /etc/hostname 文件。注释掉第一行,加入 namenode.hadoop

代码语言:javascript
复制
-- /etc/hostname 文件
# localhost.localdomain
namenode.hadoop

--再切回 bash 控制台,# 就变成如下的提示:
[root@namenode hadoopadmin]# 

接下来,添加主机识别地址。在 CentOS 中,主机与 ip 之间的映射,通过 /etc/hosts 可以很容易建立。

已知,三台节点名称分别是 namenode, nodea, nodeb. 将他们加入 hadoop 这个集群,分别担任 Master 和 Worker 节点。所以修改 /etc/hosts 如下:

代码语言:javascript
复制
192.168.31.10 namenode namenode.hadoop
192.168.31.11 nodea nodea.hadoop
192.168.31.12 nodeb nodeb.hadoop

将以上三个映射,分别添加到每台机器上。

需要说明下,vmware 提供了桥接,NAT 和仅主机的网络模式,这个设置一定要选择桥接模式(Bridge). 我不知道另外两种模式下能不能搭建成功,有成功经验的朋友,可以留言证实下。

SSH 无密登录原理

无密登录是通过 ssh 实现的,大概步骤如下:

  1. 在客户端(经常使用其来登录远程服务器)生成一对密钥对
  2. 将公钥放入远程服务器账户下

生成密钥对的命令工具是:

代码语言:javascript
复制
ssh-keygen [-t rsa|dsa ]

如果没有指定特定的加密算法,默认是用 rsa 来加密。

将 /home/hadoopadmin/.ssh/id_rsa.pub 添加到远程服务器 nodea 的授权认证文件下,那么从 namenode 访问 nodea 时,无需输入密码就可直接登录。

配置 SSH 无密登录

首先,通过 scp 将公钥文件上传到远程服务器的用户 hadoopadmin 的默认工作目录下:

代码语言:javascript
复制
scp id_rsa.pub hadoopadmin@nodea:~

在远程服务器 nodea 上,将公钥加入本账户下的 ~/.ssh/authorized_keys 文件中去。

代码语言:javascript
复制
 cat id_rsa.pub >>.ssh/authorized_keys
 chmod 644 authorized_keys

如此反复,直到所有服务器,都能两两通过 SSH 登录。

4 Java 环境搭建

安装 Hadoop 时,唯一对 CentOS 有要求的是,安装正确的 Java.

为调试方便,尽量安装 JDK. Jre 缺少了 JPS 工具,而 JPS 在后续检测环境时,极为方便!

截止本文写作时,Hadoop 选用的是 3.2.2,它对 Java 运行时环境的要求是 Java8/Java11

Java 与 Hadoop 的版本对应:

Hadoop 版本

Java 版本

备注

Hadoop 3.3 及以上

Java 8; Java 11

Java 11 不支持编译 Hadoop

Hadoop 3.0.x - 3.2.x

Java 8

Hadoop 2.7.x - 2.10.x

Java 7; Java 8

步骤:

  • 下载 JDK 8

安装包有两种,tar.gz 的压缩包 和 rpm 管理的安装包。为了普适性,选择 tar.gz 的压缩包,这样在任何 Linux 平台上,都可以参考它来安装。

下载地址:https://www.java.com/zh-CN/download/manual.jsp

  • 解压到 /opt/java

/opt/java 是与 /opt/Hadoop 齐平的目录,为了体现 Hadoop 生态的完整性安装,Java 安装目录就放在这里。同样,需要配置 HadoopAdmin 用户对这个目录的权限。假如 HadoopAdmin 拥有对 /opt 的 Owner 权限,那么这里 /opt/java 自然继承了这个权限。

给 HadoopAdmin 附上 /opt/Java 的 owner 权限:

代码语言:javascript
复制
-- 先切换到 root 账户
$ su
-- 输入密码
# cd /opt
# mkdir java
# chown hadoopadmin java
  • 设置环境变量 JAVA_HOME=/opt/java/jdk8

回到 HadoopAdmin 用户的工作目录(先退出 root 账户) :

代码语言:javascript
复制
# exit
$ cd ~

打开 .bashrc 编辑:

代码语言:javascript
复制
vi .bashrc

加入 JAVA_HOME 变量,编辑 PATH 变量,使其指向新建的 Java bin 目录:

代码语言:javascript
复制
JAVA_HOME=/opt/java/jdk8
PATH=$PATH:$JAVA_HOME

export JAVA_HOME
export PATH
  • 验证 Java 安装正确性:
代码语言:javascript
复制
-- Java -version

[hadoopadmin@localhost ~]$ java -version
java version "1.8.0_281"
Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.281-b09, mixed mode)

Hadoop软件安装配置

1 下载与安装

再次声明,本次实验使用的 Hadoop 版本是 3.2.2.

下载地址:http://www.apache.org/dyn/closer.cgi/hadoop/common/我在上海,通过访问这个网址可直达:https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.2.2/

image.png

目录中会有几个文件,比较绕。除了安装文件,还有源代码文件包,组件包,说明文件等等。如果你只是要安装使用 Hadoop, 那下载红圈部分即可。

下载速度非常快,不到1分钟就可全部下载完毕。所以不用在本地保存。

若上述地址无法访问,可通过官网寻找:

Hadoop 官方地址:https://hadoop.apache.org/docs/stable/

2 配置文件

在设定 Hadoop 的配置文件前,先要简单了解下 Hadoop 的基本原理:

如果仅对配置文件具体内容感兴趣,可略过这部分原理解释,直接看《可用的一套 Hadoop Cluster 配置》

01 Hadoop集群框架图.svg

Hadoop 是由 HDFS 和 YARN 构成的分布式存储和分布式计算的集群。

HDFS 用作分布式存储,主体部分由 Name Node 和 Data Node 组成。Name Node 节点记录所有 Data Node 的地址和文件信息。

YARN 是分布式计算框架,主体部分由 Resource Manager 和 Node Manager 组成。Resource Manager 可看做大脑管理中心,Node Manager 就是四肢与躯干和神经细胞。

由于 Name Node 和 Resource Manager 都带有管理性质,所以可放在同一台服务器上,方便完成个人搭建的测试。在生产环境中,分开来创建,肯定是利大于弊。

有了上面的基本概念,则可以修改配置文件:

  • Core-Site:配置 Name Node 与 Data Node
  • HDFS-Site: 配置分布式存储的资源范围
  • YARN-Site: 配置 YARN 的资源范围
  • Map-Reduce Site: 配置 MapReduce 1的资源范围
  • env-site: 配置 Hadoop 所在的环境变量,比如 Hadoop 安装目录,Java 安装目录

Hadoop 的配置,采用分层控制策略。

  • 总策略配置,设置了不可写,这类配置文件放在顶级目录里:

core-default.xml, hdfs-default.xml, yarn-default.xml, mapred-default.xml.

  • 自定义配置的文件,用户可读可写,放在特定的目录里:

etc/hadoop/core-site.xml, etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml , etc/hadoop/mapred-site.xml.

  • 并且,还配置了影响 Hadoop 进程执行的环境变量控制文件:

etc/hadoop/hadoop-env.sh , etc/hadoop/yarn-env.sh.

前两层的配置,主要是针对 Hadoop 集群的配置,而最后一组控制文件,是针对 Hadoop 单个组件的进程做配置,控制的粒度更细,更偏单台服务器。

配置同一个 Hadoop 集群时,采用的策略是所有配置文件都用同一套。即配置一套,然后同步到 Master 和 Workder 节点。

下面就一一说明,配置文件中坑会遇到的细节和默认值,以便很好的配置 Hadoop 集群及其所在服务器环境。

节点服务器的环境控制:

这层的控制,主要通过 HADOOP_HOME/etc/hadoop/yarn-env.sh 来控制。那么这两个文件到底可以控制哪些环境变量呢?

Daemon

Environment Variable

NameNode

HDFS_NAMENODE_OPTS

DataNode

HDFS_DATANODE_OPTS

Secondary NameNode

HDFS_SECONDARYNAMENODE_OPTS

ResourceManager

YARN_RESOURCEMANAGER_OPTS

NodeManager

YARN_NODEMANAGER_OPTS

WebAppProxy

YARN_PROXYSERVER_OPTS

Map Reduce Job History Server

MAPRED_HISTORYSERVER_OPTS

$HADOOP_HOME 是 Hadoop 安装的本机地址

这地方要注意 2个问题:

  • 同一个Hadoop集群,共用同一份配置文件,通过 scp 就可以扩散到整个集群中

这很好理解。将同一份文件,传播给其他节点,或将所有节点上的进程,使用同一个命令来运行,正是分布式存储和计算要解决的问题。比如 YARN, 在分发计算包的时候,调用同样一个进程,来运算不同的数据集

  • 环境参数到底在控制什么

比如 HDFS_NAMENODE_OPTS,指定了使用 ParallevlGC ,并启动 4G Java 堆。

代码语言:javascript
复制
export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"

最后,节点服务器的环境配置,包含两个重要参数,HADOOP_HOME & JAVA_HOME.

HADOOP_HOME 是 Hadoop 安装的路径,省去每次执行 Hadoop 命令时,需要输入 Hadoop 所在的全路径名。相比 /opt/hadoop/bin/HDFS, 仅敲入 HDFS 简洁得多。

JAVA_HOME, 则可以在 Hadoop 服务账户的环境变量中配置,也可以在 hadoop-env.sh 中指定特定的 Java 版本。

节点服务器配置

再次说明,配置文件部署策略,是一组配置文件全局复用,而不用每个角色节点各自配置。

开头的那张架构图,一个完整的 Hadoop 集群,有四种组件存在于 Hadoop 集群中,NameNode, DataNode, Resource Manager, 和 Node Manager. 这四种各自有配置参数,互不影响。

真正核心的配置文件,也正是这四个:

  • core-site.xml
  • hdfs-site.xml
  • mapred-site.xml
  • yarn-site.xml

下面具体说细节。

  • $HADOOP_HOME/etc/hadoop/core-site.xml

Parameter

Value

Notes

fs.defaultFS

NameNode URI

hdfs://host:port/

io.file.buffer.size

131072

Size of read/write buffer used in SequenceFiles.

这里的 core-site 其实可以把 "-site" 去掉,配置的是集群的基本设定,全局唯一。比如 fs.defaultFS,指向的是 NameNode 所在的节点和端口位置,用来配置工作节点与主节点之间的通信;io.file.buffer.size 控制的是缓存单位,比如131072 是128K,写入时,数据满 128K 就会从内存写到磁盘上。

更详细的配置参数,看这里:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml

  • etc/hadoop/hdfs-site.xml

这个文件就需要分类来配置。hdfs 代表的是 Hadoop File System, 即 Hadoop 文件系统。HDFS 有两类节点, NameNode 与 DataNode. 这两类节点上的 Hadoop 进程,用到的参数是不一样的。

针对 NameNode 可用的配置参数有:

Parameter

Value

Notes

dfs.namenode.name.dir

Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently.

If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy.

针对 DataNode 可用的配置参数有:

Parameter

Value

Notes

dfs.datanode.data.dir

Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.

If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices.

其他 HDFS 服务器 参考配置:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

  • 分布式计算配置 YARN-site.xml

稍比 HDFS-site.xml 配置复杂一些。有三层配置:Resource Manager, Node Manager 共通的配置;Resource Manager 独有配置;Node Manager 独有配置。

共通的配置:

Parameter

Value

Notes

yarn.acl.enable

true / false

Enable ACLs? Defaults to false.

Resource Manager 配置:

Parameter

Value

Notes

yarn.resourcemanager.address

ResourceManager host:port for clients to submit jobs.

host:port If set, overrides the hostname set in yarn.resourcemanager.hostname.

yarn.resourcemanager.hostname

ResourceManager host.

host Single hostname that can be set in place of setting all yarn.resourcemanager*address resources. Results in default ports for ResourceManager components.

Node Manager 配置:

arameter

Value

Notes

yarn.nodemanager.log-dirs

Comma-separated list of paths on the local filesystem where logs are written.

Multiple paths help spread disk i/o.

yarn.nodemanager.remote-app-log-dir-suffix

logs

Suffix appended to the remote log dir. Logs will be aggregated to {user}/${thisParam} Only applicable if log-aggregation is enabled.

yarn.nodemanager.aux-services

mapreduce_shuffle

Shuffle service that needs to be set for Map Reduce applications.

更详细的配置参数,戳这里:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

可用的一套 Hadoop Cluster 配置:

上面说的是泛泛的配置原理,这里提供一套,亲测可用的配置文件组合。

这将是一套完整的配置文件组合:Hadoop 环境配置 + Hadoop Core/HDFS/YARN 配置

强烈建议:安装 visual studio code 用作文本编辑器

请根据自己需要,配置相关目录

代码语言:javascript
复制
--.bashrc


JAVA_HOME=/opt/java/jdk8
PATH=$PATH:$JAVA_HOME/bin

VSCODE_HOME=/opt/java/VSCode-linux-x64/bin
HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
PATH=$PATH:$VSCODE_HOME:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


export HADOOP_HOME
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export VSCODE_HOME 
export JAVA_HOME
export PATH
代码语言:javascript
复制
--$HADOOP_HOME/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/opt/java/jdk8
export HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2

代码语言:javascript
复制
-- $HADOOP_HOME/bin/hadoop

export HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
 
代码语言:javascript
复制
-- $HADOOP_HOME/etc/hadoop/core-site.xml


<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://namenode:9000</value>
    <description>the default name node address</description>
  </property>

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/Hadoop/tmp</value>
  </property>
</configuration>

代码语言:javascript
复制
-- $HADOOP_HOME/etc/hadoop/hdfs-site.xml


<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/opt/Hadoop/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/opt/Hadoop/datanode</value>
  </property>
  
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
</configuration>
代码语言:javascript
复制
-- $HADOOP_HOME/etc/hadoop/mapred-site.xml



<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  
  <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
  </property>

  <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=$HADOOP_NAME</value>
  </property>


  <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=$HADOOP_NAME</value>
  </property>

</configuration>



代码语言:javascript
复制
-- $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.acl.enable</name>
    <value>0</value>
  </property>

  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>192.168.31.10</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  
  <property>
    <name>yarn.application.classpath</name>
    <value>/opt/Hadoop/hadoop-3.2.2/etc/hadoop:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/*</value>
  </property>


</configuration>

代码语言:javascript
复制
-- $HADOOP_HOME/etc/hadoop/workers

nodea
nodeb

复制所有的 HADOOP_HOME/etc/hadoop 下。即可完成子节点的配置。

当然也要考虑整个用户级别的环境变量同步,即 ~/.bashrc 或者~/.bash_profile 同步, 或者其他设置环境变量文件的同步。

3 启动集群

整个 Hadoop 集群是由两部组成的, 分布式存储(HDFS)和分布式计算(YARN)。HDFS 是 YARN 得以施展魔法的前提存在,所以在 YARN 启动之前, HDFS 必定首先要存在。

就跟我们使用电脑是一模一样的,必须先把硬盘架起来,进行格式化,然后才是安装操作系统。此时,Hadoop 就像是刚配好的电脑,第一步首先要进行硬盘格式化,也就是 HDFS 的 namenode format:

代码语言:javascript
复制
hdfs namenode -format

然后打开 hadoop hdfs ,欢迎 YARN 服务的降临:

代码语言:javascript
复制
start-dfs.sh

试着给 HDFS 加一个自定义目录,用来操作测试文件:

代码语言:javascript
复制
HDFS dfs -mkdir -p /user/hadoop
HDFS dfs -ls 

通过访问 http://namenode:9870 以网页形式监控 hdfs 的运行情况

如果上面的 HDFS 测试没有问题,接下来就可以开始做 YARN 的启动:

代码语言:javascript
复制
start-yarn.sh

4 关闭集群

有两种方法,可以关闭一个 Hadoop 集群

第一种方法,依次关闭 YARN 和 HDFS:

代码语言:javascript
复制
stop-yarn.sh
stop-dfs.sh

第二种方法,执行一个脚本,关闭 YARN 和 HDFS:

代码语言:javascript
复制
stop-all.sh

5 遇到的问题

  • Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

这是 SSH 配置问题。实际上,每台服务器之间,都需要 SSH 无密登录,不仅仅是 master node 到 worker node 之间,任意一台 worker node 与 worker node 之间 worker node 与 master node 之间都需要配置。

除此之外,还需要设置 /etc/ssh/sshd_config:

代码语言:javascript
复制
PermisRootLogin no
PubkeyAuthentication yes

# GSSAPIAuthentication yes
# GSSAPICleanupCredentials no

UsePAM yes

每个节点都需要修改,这样 SSH 才能保证起作用。之后重新启动 ssh 服务:

代码语言:javascript
复制
systemctl restart sshd

并且修改 ~/.ssh/authorized_keys 的权限,

代码语言:javascript
复制
chmod 0600 ~/.ssh/authorized_keys

即便这样设置了,在启动 start-dfs.sh 时还会遇到同样的问题,看过这份 shell 脚本才知道,还需要把本机的 public key 加入到 authorized_keys 里面去:

代码语言:javascript
复制
cat ~/.ssh/id_rsa_namenode.pub >>authorized_Keys

/* +++++++++++++++++
id_rsa_namenode.pub 是在本次实验中,
充当 namenode 和 resource manager 的服务器上,
使用ssh-keygen 生成的公钥(public key)
+++++++++++++++++++*/

  • 没有 datanode, 即使start-dfs.sh/start-all.sh 已经完全成功运行

2021-04-03 03:09:45,554 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: namenode/192.168.31.10:9000 2021-04-03 03:09:49,551 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool ID needed, but service not yet registered with NN, trace: java.lang.Exception at org.apache.hadoop.hdfs.server.datanode.BPOfferService.getBlockPoolId(BPOfferService.java:214) at (此处省却Log信息)

搜索了无数的帖子,最后发现其实只要把 /etc/hosts 中的 127.0.0.1 去掉,就可以。

  • 没有找到可用的 nodemanager, 其实被防火墙给挡住,nodemanager 无法与 resource manager 通信
  • YarnChild class 没有找到,那是 因为 yarn-site.xml 没有配置 hadoop classpath 命令返回的路径

我在本次实验中,需要将如下的这些目录,赋值给 hadoop classpath:

/opt/Hadoop/hadoop-3.2.2/etc/hadoop: /opt/Hadoop/hadoop-3.2.2/share/hadoop/common/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/common/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs: /opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn: /opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/lib/: /opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/

其中, /opt/Hadoop/hadoop-3.2.2 就是本次实验安装的 hadoop 目录所在。

代码语言:javascript
复制
-- yarn-site.xml

<property>
    <name>yarn.application.classpath</name>
    <value>/opt/Hadoop/hadoop-3.2.2/etc/hadoop:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/common/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/hdfs/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/mapreduce/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/lib/*:/opt/Hadoop/hadoop-3.2.2/share/hadoop/yarn/*</value>
  </property>

wordcount 入门实例

WordCount 是大数据编程领域的 Hello World 实例,也是用来测试 Hadoop 有效性的实例之一。

它被封装在 Jar 包,通过“吃进”文本文件,“吐出”单词的总计数。所以做这个实验,需要准备文本文件, 在 HDFS 上创建存放这些文本文件的目录,同时还需创建 wordcount 的结果输出目录。

获取文本文件

从 gutenberg 下载文本文件,分别保存为 franklin.txt, herbert.txt, maria.txt. 要注意,这些文件是存在当前活动目录下。

代码语言:javascript
复制
wget -O franklin.txt http://www.gutenberg.org/files/13482/13482.txt
wget -O herbert.txt http://www.gutenberg.org/files/20220/20220.txt
wget -O maria.txt http://www.gutenberg.org/files/29635/29635.txt
创建HDFS相关目录

wordcount 会读取指定目录下所有文件,所以使用的输入输出两个目录,一定要分开创建。

代码语言:javascript
复制
hdfs dfs -mkdir -p /user/hadoop/wordcounter/input
hdfs dfs -mkdir -p /user/hadoop/wordcounter/output
上传文本文件到HDFS

一次性上传所有文本文件

代码语言:javascript
复制
hdfs dfs -put franklin.txt herbert.txt maria.txt /user/hadoop/wordcounter/input

检查文件是否上传到位:

代码语言:javascript
复制
[hadoopadmin@namenode ~]$ hdfs dfs -ls /user/hadoop/wordcounter/input
Found 3 items
-rw-r--r--   2 hadoopadmin supergroup     143220 2021-04-04 04:28 /user/hadoop/wordcounter/input/franklin.txt
-rw-r--r--   2 hadoopadmin supergroup     561609 2021-04-04 04:28 /user/hadoop/wordcounter/input/herbert.txt
-rw-r--r--   2 hadoopadmin supergroup     172797 2021-04-04 04:28 /user/hadoop/wordcounter/input/maria.txt

运行 wordcount 实例

使用 Yarn 来执行 wordcount 这里要注意,/user/hadoop/wordcounter/output/wordcountresult.txt 会被 wordcount 当做一个输出目录。这是我一开始疏忽的地方。由于 MapReduce 会产生大量的数据,单个文件在理论上不能存下,所以输出结果只能以目录为目标,目录下可以生成多个小文件,用来存放这些结果数据。

代码语言:javascript
复制
[hadoopadmin@namenode ~]$ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /user/hadoop/wordcounter/input/*.* /user/hadoop/wordcounter/output/wordcountresult.txt
2021-04-04 23:02:54,101 INFO client.RMProxy: Connecting to ResourceManager at namenode/192.168.31.10:8032
2021-04-04 23:02:55,042 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/hadoopadmin/.staging/job_1617530419259_0003
2021-04-04 23:02:55,263 INFO input.FileInputFormat: Total input files to process : 3
2021-04-04 23:02:55,367 INFO mapreduce.JobSubmitter: number of splits:3
2021-04-04 23:02:55,779 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1617530419259_0003
2021-04-04 23:02:55,780 INFO mapreduce.JobSubmitter: Executing with tokens: []
2021-04-04 23:02:56,511 INFO conf.Configuration: resource-types.xml not found
2021-04-04 23:02:56,511 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2021-04-04 23:02:56,950 INFO impl.YarnClientImpl: Submitted application application_1617530419259_0003
2021-04-04 23:02:57,027 INFO mapreduce.Job: The url to track the job: http://namenode:8088/proxy/application_1617530419259_0003/
2021-04-04 23:02:57,028 INFO mapreduce.Job: Running job: job_1617530419259_0003
2021-04-04 23:03:04,166 INFO mapreduce.Job: Job job_1617530419259_0003 running in uber mode : false
2021-04-04 23:03:04,167 INFO mapreduce.Job:  map 0% reduce 0%

  Total time spent by all maps in occupied slots (ms)=46766
  Total time spent by all reduces in occupied slots (ms)=2713
……(省去多余log信息)
  Peak Reduce Virtual memory (bytes)=2612924416
 Shuffle Errors
  BAD_ID=0
  CONNECTION=0
  IO_ERROR=0
  WRONG_LENGTH=0
  WRONG_MAP=0
  WRONG_REDUCE=0
 File Input Format Counters 
  Bytes Read=877626
 File Output Format Counters 
  Bytes Written=203817
[hadoopadmin@namenode ~]$ 

检查 wordcount 运行结果
代码语言:javascript
复制
[hadoopadmin@namenode ~]$ hdfs dfs -cat /user/hadoop/wordcounter/output/wordcountresult.txt/part-r-00000
...
end-organ 5
end-organ; 1
end-organs 12
end-organs, 3
end-organs. 2
end-organs: 1
end-organs_. 1
...

这里截取一段结果作为展示。

应用监控

Hadoop 主要分两类监控:HDFS 和 Yarn.

HDFS

它的访问地址是 http://namenode:9870namenode 是 HDFS 主控节点 name node(与 data node区分开来)机器名。

image.png

YARN

它的访问地址是 http://namenode:8088/cluster/namenode其实是 Resource Manager 所在的机器。

通过访问 Finished 页面,查看刚才运行的 wordcount 实例应用

小结

太长的技术文,直击了公众号的软肋。用线性的书写,表达网状的思维,挑战太大了。仅仅把文章搬到公众号上,就花了差不多近半小时。但对个人来讲,公众号又确实是发布个人观点的优秀窗口,值得花这个时间。

良好的阅读体验,能增加个人阅读兴趣。为此,我购买过一系列产品,kindle, mind pad, ipad pro 12, 硬件配置是上去了,但内容,却始终得不到很好得表现。比如我喜欢楷体,黄背景光,但几乎所有的阅读器,除了微信读书 ipad 版能令我满意,其他都缺点意思。

为了给大家更好的内容阅读体验,我把这份文章放在语雀上,地址如下:

https://www.yuque.com/books/share/4ab0cdd2-927d-491d-bd97-622b0d7c047a?# 《数据科学实践》

阅读风格是这样的

随机打开一个主题,可在右边侧栏,看到阅读的子标题

这样一来,阅读体验爆棚,还有另外的 3 个好处:

一,增加阅读的立体感;

二,方便以后局部更新;

三,你可以导出任何你喜欢的格式

希望各位看官喜欢!

--完--

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有关SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 CentOS 的虚拟化安装
  • 2 创建专属Hadoop软件的用户
  • 3 主从服务器之间的无密登录
  • 4 Java 环境搭建
  • 1 下载与安装
  • 2 配置文件
  • 3 启动集群
  • 4 关闭集群
  • 5 遇到的问题
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档