如果只是在小型企业中构架网络安全,单机的suricata、arkime等工具基本够用了。大型的企业,必然带来更大的需要分析的数据量,如果只是粗略统计一下,提取个别典型协议的少数要素,大致SiLK也就够了,但一旦需要细致的分析观察不同协议的多种要素,则如上篇所述,数据量将大大超出单机所能承受的水平,走向分布式集群化,几乎是必然的方向。
Hadoop可以算是分布式计算的地基了,大多数分布式计算平台和应用,其底层还是会使用Hadoop的组件,玩分布式,Hadoop是绕不开的一步。说起这个,十数年前机缘巧合之下选修过一门“网格计算”的课程——其实是太过粗心,选课的时候看成“网络计算”了,不过说实话内涵也差异不大,只不过主课老师知道此事以后不太高兴——也是我自己嘴瓢。那时云计算的概念才刚刚冒头,Hadoop还没有主宰天下,课程主要就是介绍各种类似的分布式系统,当然构建hadoop环境也是作业之一。那个时候构建hadoop相当麻烦,活活折腾一个星期也是至今记忆犹新,最后的结果也就是提交一个分布式程序,实在是未能引起我的兴趣。现在想想,估计也是象牙塔内,不知需求的潮头在何方罢了。如前所述,一旦把这件事放在一个领域的需求中,比如网络安全数据的分析,只要顺着需求,最终几乎必然求诸于Hadoop。回头看看,大数据为什么在电商行业找到蓬勃发展的土壤,实属因果必然。
一、Hadoop工作模式
网络上关于Hadoop安装的指南很多,比较头疼的一点在于Hadoop迭代版本不少,在几个大的版本之间安装配置的变化也不小,各种指南发布时间不一,配置方式各异,实在是很难判断选择。所以,为了准确起见,选择Hadoop的官方安装指南——虽然这份指南在集群化安装方面也语焉不详,但是在单节点安装上,还是具有指导意义的:
话说到这里,也就牵出来Hadoop的3种工作模式:
SingleNode 单节点模式。单节点模式顾名思义,就是在一台主机上安装Hadoop的主要组件,但更重要的是,所有组件在一个Java虚拟机进程中运行。单节点模式是Hadoop的默认模式,该模式对与Hadoop的调试非常有用。
Pseudo-Distributed 伪分布式模式。伪分布式模式也运行在一台主机上,不同与单节点模式的是,它运行在不同的、分离的Java虚拟机进程中——直观的区别就是,需要进行类似于分布式运行环境的配置文件编辑设置。
Fully-Distributed 完全分布式模式。完全分布式模式支持从几个几点到数千个节点的Hadoop工作集群配置。
一开始我也很纳闷一个分布式平台为什么非要搞出2个非分布式工作模式。实际上,不同的工作模式有其不同的用途,更重要的是,对于新手来说,3个工作模式也恰好是理解学习Hadoop安装部署的3个阶梯。
二、SingleNode模式的安装部署
1. Java环境安装
从前面关于工作模式的描述可知,Hadoop依赖于Java虚拟机环境,所以部署Hadoop,最为重要的一点(在单节点模式下可能是唯一的前提),是部署正确的Java环境。
根据官方说法,也是如此:
当然ssh在单节点模式下还用不着,后面再说。
(1) Hadoop与Java版本匹配:
Hadoop和Java环境都可以参考官方指示下载。
由于在CentOS中可以在线安装java环境,方便起见,这里仅下载了Hadoop-3.3.3:
[root@bogon ~]# wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz
--2022-08-11 23:09:04-- https://dlcdn.apache.org/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz
正在解析主机 dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644
正在连接 dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:645040598 (615M) [application/x-gzip]
正在保存至: “hadoop-3.3.3.tar.gz”
hadoop-3.3.3.tar.gz 0%[ ] 4.58M 47.5KB/s 剩余 3h 54m
很大,600多MB,从官方网站上要下载几个小时,最好是下好了存好。
根据官网描述,针对Hadoop-3.3.3,Java 8是可以支持的
当然也有一些不支持的特性,不过仅仅是简单的学习部署,似乎也没有碰上过:
(2)在CentoOS 8 Stream中安装Java 1.8.0
epel-release安装
在CentOS 8 中,可以在安装epel包的前提下,直接安装Java1.8.0。如同前面的离线安装方法一样,我们可以先下载安装包构建repo库,安装的时候指定对应的库进行安装。
[root@bogon ~]# yum install epel-release -y
CentOS Stream 8 - AppStream 3.5 MB/s | 24 MB 00:07
CentOS Stream 8 - BaseOS 5.4 MB/s | 25 MB 00:04
CentOS Stream 8 - Extras 10 kB/s | 18 kB 00:01
CentOS Stream 8 - Extras common packages 2.9 kB/s | 4.6 kB 00:01
依赖关系解决。
==================================================================================================
软件包 架构 版本 仓库 大小
==================================================================================================
安装:
epel-release noarch 8-11.el8 extras 24 k
事务概要
==================================================================================================
安装 1 软件包
总下载:24 k
安装大小:35 k
下载软件包:
epel-release-8-11.el8.noarch.rpm 33 kB/s | 24 kB 00:00
--------------------------------------------------------------------------------------------------
总计 15 kB/s | 24 kB 00:01
CentOS Stream 8 - Extras 1.6 MB/s | 1.6 kB 00:00
导入 GPG 公钥 0x8483C65D:
Userid: "CentOS (CentOS Official Signing Key) <security@centos.org>"
指纹: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
来自: /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
导入公钥成功
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
准备中 : 1/1
安装 : epel-release-8-11.el8.noarch 1/1
运行脚本: epel-release-8-11.el8.noarch 1/1
验证 : epel-release-8-11.el8.noarch 1/1
已安装:
epel-release-8-11.el8.noarch
完毕!
检查Java环境
在安装Java环境之前,首先需要检查CentOS是否自带了Java,如果自带,可能存在版本不符合情况,最好是先用rpm -e命令删除掉。
[root@bogon share]# java
bash: java: 未找到命令...
[root@bogon share]# rpm -qa|grep jdk
[root@bogon share]# rpm -qa|grep java
确认没有Java环境后,可以使用yum list一下可以安装的Java-1.8.0组件,这些都是需要安装的。
[root@bogon share]# yum list java-1.8*
上次元数据过期检查:0:19:09 前,执行于 2022年07月13日 星期三 09时56分06秒。
可安装的软件包
java-1.8.0-openjdk.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-accessibility.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-demo.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-headless-slowdebug.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-javadoc.noarch 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-javadoc-zip.noarch 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-slowdebug.x86_64 1:1.8.0.322.b06-11.el8 appstream
java-1.8.0-openjdk-src.x86_64 1:1.8.0.322.b06-11.el8 appstream
使用yum downloader下载,以便后面离线安装。
[root@bogon share]# yumdownloader java-1.8.0-openjdk*
Extra Packages for Enterprise Linux 8 - x86_64 1.8 MB/s | 13 MB 00:07
Extra Packages for Enterprise Linux Modular 8 - x86_64 319 kB/s | 465 kB 00:01
(1/10): java-1.8.0-openjdk-accessibility-1.8.0.322.b06-11.el8.x86 732 kB/s | 109 kB 00:00
(2/10): java-1.8.0-openjdk-1.8.0.322.b06-11.el8.x86_64.rpm 906 kB/s | 346 kB 00:00
(3/10): java-1.8.0-openjdk-demo-1.8.0.322.b06-11.el8.x86_64.rpm 1.5 MB/s | 2.0 MB 00:01
(4/10): java-1.8.0-openjdk-devel-1.8.0.322.b06-11.el8.x86_64.rpm 3.8 MB/s | 9.8 MB 00:02
(5/10): java-1.8.0-openjdk-javadoc-1.8.0.322.b06-11.el8.noarch.rp 3.1 MB/s | 15 MB 00:04
(6/10): java-1.8.0-openjdk-headless-1.8.0.322.b06-11.el8.x86_64.r 3.4 MB/s | 34 MB 00:10
(7/10): java-1.8.0-openjdk-slowdebug-1.8.0.322.b06-11.el8.x86_64. 1.3 MB/s | 351 kB 00:00
(8/10): java-1.8.0-openjdk-headless-slowdebug-1.8.0.322.b06-11.el 3.2 MB/s | 36 MB 00:11
(9/10): java-1.8.0-openjdk-javadoc-zip-1.8.0.322.b06-11.el8.noarc 4.2 MB/s | 42 MB 00:09
(10/10): java-1.8.0-openjdk-src-1.8.0.322.b06-11.el8.x86_64.rpm 5.4 MB/s | 46 MB 00:08
Java在线安装
估计是epel的某些配置的缘故,实际java的离线安装可能会存在一些问题,由于我们关注点并不在如何构建完备的repo库,所以偷懒取巧了——这里首先在线安装一下,看看问题在哪里:
[root@bogon share]# yum install java-1.8.0-openjdk* -y
上次元数据过期检查:0:02:56 前,执行于 2022年08月12日 星期五 01时09分48秒。
依赖关系解决。
==================================================================================================
软件包 架构 版本 仓库 大小
==================================================================================================
安装:
java-1.8.0-openjdk x86_64 1:1.8.0.322.b06-11.el8 @commandline 346 k
java-1.8.0-openjdk-accessibility x86_64 1:1.8.0.322.b06-11.el8 @commandline 109 k
java-1.8.0-openjdk-demo x86_64 1:1.8.0.322.b06-11.el8 @commandline 2.0 M
java-1.8.0-openjdk-devel x86_64 1:1.8.0.322.b06-11.el8 @commandline 9.8 M
java-1.8.0-openjdk-headless x86_64 1:1.8.0.322.b06-11.el8 @commandline 34 M
java-1.8.0-openjdk-headless-slowdebug
x86_64 1:1.8.0.322.b06-11.el8 @commandline 36 M
java-1.8.0-openjdk-javadoc noarch 1:1.8.0.322.b06-11.el8 @commandline 15 M
java-1.8.0-openjdk-javadoc-zip noarch 1:1.8.0.322.b06-11.el8 @commandline 42 M
java-1.8.0-openjdk-slowdebug x86_64 1:1.8.0.322.b06-11.el8 @commandline 351 k
java-1.8.0-openjdk-src x86_64 1:1.8.0.322.b06-11.el8 @commandline 46 M
安装依赖关系:
copy-jdk-configs noarch 4.0-2.el8 appstream 31 k
java-atk-wrapper x86_64 0.33.2-6.el8 appstream 86 k
javapackages-filesystem noarch 5.3.0-1.module_el8.0.0+11+5b8c10bd appstream 30 k
lksctp-tools x86_64 1.0.18-3.el8 baseos 100 k
ttmkfdir x86_64 3.0.9-54.el8 appstream 62 k
tzdata-java noarch 2022a-2.el8 appstream 191 k
xorg-x11-fonts-Type1 noarch 7.5-19.el8 appstream 522 k
启用模块流:
javapackages-runtime 201801
事务概要
==================================================================================================
安装 17 软件包
总计:186 M
总下载:1.0 M
安装大小:669 M
下载软件包:
(1/7): copy-jdk-configs-4.0-2.el8.noarch.rpm 128 kB/s | 31 kB 00:00
(2/7): javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd 97 kB/s | 30 kB 00:00
(3/7): java-atk-wrapper-0.33.2-6.el8.x86_64.rpm 254 kB/s | 86 kB 00:00
(4/7): ttmkfdir-3.0.9-54.el8.x86_64.rpm 224 kB/s | 62 kB 00:00
(5/7): tzdata-java-2022a-2.el8.noarch.rpm 560 kB/s | 191 kB 00:00
(6/7): lksctp-tools-1.0.18-3.el8.x86_64.rpm 504 kB/s | 100 kB 00:00
(7/7): xorg-x11-fonts-Type1-7.5-19.el8.noarch.rpm 992 kB/s | 522 kB 00:00
--------------------------------------------------------------------------------------------------
总计 593 kB/s | 1.0 MB 00:01
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
运行脚本: copy-jdk-configs-4.0-2.el8.noarch 1/1
运行脚本: java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 1/1
准备中 : 1/1
安装 : javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch 1/17
安装 : lksctp-tools-1.0.18-3.el8.x86_64 2/17
运行脚本: lksctp-tools-1.0.18-3.el8.x86_64 2/17
安装 : tzdata-java-2022a-2.el8.noarch 3/17
安装 : copy-jdk-configs-4.0-2.el8.noarch 4/17
安装 : java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 5/17
运行脚本: java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 5/17
安装 : java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 6/17
运行脚本: java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 6/17
安装 : ttmkfdir-3.0.9-54.el8.x86_64 7/17
安装 : xorg-x11-fonts-Type1-7.5-19.el8.noarch 8/17
运行脚本: xorg-x11-fonts-Type1-7.5-19.el8.noarch 8/17
安装 : java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 9/17
运行脚本: java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 9/17
安装 : java-atk-wrapper-0.33.2-6.el8.x86_64 10/17
安装 : java-1.8.0-openjdk-accessibility-1:1.8.0.322.b06-11.el8.x86_64 11/17
安装 : java-1.8.0-openjdk-demo-1:1.8.0.322.b06-11.el8.x86_64 12/17
安装 : java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 13/17
运行脚本: java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 13/17
安装 : java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 14/17
运行脚本: java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 14/17
安装 : java-1.8.0-openjdk-src-1:1.8.0.322.b06-11.el8.x86_64 15/17
安装 : java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch 16/17
安装 : java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarch 17/17
运行脚本: copy-jdk-configs-4.0-2.el8.noarch 17/17
运行脚本: java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 17/17
运行脚本: java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 17/17
运行脚本: java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 17/17
运行脚本: java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 17/17
运行脚本: java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 17/17
运行脚本: java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch 17/17
运行脚本: java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarch 17/17
验证 : copy-jdk-configs-4.0-2.el8.noarch 1/17
验证 : java-atk-wrapper-0.33.2-6.el8.x86_64 2/17
验证 : javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch 3/17
验证 : ttmkfdir-3.0.9-54.el8.x86_64 4/17
验证 : tzdata-java-2022a-2.el8.noarch 5/17
验证 : xorg-x11-fonts-Type1-7.5-19.el8.noarch 6/17
验证 : lksctp-tools-1.0.18-3.el8.x86_64 7/17
验证 : java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 8/17
验证 : java-1.8.0-openjdk-accessibility-1:1.8.0.322.b06-11.el8.x86_64 9/17
验证 : java-1.8.0-openjdk-demo-1:1.8.0.322.b06-11.el8.x86_64 10/17
验证 : java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 11/17
验证 : java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 12/17
验证 : java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 13/17
验证 : java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch 14/17
验证 : java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarch 15/17
验证 : java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 16/17
验证 : java-1.8.0-openjdk-src-1:1.8.0.322.b06-11.el8.x86_64 17/17
已安装:
copy-jdk-configs-4.0-2.el8.noarch
java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-accessibility-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-demo-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch
java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarch
java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-src-1:1.8.0.322.b06-11.el8.x86_64
java-atk-wrapper-0.33.2-6.el8.x86_64
javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch
lksctp-tools-1.0.18-3.el8.x86_64
ttmkfdir-3.0.9-54.el8.x86_64
tzdata-java-2022a-2.el8.noarch
xorg-x11-fonts-Type1-7.5-19.el8.noarch
完毕!
离线安装Java环境
如上文所说,直接使用createrepo的方法并不顺利:
[root@localhost ~]# yum install java-1.8.0-openjdk* -y
上次元数据过期检查:0:05:44 前,执行于 2022年08月12日 星期五 01时44分14秒。
依赖关系解决。
================================================================================
软件包 架构 版本 仓库 大小
================================================================================
安装:
java-1.8.0-openjdk x86_64 1:1.8.0.322.b06-11.el8 base 346 k
java-1.8.0-openjdk-accessibility x86_64 1:1.8.0.322.b06-11.el8 base 109 k
java-1.8.0-openjdk-demo x86_64 1:1.8.0.322.b06-11.el8 base 2.0 M
java-1.8.0-openjdk-devel x86_64 1:1.8.0.322.b06-11.el8 base 9.8 M
java-1.8.0-openjdk-headless x86_64 1:1.8.0.322.b06-11.el8 base 34 M
java-1.8.0-openjdk-headless-slowdebug x86_64 1:1.8.0.322.b06-11.el8 base 36 M
java-1.8.0-openjdk-javadoc noarch 1:1.8.0.322.b06-11.el8 base 15 M
java-1.8.0-openjdk-javadoc-zip noarch 1:1.8.0.322.b06-11.el8 base 42 M
java-1.8.0-openjdk-slowdebug x86_64 1:1.8.0.322.b06-11.el8 base 351 k
java-1.8.0-openjdk-src x86_64 1:1.8.0.322.b06-11.el8 base 46 M
安装依赖关系:
copy-jdk-configs noarch 4.0-2.el8 base 31 k
java-atk-wrapper x86_64 0.33.2-6.el8 base 86 k
javapackages-filesystem noarch 5.3.0-1.module_el8.0.0+11+5b8c10bd
base 30 k
lksctp-tools x86_64 1.0.18-3.el8 base 100 k
ttmkfdir x86_64 3.0.9-54.el8 base 62 k
tzdata-java noarch 2022a-2.el8 base 191 k
xorg-x11-fonts-Type1 noarch 7.5-19.el8 base 522 k
事务概要
================================================================================
安装 17 软件包
总计:186 M
安装大小:669 M
下载软件包:
运行事务检查
对于模块软件包 'javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch' 没有可用的模块元数据,它将不能被安装至此系统上
错误:对于模块软件包没有可用的模块元数据
对比yumdownloader下载和实际安装过程,容易发现真正的安装过程中还安装了7个依赖项 copy-jdk-configs、 java-atk-wrapper、 javapackages-filesystem、lksctp-tools、ttmkfdir 、tzdata-java、xorg-x11-fonts-Type1。但在离线安装过程中,自建的repodata没有识别这7个依赖项,也就是说,这7个包是需要手动下载和安装的。 【具体是何原因,此处也没有深究,如有知晓,望不吝赐教】
所以,依次在在线环境中下载下来:
[root@bogon share]# yumdownloader copy-jdk-configs-4.0-2.el8.noarch
上次元数据过期检查:0:18:02 前,执行于 2022年08月12日 星期五 01时09分48秒。
copy-jdk-configs-4.0-2.el8.noarch.rpm 592 kB/s | 31 kB 00:00
[root@bogon share]# yumdownloader javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch
上次元数据过期检查:0:18:30 前,执行于 2022年08月12日 星期五 01时09分48秒。
javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch 343 kB/s | 30 kB 00:00
[root@bogon share]# yumdownloader lksctp-tools-1.0.18-3.el8.x86_64
上次元数据过期检查:0:18:47 前,执行于 2022年08月12日 星期五 01时09分48秒。
lksctp-tools-1.0.18-3.el8.x86_64.rpm 977 kB/s | 100 kB 00:00
[root@bogon share]# yumdownloader tzdata-java-2022a-2.el8.noarch
上次元数据过期检查:0:19:07 前,执行于 2022年08月12日 星期五 01时09分48秒。
tzdata-java-2022a-2.el8.noarch.rpm 1.0 MB/s | 191 kB 00:00
[root@bogon share]# yumdownloader xorg-x11-fonts-Type1-7.5-19.el8.noarch
上次元数据过期检查:0:19:41 前,执行于 2022年08月12日 星期五 01时09分48秒。
xorg-x11-fonts-Type1-7.5-19.el8.noarch.rpm 1.1 MB/s | 522 kB 00:00
[root@bogon share]# yumdownloader ttmkfdir-3.0.9-54.el8.x86_64
上次元数据过期检查:0:20:47 前,执行于 2022年08月12日 星期五 01时09分48秒。
ttmkfdir-3.0.9-54.el8.x86_64.rpm 675 kB/s | 62 kB 00:00
[root@bogon share]# yumdownloader java-atk-wrapper-0.33.2-6.el8.x86_64
上次元数据过期检查:0:21:34 前,执行于 2022年08月12日 星期五 01时09分48秒。
java-atk-wrapper-0.33.2-6.el8.x86_64.rpm 373 kB/s | 86 kB 00:00
[root@bogon share]#
对这7个依赖包中除java-atk-wrapper外的6个,使用rpm命令逐次安装:
[root@bogon share]# rpm -ivh copy-jdk-configs-4.0-2.el8.noarch.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:copy-jdk-configs-4.0-2.el8 ################################# [100%]
[root@bogon share]# rpm -ivh ttmkfdir-3.0.9-54.el8.x86_64.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:ttmkfdir-3.0.9-54.el8 ################################# [100%]
[root@bogon share]# rpm -ivh tzdata-java-2022a-2.el8.noarch.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:tzdata-java-2022a-2.el8 ################################# [100%]
[root@bogon share]# rpm -ivh xorg-x11-fonts-Type1-7.5-19.el8.noarch.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:xorg-x11-fonts-Type1-7.5-19.el8 ################################# [100%]
[root@bogon share]# rpm -ivh lksctp-tools-1.0.18-3.el8.x86_64.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:lksctp-tools-1.0.18-3.el8 ################################# [100%]
[root@bogon share]# rpm -ivh javapackages-filesystem-5.3.0-1.module_el8.0.0+11+5b8c10bd.noarch.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:javapackages-filesystem-5.3.0-1.m################################# [100%]
然后安装Java:
[root@bogon share]# yum install java-1.8.0-openjdk* -y
上次元数据过期检查:0:16:42 前,执行于 2022年08月12日 星期五 01时44分14秒。
依赖关系解决。
================================================================================
软件包 架构 版本 仓库 大小
================================================================================
安装:
java-1.8.0-openjdk x86_64 1:1.8.0.322.b06-11.el8 @commandline 346 k
java-1.8.0-openjdk-accessibility
x86_64 1:1.8.0.322.b06-11.el8 @commandline 109 k
java-1.8.0-openjdk-demo x86_64 1:1.8.0.322.b06-11.el8 @commandline 2.0 M
java-1.8.0-openjdk-devel x86_64 1:1.8.0.322.b06-11.el8 @commandline 9.8 M
java-1.8.0-openjdk-headless x86_64 1:1.8.0.322.b06-11.el8 @commandline 34 M
java-1.8.0-openjdk-headless-slowdebug
x86_64 1:1.8.0.322.b06-11.el8 @commandline 36 M
java-1.8.0-openjdk-javadoc noarch 1:1.8.0.322.b06-11.el8 @commandline 15 M
java-1.8.0-openjdk-javadoc-zip
noarch 1:1.8.0.322.b06-11.el8 @commandline 42 M
java-1.8.0-openjdk-slowdebug x86_64 1:1.8.0.322.b06-11.el8 @commandline 351 k
java-1.8.0-openjdk-src x86_64 1:1.8.0.322.b06-11.el8 @commandline 46 M
安装依赖关系:
java-atk-wrapper x86_64 0.33.2-6.el8 base 86 k
事务概要
================================================================================
安装 11 软件包
总计:185 M
安装大小:667 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
运行脚本: java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 1/1
准备中 : 1/1
安装 : java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 1/11
运行脚本: java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 1/11
安装 : java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 2/11
运行脚本: java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 2/11
安装 : java-atk-wrapper-0.33.2-6.el8.x86_64 3/11
安装 : java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el 4/11
运行脚本: java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el 4/11
安装 : java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 5/11
运行脚本: java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 5/11
安装 : java-1.8.0-openjdk-accessibility-1:1.8.0.322.b06-11.el8.x86 6/11
安装 : java-1.8.0-openjdk-demo-1:1.8.0.322.b06-11.el8.x86_64 7/11
安装 : java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 8/11
运行脚本: java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 8/11
安装 : java-1.8.0-openjdk-src-1:1.8.0.322.b06-11.el8.x86_64 9/11
安装 : java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarc 10/11
安装 : java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch 11/11
运行脚本: java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 11/11
运行脚本: java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 11/11
运行脚本: java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el 11/11
运行脚本: java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 11/11
运行脚本: java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 11/11
运行脚本: java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarc 11/11
运行脚本: java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch 11/11
验证 : java-atk-wrapper-0.33.2-6.el8.x86_64 1/11
验证 : java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64 2/11
验证 : java-1.8.0-openjdk-accessibility-1:1.8.0.322.b06-11.el8.x86 3/11
验证 : java-1.8.0-openjdk-demo-1:1.8.0.322.b06-11.el8.x86_64 4/11
验证 : java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64 5/11
验证 : java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64 6/11
验证 : java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el 7/11
验证 : java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch 8/11
验证 : java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarc 9/11
验证 : java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64 10/11
验证 : java-1.8.0-openjdk-src-1:1.8.0.322.b06-11.el8.x86_64 11/11
已安装:
java-1.8.0-openjdk-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-accessibility-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-demo-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-devel-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-headless-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-headless-slowdebug-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-javadoc-1:1.8.0.322.b06-11.el8.noarch
java-1.8.0-openjdk-javadoc-zip-1:1.8.0.322.b06-11.el8.noarch
java-1.8.0-openjdk-slowdebug-1:1.8.0.322.b06-11.el8.x86_64
java-1.8.0-openjdk-src-1:1.8.0.322.b06-11.el8.x86_64
java-atk-wrapper-0.33.2-6.el8.x86_64
完毕!
[root@bogon share]#
这次能够比较顺利的安装,并且把java-atk-wrpper一并安装上。
检查安装是否成功
安装完成后,执行一下java,并查看java的路径,以确认安装成功:
[root@bogon share]# which java
/usr/bin/java
[root@bogon share]# java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (build 25.322-b06, mixed mode)
[root@bogon share]#
2. 解压并配置Hadoop
单节点下,Hadoop的安装配置相对简单,核心其实就配置Java环境这一点。
(1)解压Hadoop
解压之前下载的hadoop的压缩包:
[root@bogon ~]# pwd
/root
[root@bogon ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg initial-setup-ks.cfg
模板 图片 下载 桌面 share
[root@bogon ~]# tar zxvf share/hadoop-3.3.3.tar.gz
…………
…………
[root@bogon ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg initial-setup-ks.cfg
模板 图片 下载 桌面 hadoop-3.3.3 share
方便起见,更改解压出来的目录名称为hadoop:
[root@bogon ~]# mv hadoop-3.3.3 hadoop
[root@bogon ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg initial-setup-ks.cfg
模板 图片 下载 桌面 hadoop share
[root@bogon ~]#
(2)配置Hadoop的Java环境
从前面执行which java的命令可得到java的工作目录为/usr/bin/java,所以需要编辑hadoop安装目录下的etc/hadoop/hadoop-env.sh文件。
[root@bogon ~]# cd hadoop/
[root@bogon hadoop]# ls
bin include libexec licenses-binary NOTICE-binary README.txt share
etc lib LICENSE-binary LICENSE.txt NOTICE.txt sbin
[root@bogon hadoop]# cd etc
[root@bogon etc]# cd hadoop/
[root@bogon hadoop]# pwd
/root/hadoop/etc/hadoop
[root@bogon hadoop]# ls
capacity-scheduler.xml kms-log4j.properties
configuration.xsl kms-site.xml
container-executor.cfg log4j.properties
core-site.xml mapred-env.cmd
hadoop-env.cmd mapred-env.sh
hadoop-env.sh mapred-queues.xml.template
hadoop-metrics2.properties mapred-site.xml
hadoop-policy.xml shellprofile.d
hadoop-user-functions.sh.example ssl-client.xml.example
hdfs-rbf-site.xml ssl-server.xml.example
hdfs-site.xml user_ec_policies.xml.template
httpfs-env.sh workers
httpfs-log4j.properties yarn-env.cmd
httpfs-site.xml yarn-env.sh
kms-acls.xml yarnservice-log4j.properties
kms-env.sh yarn-site.xml
[root@bogon hadoop]# vim hadoop-env.sh
将其中注释的export JAVA_HOME一行解除注释,并设置为对应的java目录,注意bin不要有,设为/usr就行,hadoop的配置文件会自动加上bin这一级的目录。
###
# Generic settings for HADOOP
###
# Technically, the only required environment variable is JAVA_HOME.
# All others are optional. However, the defaults are probably not
# preferred. Many sites configure these options outside of Hadoop,
# such as in /etc/profile.d
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/usr
# Location of Hadoop. By default, Hadoop will attempt to determine
# this location based upon its execution path.
# export HADOOP_HOME=
# Location of Hadoop's configuration information. i.e., where this
# file is living. If this is not defined, Hadoop will attempt to
# locate it based upon its execution path.
配置完成后在hadoop安装目录下执行bin/hadoop,如果java环境配置有错,则会报错,比如多加了bin目录的情况下:
[root@bogon hadoop]# bin/hadoop
ERROR: /usr/bin/bin/java is not executable.
正确情况下,应该会给出hadoop的帮助:
[root@bogon hadoop]# bin/hadoop
Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
or hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
where CLASSNAME is a user-provided Java class
OPTIONS is none or any of:
buildpaths attempt to add class files from build tree
--config dir Hadoop config directory
--debug turn on shell script debug mode
--help usage information
hostnames list[,of,host,names] hosts to use in slave mode
hosts filename list of hosts to use in slave mode
loglevel level set the log4j level for this command
workers turn on worker mode
SUBCOMMAND is one of:
Admin Commands:
daemonlog get/set the log level for each daemon
Client Commands:
archive create a Hadoop archive
checknative check native Hadoop and compression libraries availability
classpath prints the class path needed to get the Hadoop jar and the
required libraries
conftest validate configuration XML files
credential interact with credential providers
distch distributed metadata changer
distcp copy file or directories recursively
dtutil operations related to delegation tokens
envvars display computed Hadoop environment variables
fs run a generic filesystem user client
gridmix submit a mix of synthetic job, modeling a profiled from
production load
jar <jar> run a jar file. NOTE: please use "yarn jar" to launch YARN
applications, not this command.
jnipath prints the java.library.path
kdiag Diagnose Kerberos Problems
kerbname show auth_to_local principal conversion
key manage keys via the KeyProvider
rumenfolder scale a rumen input trace
rumentrace convert logs into a rumen trace
s3guard manage metadata on S3
trace view and modify Hadoop tracing settings
version print the version
Daemon Commands:
kms run KMS, the Key Management Server
registrydns run the registry DNS server
SUBCOMMAND may print help when invoked w/o parameters or with -h.
3.执行示例程序
在hadoop安装目录下的share/hadoop/mapreduce子目录下,有一些标准的mapreduce示例,我们可以用它来进一步检查hadoop是否已经安装好。以经典的正则命中统计为例。
(1)准备输入文件夹
将etc/hadoop子目录下的xml作为单词统计的输入材料,在hadoop安装目录下构建一个input目录,把这些xml文件拷贝进去。
[root@bogon hadoop]# mkdir input
[root@bogon hadoop]# cp etc/hadoop/*.xml input
[root@bogon hadoop]# ls input
capacity-scheduler.xml hadoop-policy.xml hdfs-site.xml kms-acls.xml mapred-site.xml
core-site.xml hdfs-rbf-site.xml httpfs-site.xml kms-site.xml yarn-site.xml
(2)执行示例
[root@bogon hadoop]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar grep input output 'dfs[a-z.]+'
hadoop 使用 jar作为参数时,指运行一个jar文件,后跟jar文件的地址,再其后是jar文件mapreduce程序的参数了,大意包括input路径,output路径,然后是grep一个正则表达式。即以dfs打头跟随多个a到z中任意字符的模板进行匹配。
输出信息很多,大致如下,这里就不全贴了:
[root@bogon hadoop]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar grep input output 'dfs[a-z.]+'
2022-08-12 08:48:15,446 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
2022-08-12 08:48:15,527 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
……………………………………
2022-08-12 08:48:16,017 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214396(104857584); length = 1/6553600
2022-08-12 08:48:16,023 INFO mapred.MapTask: Finished spill 0
2022-08-12 08:48:16,031 INFO mapred.Task: Task:attempt_local1761871804_0001_m_000000_0 is done. And is in the process of committing
2022-08-12 08:48:16,032 INFO mapred.LocalJobRunner: map
2022-08-12 08:48:16,032 INFO mapred.Task: Task 'attempt_local1761871804_0001_m_000000_0' done.
2022-08-12 08:48:16,036 INFO mapred.Task: Final Counters for attempt_local1761871804_0001_m_000000_0: Counters: 18
File System Counters
FILE: Number of bytes read=294005
FILE: Number of bytes written=920614
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
Map-Reduce Framework
Map input records=275
Map output records=1
Map output bytes=17
Map output materialized bytes=25
Input split bytes=106
Combine input records=1
Combine output records=1
Spilled Records=1
Failed Shuffles=0
Merged Map outputs=0
GC time elapsed (ms)=0
Total committed heap usage (bytes)=214433792
File Input Format Counters
Bytes Read=11765
2022-08-12 08:48:16,036 INFO mapred.LocalJobRunner: Finishing task: attempt_local1761871804_0001_m_000000_0
……………………………………
2022-08-12 08:48:17,935 INFO mapreduce.Job: map 100% reduce 100%
2022-08-12 08:48:17,936 INFO mapreduce.Job: Job job_local404996045_0002 completed successfully
2022-08-12 08:48:17,942 INFO mapreduce.Job: Counters: 30
File System Counters
FILE: Number of bytes read=1200994
FILE: Number of bytes written=3672544
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
Map-Reduce Framework
Map input records=1
Map output records=1
Map output bytes=17
Map output materialized bytes=25
Input split bytes=116
Combine input records=0
Combine output records=0
Reduce input groups=1
Reduce shuffle bytes=25
Reduce input records=1
Reduce output records=1
Spilled Records=2
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=0
Total committed heap usage (bytes)=656408576
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=123
File Output Format Counters
Bytes Written=23
[root@bogon hadoop]#
cat一下output下的输出,结果如下:
[root@bogon hadoop]# ls output
part-r-00000 _SUCCESS
[root@bogon hadoop]# cat output/*
1 dfsadmin
[root@bogon hadoop]#
基本上到这一步就可以确定Singlenode的hadoop安装成功。
(3)执行示例的解析
现在还是需要弄明白一个问题,刚才执行的那一大串究竟是在干啥?
把share/hadoop/mapreduce下的hadoop-mapreduce-examples-3.3.3.jar文件解压出来看看:
容易看出,实际grep参数的含义,就是执行jar文件中的Grep.class,而这个Grep.class的源文件,就在share/hadoop/mapreduce/sources下的hadoop-mapreduce-examples-3.3.3-sources.jar中。同样,解压弄出来后,找到Grep.java文件,其中的内容如下:
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.examples;
import java.util.Random;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.mapreduce.lib.map.InverseMapper;
import org.apache.hadoop.mapreduce.lib.map.RegexMapper;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/* Extracts matching regexs from input files and counts them. */
这里注释给出了该类实现的功能,即根据正则从输入文件中匹配,并计数。
Grep类继承自Configured,实现Tool接口
public class Grep extends Configured implements Tool {
private Grep() {} // singleton
public int run(String[] args) throws Exception {
if (args.length < 3) {
System.out.println("Grep <inDir> <outDir> <regex> [<group>]"); 这里能够看出Grep的参数要求,和之前我们输入时一致的。如果输入参数有错,这里会报错并退出。
ToolRunner.printGenericCommandUsage(System.out);
return 2;
}
Path tempDir =
new Path("grep-temp-"+
Integer.toString(new Random().nextInt(Integer.MAX_VALUE)));
Configuration conf = getConf();
conf.set(RegexMapper.PATTERN, args[2]);
if (args.length == 4)
conf.set(RegexMapper.GROUP, args[3]);
Job grepJob = Job.getInstance(conf);
try {
grepJob.setJobName("grep-search");
grepJob.setJarByClass(Grep.class);
FileInputFormat.setInputPaths(grepJob, args[0]);
grepJob.setMapperClass(RegexMapper.class);
grepJob.setCombinerClass(LongSumReducer.class);
grepJob.setReducerClass(LongSumReducer.class);
FileOutputFormat.setOutputPath(grepJob, tempDir);
grepJob.setOutputFormatClass(SequenceFileOutputFormat.class);
grepJob.setOutputKeyClass(Text.class);
grepJob.setOutputValueClass(LongWritable.class);
grepJob.waitForCompletion(true);
Job sortJob = Job.getInstance(conf);
sortJob.setJobName("grep-sort");
sortJob.setJarByClass(Grep.class);
FileInputFormat.setInputPaths(sortJob, tempDir);
sortJob.setInputFormatClass(SequenceFileInputFormat.class);
sortJob.setMapperClass(InverseMapper.class);
sortJob.setNumReduceTasks(1); // write a single file
FileOutputFormat.setOutputPath(sortJob, new Path(args[1]));
sortJob.setSortComparatorClass( // sort by decreasing freq
LongWritable.DecreasingComparator.class);
sortJob.waitForCompletion(true);
}
finally {
FileSystem.get(conf).delete(tempDir, true);
}
return 0;
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new Grep(), args);
System.exit(res);
}
}
具体MapReduce程序的内容留待后面再说。这里,只需要知道,Grep实际是继承了Configured类并实现了Tool接口,这样就可以使用ToolRunner直接调用起来,并且,内部通过名为GrebJob的Job对象执行了正则类的内部MR操作,通过名为sortJob的Job对象执行了排序操作后输出结果。
本来打算一文到底,结果发现内容实在太多,分段写吧。第一部分到此为止,预知后事如何,倾听下回分解……