0%

[TOC]

1 前言

1.1 为什么要集成Hive和HBase?

Kylin的三大依赖模块分别是数据源、构建引擎和存储引擎。默认这三者分别是Hive、MapReduce和HBase。但随着调研和使用的深入,渐渐有用户发现它们均存在不足之处。

比如 Hive 不应该用来进行实时的查询,因为它需要很长时间才可以返回结果。同时想要将数据实时的插入hive中则完全没有可操作性。

至于 HBase虽然非常适用于海量明细数据(十亿、百亿)的随机实时查询但只提供了简单的基于 Key 值的快速查询能力—,没法进行大量的条件查询,对于数据分析来说,不太友好。

在大数据架构中,Hive和HBase是协作关系,Hive方便地提供了Hive QL的接口来简化MapReduce的使用, 而HBase提供了低延迟的数据库访问。如果两者结合,可以利用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析。

2 Hive集成HBase的原理

Hive 整合 hbase 为用户提供一种 sqlOnHbase 的方法。Hive 与 HBase 整合的实现是利用两者本身对外的 API 接口互相通信来完成的,其具体工作交由 Hive 的 lib 目录中的 hive-hbase-handler-xxx.jar 工具类来实现对 HBase 数据的读取。

通过HBaseStorageHandler,Hive可以获取到Hive表所对应的HBase表名,列簇和列,InputFormat、OutputFormat类,创建和删除HBase表等。

Hive访问HBase中HTable的数据,实质上是通过MR读取HBase的数据,而MR是使用HiveHBaseTableInputFormat完成对表的切分,获取RecordReader对象来读取数据的。

对HBase表的切分原则是一个Region切分成一个Split,即表中有多少个Regions,MR中就有多少个Map;

读取HBase表数据都是通过构建Scanner,对表进行全表扫描,如果有过滤条件,则转化为Filter。当过滤条件为rowkey时,则转化为对rowkey的过滤;Scanner通过RPC调用RegionServer的next()来获取数据。

3 使用场景

4 整合

因为Hive与HBase集成是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-.jar工具类来实现。所以只需要将hive的 hive-hbase-handler-.jar 复制到hbase/lib中就可以了。

1
cp /usr/local/hive/lib/hive-hbase-handler-2.3.7.jar /usr/local/hbase/lib/

: 如果在hive整合hbase中,出现版本之类的问题,那么以hbase的版本为主,将hbase中的jar包覆盖hive的jar包。

4.1 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Hive 语句
create table t_employee(id int,name string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,st1:name")
tblproperties("hbase.table.name"="t_employee","hbase.mapred.output.outputtable" = "t_employee");

# hbase 语句
list
describe 't_employee'
# 返回结果
Table t_employee is ENABLED
t_employee
COLUMN FAMILIES DESCRIPTION
{NAME => 'st1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE'
, MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0260 seconds

说明:

  1. 这里面出现了三个t_employee表名,第一个t_employee 是hive表中的名称,(id int,name string) 是hive表结构。

    在tblproperties 语句中还出现了2个t_employee表,”hbase.table.name”定义的是在hbase中的表名 ,这个属性是可选的,仅当你想在Hive和Hbase中使用不同名字的表名时才需要填写,如果使用相同的名字则可以省略;

    “hbase.mapred.output.outputtable”定义的第三个t_employee是存储数据表的名称,指定插入数据时写入的表,如果以后需要往该表插入数据就需要指定该值,这个可以不要,表数据就存储在第二个表中了 。

  2. stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ :是指定处理的存储器,就是hive-hbase-handler-*.jar包,要做hive和hbase的集成必须要加上这一句;

  3. “hbase.columns.mapping” 是定义在hive表中的字段怎么与hbase的列族进行映射。

    例如:st1就是列族,name就是列。它们之间通过“:”连接。

    在hive中创建的t_employee表,包括两个字段(int型的id和string型的name),映射为hbase中的表t_employee,其中:key对应hbase的rowkey,value对应hbase的st1:name列。

4.2 字段映射

控制HBase字段和Hive之间的映射有两种SERDEPROPERTIES:

  • hbase.columns.mapping
  • hbase.table.default.storage.type,可以是string(default)或binary中的任一个,指定这个选项只有在Hive 0.9之后可使用.

目前所支持的字段映射多少是有些难处理或存在约束的:

  • 对于每一个Hive字段,表的创建者必须用逗号分隔的字符串(hbase.columns.mapping)指定对应的入口(Hive表有n个字段,则该字符串得指定n个入口),在各个入口之间不能由空格(因为空格会被解析成字段名中的一部分)。
  • 映射入口必须是以下两者之一:行健或**’列族名:[列名][#(binary|string)]’**
    • 如果没有指定类型,则直接使用hbase.table.default.storage.type的值
    • 合法值的的前缀也是合法的(例如#b表示#binary)
    • 如果指定某字段为binary,则对应的HBase中的单元格则应该是HBase的Bytes类的内容组成
  • 必须要有确切的行健映射
  • 如果没有指定列名,则默认使用Hive的字段名作为HBase中的列名

4.3 数据同步测试

进入hbase之后,在t_employee中添加两条数据 然后查询该表

1
2
3
put 't_employee','1001','st1:name','zhaoqian'
put 't_employee','1002','st1:name','sunli'
scan 't_employee'

查询结果:

Hive%E9%9B%86%E6%88%90HBase%20%E8%AF%A6%E8%A7%A3%20100037f2aa264a2c835a0530a373a912/Untitled.png

然后切换到hive中查询该表

Hive%E9%9B%86%E6%88%90HBase%20%E8%AF%A6%E8%A7%A3%20100037f2aa264a2c835a0530a373a912/Untitled%201.png

至此,hive 集成hbase 就到此告一段落。

参考资源

如何整合hive和hbase

Hive与HBase的集成实践

[[hbase-1-4-13-安装部署]]

[[hive2-3-7安装]]

[TOC]

1. Hive注释中文乱码

创建表的时候,comment说明字段包含中文,表成功创建成功之后,中文说明显示乱码

1
2
3
4
5
6
7
8
create table if not exists capacity_stats_live_access (
id bigint comment '主键',
device_num varchar(100) COMMENT '设备号',
start_time timestamp COMMENT '调阅开始时间',
finish_time timestamp COMMENT '调阅结束时间',
duration int COMMENT '耗时,单位秒',
response int COMMENT '调用结果 1.成功 0.失败'
) COMMENT '直播调阅日志统计';

Hive%E6%B3%A8%E9%87%8A%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%2044812d6495e341f4aec7117aac2ec503/Untitled.png

这是因为在MySQL中的元数据出现乱码

2. 针对元数据库metastore中的表,分区,视图的编码设置

因为我们知道 metastore 支持数据库级别,表级别的字符集是 latin1

Hive%E6%B3%A8%E9%87%8A%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%2044812d6495e341f4aec7117aac2ec503/Untitled%201.png

那么我们只需要把相应注释的地方的字符集由 latin1 改成 utf-8,就可以了。用到注释的就三个地方,表、分区、视图。如下修改分为两个步骤:

2.1. 进入数据库 Metastore 中执行以下 5 条 SQL 语句

修改表字段注解和表注解 COLUMNS_V2TABLE_PARAMS

修改分区字段注解 PARTITION_PARAMSPARTITION_KEYS

修改索引注解INDEX_PARAMS

2.2. 修改 metastore 的连接 URL

修改hive-site.xml配置文件

1
2
3
4
5
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://IP:3306/db_name?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>

2.3. 验证

Hive%E6%B3%A8%E9%87%8A%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%2044812d6495e341f4aec7117aac2ec503/Untitled%202.png

发现注释还是乱码。

把表删除然后重新创建。效果如下:

Hive%E6%B3%A8%E9%87%8A%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%2044812d6495e341f4aec7117aac2ec503/Untitled%203.png

【Hive教程】(二)Hive数据类型和存储格式

Apache Software Foundation

Hive复合数据类型array,map,struct的使用_Life is for sharing的博客-CSDN博客

HIVE数据类型

毕竟HIVE穿着SQL的外壳,肯定支持诸如Mysql这种RDBMS的数据类型,如int,varchar,但是它还具有非常多自有的数据类型,包括复杂的数据类型(数组,Map等)也是支持的!

Hive 支持的数据类型 - 摘自官网wiki

数字类型,日期类型,String类型,Boolean类型我们都是比较熟悉的,也比较简单,就不讲解了。演示一下复杂数据类型:

arrays

1
2
3
hive (hive)> create table arraytest (id int,course array<string>)
> row format delimited fields terminated by','
> collection items terminated by':';

说明:

  • row format delimited fields terminated by',' 是指定列与列之间的分隔符,此处为”,”
  • collection items terminated by':' 是指定集合内元素之间的分隔符,此处为”:”

因此我们要导入到hive中的数据应该是形如:

1
2
1,math:chinese
2,english:history

数据加载到数据库

1
2
3
4
hive> load data local inpath '/Users/fengxuechao/WorkSpace/software/hive_data/arraytest.txt' into table arraytest;
Loading data to table default.arraytest
OK
Time taken: 0.963 seconds

查询所有数据:

1
2
3
4
5
hive> select * from arraytest;
OK
1 ["math","chinese"]
2 ["english","history"]
Time taken: 1.297 seconds, Fetched: 2 row(s)

查询数组指定索引的所有数据:

1
2
3
4
5
hive> select course[1] from arraytest;
OK
chinese
history
Time taken: 0.364 seconds, Fetched: 2 row(s)

maps

创建表

1
2
3
4
5
6
hive> create table maptest(name string,score map<string,float>)
> row format delimited fields terminated by','
> collection items terminated by '|'
> map keys terminated by':';
OK
Time taken: 0.046 seconds

数据

1
2
'小明',math:96|chinese:95
'小红',math:80|chinese:99

数据加载到数据库

1
2
3
4
hive> load data local inpath '/Users/fengxuechao/WorkSpace/software/hive_data/maptest.txt' into table maptest;
Loading data to table default.maptest
OK
Time taken: 0.293 seconds

查询所有数据:

1
2
3
4
5
hive> select * from maptest;
OK
'小明' {"math":96.0,"chinese":95.5}
'小红' {"math":80.0,"chinese":99.0}
Time taken: 0.1 seconds, Fetched: 2 row(s)

查询数组指定key的所有数据:

1
2
3
4
5
hive> select name,score['math'] from maptest;
OK
'小明' 96.0
'小红' 80.0
Time taken: 0.112 seconds, Fetched: 2 row(s)

structs

创建表

1
2
3
4
5
hive> create table struct_test(name string,course struct<course:string,score:int>)
> row format delimited fields terminated by ','
> collection items terminated by ':';
OK
Time taken: 0.047 seconds

数据

1
2
小明,math:79
小红,math:80

数据加载到数据库

1
2
3
4
hive> load data local inpath '/Users/fengxuechao/WorkSpace/software/hive_data/struct_test.txt' into table struct_test;
Loading data to table default.struct_test
OK
Time taken: 0.293 seconds

查询所有数据:

1
2
3
4
5
6
7
8
9
10
hive> select * from struct_test;
OK
小明 {"course":"math","score":79}
小红 {"course":"math","score":80}
Time taken: 0.097 seconds, Fetched: 2 row(s)
hive> select name,course.course,course.score from struct_test;
OK
小明 math 79
小红 math 80
Time taken: 0.213 seconds, Fetched: 2 row(s)

[TOC]

介绍

随着移动互联网、物联网等技术的发展,近些年人类所积累的数据正在呈爆炸式的增长,大数据时代已经来临。但是海量数据的收集只是大数据技术的第一步,如何让数据产生价值才是大数据领域的终极目标。Hadoop的出现解决了数据存储问题,但如何对海量数据进行OLAP查询,却一直令人十分头疼。

企业中的查询大致可分为即席查询和定制查询两种。之前出现的很多OLAP引擎,包括Hive、Presto、SparkSQL等,虽然在很大程度上降低了数据分析的难度,但它们都只适用于即席查询的场景。它们的优点是查询灵活,但是随着数据量和计算复杂度的增长,响应时间不能得到保证。而定制查询多数情况下是对用户的操作做出实时反应,Hive等查询引擎动辄数分钟甚至数十分钟的响应时间显然是不能满足需求的。在很长一段时间里,企业只能对数据仓库中的数据进行提前计算,再将算好后的结果存储在MySQL等关系型数据库中,再提供给用户进行查询。但是当业务复杂度和数据量逐渐升高后,使用这套方案的开发成本和维护成本都显著上升。因此,如何对已经固化下来的查询进行亚秒级返回一直是企业应用中的一个痛点。

在这种情况下,Apache Kylin应运而生。不同于“大规模并行处理”(Massive Parallel Processing,MPP)架构的Hive、Presto等,Apache Kylin采用“预计算”的模式,用户只需要提前定义好查询维度,Kylin将帮助我们进行计算,并将结果存储到HBase中,为海量数据的查询和分析提供亚秒级返回,是一种典型的“空间换时间”的解决方案。Apache Kylin的出现不仅很好地解决了海量数据快速查询的问题,也避免了手动开发和维护提前计算程序带来的一系列麻烦。

Apache Kylin™是一个开源的、分布式的分析型数据仓库,提供 Hadoop 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc.开发并贡献至开源社区。

Kylin 架构

如果想要知道Kylin是如何实现超大数据集的秒级多维分析查询,那么就得了解Kylin的架构原理。
Kylin实现秒级查询的关键点是预计算,对于超大数据集的复杂查询,既然现场计算需要花费较长时间,那么根据空间换时间的原理,我们就可以提前将所有可能的计算结果计算并存储下来,把高复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询,比如把本该进行的Join、Sum、CountDistinct等操作改写成Cube的查询操作。从而实现超大数据集的秒级多维分析查询。

image-20200924112848747

  • REST Server:
    REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。 另外可以通过Restful接口实现SQL查询。
  • 查询引擎(Query Engine):
    当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。
    在Kylin当中,我们使用一套名为Apache Calcite的开源动态数据管理框架对代码内的SQL以及其它插入内容进行解析。(Calcite最初被命名为Optiq,由Julian Hyde所编写,但如今已经成为Apache孵化器项目之一。)
  • Routing
    负责将解析的SQL生成的执行计划转换成cube缓存的查询,cube是通过预计算缓存在hbase中,这部分查询可以在秒级设置毫秒级完成,而且还有一些操作使用过的查询原始数据(存储在Hadoop的hdfs中通过hive查询)。这部分查询延迟较高。
  • 元数据管理工具(Metadata Manager)
    Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础。 Kylin的元数据存储在hbase中。
  • 任务引擎(Cube Build Engine):
    这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及Map Reduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。
  • 存储引擎(Storage Engine)
    这套引擎负责管理底层存储——特别是cuboid,其以键-值对的形式进行保存。存储引擎使用的是HBase——这是目前Hadoop生态系统当中最理想的键-值系统使用方案。Kylin还能够通过扩展实现对其它键-值系统的支持,例如Redis。

预计算大概流程就是:将数据源中的数据按照指定的维度和指标,由计算引擎MapReduce离线计算出所有可能的查询结果(即Cube)存储到HBase中。HBase中每行记录的Rowkey由维度组成,度量会保存在 column family中。为了减小存储代价,这里会对维度和度量进行编码。查询阶段,利用HBase列存储的特性就可以保证Kylin有良好的快速响应和高并发。

需要注意的是:Kylin的三大依赖模块分别是数据源、构建引擎和存储引擎。默认这三者分别是Hive、MapReduce和HBase。但随着推广和使用的深入,渐渐有用户发现它们均存在不足之处。比如,实时分析可能会希望从Kafka导入数据而不是从Hive;而Spark的迅速崛起,又使我们不得不考虑将MapReduce替换为Spark,以期大幅提高Cube的构建速度;至于HBase,它的读性能可能还不如Cassandra或Kudu等。因此Kylin1.5版本的系统架构进行了重构,将数据源、构建引擎、存储引擎三大依赖抽象为接口,而Hive、MapReduce、HBase只是默认实现。深度用户可以根据自己的需要做二次开发,将其中的一个或多个替换为更适合的技术。

安装Kylin

单节点安装

1
ln -s /opt/apache-kylin-3.1.0-bin-hbase1x /usr/local/kylin

配置环境变量

1
vi /etc/profile
1
2
3
KYLIN_HOME=/usr/local/kylin
export KYLIN_HOME
PATH=$PATH:$JAVA_HOME/bin:$KYLIN_HOME/bin
1
source /etc/proifle

macOS遇到的问题

1
bin/check-env.sh

此处mac有坑,因为检查脚本使用的是gnu的一些命令,和mac上的命令不同。所以需要安装gnu命令:

1
2
brew install gnu-sed
brew install findutils

启动

1
2
3
4
5
6
7
8
# 检查环境
/usr/local/kylin/bin/check-env.sh
# 启动
/usr/local/kylin/bin/kylin.sh start
# 样例
/usr/local/kylin/bin/sample.sh
# 重启
/usr/local/kylin/bin/kylin.sh restart

image-20200924103518462

核心概念

数据仓库

OLAP

维度和度量

Cube和Cuboid

事实表和维度表

星形模型

Hive介绍

官网:hive.apache.org/

Apache Hive™数据仓库软件有助于使用SQL读取,编写和管理驻留在分布式存储中的大型数据集。可以将结构投影到已存储的数据中。提供了命令行工具JDBC驱动程序以将用户连接到Hive。

hive提供了SQL查询功能 hdfs分布式存储。

hive本质HQL转化为MapReduce程序。

Hive 安装前提

  1. 启动 hdfs 集群
  2. 启动 yarn 集群
  3. 启动 mysql

如果想用hive的话,需要提前安装部署好hadoop集群。

安装 Hive

1
ln -s /opt/apache-hive-2.3.7-bin /usr/local/hive

编辑环境变量

1
vi /etc/profile
1
2
3
HIVE_HOME=/usr/local/hive
export HIVE_HOME
PATH=$JAVA_HOME/bin:$HIVE_HOME/bin

配置 hive-site.xml

1
2
cd /usr/local/hive
vi conf/hive-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>

<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>

下面的部分如果不配置会产生错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive</value>
<description>Local scratch space for Hive jobs</description>
</property>

<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/hive-downloaded-addDir/</value>
<description>Temporary local directory for added resources in the remote file system. </description>
</property>

<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/querylog-location-addDir/</value>
<description>Location of Hive run time structured log file</description>
</property>

<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/hive-logging-operation-log-addDir/</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>

<!-- hiveserver2 的配置 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>localhost</value>
</property>

配置 hive-env.sh

1
2
3
4
5
# 添加
export JAVA_HOME=/usr/local/java
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf

修改hive-log4j.properties

1
vi hive-log4j.properties
1
hive.log.dir=自定义目录

下载并配置 mysql 驱动包

1
cp /mnt/share/mysql-connector-java-5.1.47.jar /usr/local/hive/lib/

初始化元数据

1
/usr/local/hive/bin/schematool -dbType mysql -initSchema

启动 Hive

1
/usr/local/hive/bin/hive

测试

1
2
3
4
create table users(user_id int,username varchar(20),pwd varchar(20),email varchar(30),grade int);
insert into users(user_id,username,pwd,email,grade)values(1,'admin','1234','admin@qq.com',2);
insert into users(user_id,username,pwd,email,grade)values(2,'admin2','1234','admin2@qq.com',2);

[TOC]

认识HBase

HBase介绍

HBase = Hadoop database,Hadoop数据库
开源数据库
官网:hbase.apache.org/
HBase源于Google的BigTable
Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。
当需要对大数据进行随机、实时读/写访问时,请使用Apache HBase™。该项目的目标是托管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上。Apache HBase是一个开源的,分布式的,版本化的非关系数据库nosql,模仿Google的Bigtable: Chang等人的结构化数据分布式存储系统。正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似Bigtable的功能。
HBase可执行基于Yarn平台的计算任务,但不擅长。

< !–more–>

HBase集群角色

  • HDFS:
    • NameNode——主节点
    • DataNode——数据存储节点
  • Yarn:
    • ResourceManager——全局的资源管理器
    • NodeManager——分节点资源和任务管理器
  • HBase:
    • HMaster
      • 负责Table表和RegionServer的监控管理工作
      • 处理元数据的变更
      • 对HRegionServer进行故障转移
      • 空闲时对数据进行负载均衡处理
      • 管理Region
      • 借助ZooKeeper发布位置到客户端
    • HRegionServer
      • 负责Table数据的实际读写
      • 刷新缓存数据到HDFS
      • 处理Region
      • 可以进行数据压缩
      • 维护Hlog
      • Region分片

hbase 架构

image-20200916184659443

HRegionServer结构:

  • HLog:存储HBase的修改记录
  • HRegion:根据rowkey(行键,类似id)分割的表的分片
  • Store:对应HBase表中的一个列族,可存储多个字段
  • HFile:真正的存储文件
  • MemStore:保存当前的操作
  • ZooKeeper:存放数据的元数据信息,负责维护RegionServer中保存的元数据信息
  • DFS Client:存储数据信息到HDFS集群中

安装

前期准备

  • Hadoop集群环境
  • ZooKeeper集群环境

服务器分配

主机名 IP
centos-node1 192.168.99.101
centos-node2 192.168.99.102
centos-node3 192.168.99.103

解压安装文件到指定目录

1
$ tar -zxvf hbase-1.4.13.tar.gz -C 目标目录

修改配置文件

hbase-env.sh

1
$ vi hbase-env.sh
1
2
3
4
5
6
7
8
9
10
# The java implementation to use.  Java 1.7+ required.
export JAVA_HOME=jdk安装路径

# 注释掉以下语句(jdk1.8中不需要这个配置)
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

# Tell HBase whether it should manage it's own instance of Zookeeper or not.
# 关闭HBase自带的ZooKeeper
export HBASE_MANAGES_ZK=false

hbase-site.xml

1
$ vi hbase-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<configuration>
<!-- 设置namenode所在位置(HDFS中存放的路径) -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://centos-node1:9000/hbase</value>
</property>

<!-- 是否开启集群 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

<!-- HBase-0.9.8之前默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>

<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>

<property>
<name>hbase.regionserver.port</name>
<value>16201</value>
</property>

<property>
<name>hbase.regionserver.info.port</name>
<value>16301</value>
</property>

<!-- zookeeper集群的位置 -->
<property>
<name>hbase.zookeeper.quorum</name>
<!-- 注意不要有空格 -->
<value>centos-node1,centos-node2,centos-node3</value>
</property>

<!-- hbase的元数据信息存储在zookeeper的位置 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper/data</value>
</property>
</configuration>

regionservers

加入节点主机名

1
2
3
centos-node1
centos-node2
centos-node3

解决依赖问题

1
2
3
$ cd /usr/local/hbase/lib
$ rm -fr hadoop-*
$ rm -fr zookeeper-*

把相关版本的zookeeper和hadoop的依赖包导入到hbase/lib

软链接hadoop配置

1
2
$ ln -s /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/hbase/conf/core-site.xml
$ ln -s /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hbase/conf/hdfs-site.xml

复制到其他节点

1
2
$ scp -r /usr/local/hbase centos-node2:/usr/local/
$ scp -r /usr/local/hbase centos-node3:/usr/local/

配置环境变量

1
$ vi /etc/profile
1
2
3
4
5
6
7
8
9
10
JAVA_HOME=/usr/local/java/
JRE_HOME=$JAVA_HOME/jre
HADOOP_HOME=/usr/local/hadoop
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
ZOOKEEPER_HOME=/usr/local/zookeeper
HBASE_HOME=/usr/local/hbase

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$HBASE_HOME/bin

export JAVA_HOME JRE_HOME PATH CLASSPATH HADOOP_HOME ZOOKEEPER_HOME HBASE_HOME
1
$ source /etc/profile

修改防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看当前区域
$ firewall-cmd --get-active-zones
# 新建一个自定义服务(端口不全)
$ firewall-cmd --new-service=hbase --permanent
$ firewall-cmd --service=hbase --add-port 16000/tcp --permanent
$ firewall-cmd --service=hbase --add-port 16010/tcp --permanent
$ firewall-cmd --service=hbase --add-port 16201/tcp --permanent
$ firewall-cmd --service=hbase --add-port 16301/tcp --permanent
$ firewall-cmd --service=hbase --add-port 2181/tcp --permanent
# 不中断服务的重新加载
$ firewall-cmd --reload
$ firewall-cmd --add-service=hbase
# 将当前防火墙的规则永久保存;
$ firewall-cmd --runtime-to-permanent

或者

1
2
$ systemctl stop firewalld
$ systemctl disable firewalld

启动集群

  • 启动主节点
    • hbase-daemon.sh start master
  • 启动从节点
    • hbase-daemon.sh start regionserver

关闭集群

  • 关闭主节点
    • hbase-daemon.sh stop master
  • 关闭从节点
    • hbase-daemon.sh stop regionserver

UI 展示

image-20200921184311647

hbase shell的一些命令

1
2
# 进入终端
$ hbase shell

image-20200921185108081

1
2
# 查询表
$ list

image-20200921185132638

1
2
# 显示服务器状态
$ status

image-20200921185249611

1
2
# 显示当前用户
$ whoami

image-20200921185450703

1
2
# 创建表
$ create '表名', '列族1', '列族2'

image-20200921185551041

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 表的一些操作
# 全表扫描
$ scan '表名'
# 指定Rowkey扫描
$ scan '表名', {STARTROW => 'Rowkey值', STOPROW => 'Rowkey值'}
# 查看表结构
$ describe '表名'
# 修改表结构信息
$ alter '表名', {NAME => '列族名', 变更字段名 => ' '}
# 查询指定数据信息
# 指定具体的rowkey
$ get '表名', 'rowkey'
# 指定具体的列
$ get '表名', 'rowkey', '列族:列名'
# 统计表行数
$ count '表名'
# 根据Rowkey进行统计
$ count '表名', 'rowkey'
# 表中添加数据信息。HBase只有覆盖没有修改,覆盖时对应表名、rowkey、列族、列名字段,输入新的值信息
$ put '表名', 'rowkey', '列族:列名', '值'
# 清空表
$ truncate '表名'
# 删除表
# 指定表不可用
$ disable '表名'
# 删除
$ drop '表名'
# 退出终端
$ exit
$ quit

参考资源

[TOC]

下载

下载地址:http://zookeeper.apache.org/

下载过程就不说了,我们下载了最新的zookeeper-3.4.14

安装

1、上传安装包

把下载的最新的包(如:zookeeper-3.4.14.tar.gz)上传到服务器,上传的方式也不多说了。

2、解压

1
$ tar zxvf zookeeper-3.4.14.tar.gz

3、移动到/usr/local目录下

1
$ ln -s zookeeper-3.4.14 /usr/local/zookeeper

服务器分配

主机名 IP
centos-node1 192.168.99.101
centos-node2 192.168.99.102
centos-node3 192.168.99.103

集群配置

Zookeeper集群原则上需要2n+1个实例才能保证集群有效性,所以集群规模至少是3台。

下面演示如何创建3台的Zookeeper集群,N台也是如此。

1、创建数据文件存储目录

1
2
$ cd /usr/local/zookeeper
$ mkdir data

2、添加主配置文件

1
2
$ cd conf
$ cp zoo_sample.cfg zoo.cfg

3、修改配置

1
$ vi zoo.cfg

先把dataDir=/tmp/zookeeper注释掉,然后添加以下核心配置。

1
2
3
4
dataDir=/usr/local/zookeeper/data
server.1=centos-node1:2888:3888
server.2=centos-node2:2888:3888
server.3=centos-node3:2888:3888

4、创建myid文件

1
2
3
$ cd ../data
$ touch myid
$ echo "1">>myid

每台机器的myid里面的值对应server.后面的数字x。

5、开放3个端口

使用 iptables

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo /sbin/iptables -I INPUT -p tcp --dport 2181 -j ACCEPT
$ sudo /sbin/iptables -I INPUT -p tcp --dport 2888 -j ACCEPT
$ sudo /sbin/iptables -I INPUT -p tcp --dport 3888 -j ACCEPT

$ sudo /etc/rc.d/init.d/iptables save
$ sudo /etc/init.d/iptables restart

$ sudo /sbin/iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3888
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:2888
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:2181

或者 firewalld

1
2
3
4
5
6
7
8
9
10
11
12
# 查看当前区域
$ firewall-cmd --get-active-zones
# 新建一个自定义服务
$ firewall-cmd --new-service=zookeeper --permanent
$ firewall-cmd --service=zookeeper --add-port 2181/tcp --permanent
$ firewall-cmd --service=zookeeper --add-port 2888/tcp --permanent
$ firewall-cmd --service=zookeeper --add-port 3888/tcp --permanent
# 不中断服务的重新加载
$ firewall-cmd --reload
$ firewall-cmd --add-service=zookeeper
# 将当前防火墙的规则永久保存;
$ firewall-cmd --runtime-to-permanent

6、配置集群其他机器

把配置好的Zookeeper目录复制到其他两台机器上,重复上面4-5步。

1
$ scp -r /usr/local/zookeeper centos-node2:/usr/local/
1
$ vi /etc/profile 
1
2
3
4
5
6
7
8
9
JAVA_HOME=/usr/local/java/
JRE_HOME=$JAVA_HOME/jre
HADOOP_HOME=/usr/local/hadoop
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
ZOOKEEPER_HOME=/usr/local/zookeeper

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin

export JAVA_HOME JRE_HOME PATH CLASSPATH HADOOP_HOME HBASE_HOME

7、重启集群

1
$ /usr/local/zookeeper/bin/zkServer.sh start

3个Zookeeper都要启动。

8、查看集群状态

1
2
3
4
$ /usr/local/zookeeper/bin/zkServer.sh status 
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

客户端连接

1
./zkCli.sh -server 192.168.99.101:2181

连接本机的不用带-server。

注意

如果是在单机创建的多个Zookeeper伪集群,需要对应修改配置中的端口、日志文件、数据文件位置等配置信息。

upstream 指令参数 max_conns

限制每台server的连接数,用于保护避免过载,可起到限流作用。测试参考配置如下:

1
2
3
4
5
6
7
# worker进程设置1个,便于测试观察成功的连接数
worker_processes 1;
upstream tomcats {
server 192.168.1.173:8080 max_conns=2;
server 192.168.1.174:8080 max_conns=2;
server 192.168.1.175:8080 max_conns=2;
}

upstream 指令参数 slow_start

配置了这个参数,他会覆盖权重,慢慢从0开始到正常值。

*商业版,需要付费*

配置参考如下:

1
2
3
4
5
6
upstream tomcats { 
server 192.168.1.173:8080 weight=6 slow_start=60s;
# server 192.168.1.190:8080;
server 192.168.1.174:8080 weight=2;
server 192.168.1.175:8080 weight=2;
}

注意:

  • 该参数不能使用在hashrandom load balancing 中。
  • 如果在 upstream 中只有一台 server,则该参数失效。

upstream 指令参数 down、backup

down 用于标记服务节点不可用:

1
2
3
4
5
6
upstream tomcats { 
server 192.168.1.173:8080 down;
# server 192.168.1.190:8080;
server 192.168.1.174:8080 weight=1;
server 192.168.1.175:8080 weight=1;
}

**backup**表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到:

1
2
3
4
5
6
upstream tomcats { 
server 192.168.1.173:8080 backup;
# server 192.168.1.190:8080;
server 192.168.1.174:8080 weight=1;
server 192.168.1.175:8080 weight=1;
}

注意:

  • backup参数不能使用在hashrandom load balancing 中。

upstream 指令参数 max_fails、fail_timeout

**max_fails**:表示失败几次,则标记server已宕机,剔出上游服务。

**fail_timeout**:表示失败的重试时间。假设目前设置如下:

1
max_fails=2 fail_timeout=15s

则代表在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后再过15秒,这15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复。

[Toc]

Hadoop 2.7.4 完全分布式安装与部署

Hadoop官方指导传送门 传送门

服务器准备

服务器规划,提供 3 台服务器,OS 为centos 7

主机名 IP 预备分配服务
centos-node1 192.168.99.101 DataNode,NodeManager,NameNode
centos-node2 192.168.99.102 DataNode,NodeManager,SecondaryNameNode
centos-node3 192.168.99.103 DataNode,NodeManager,ResourceManager,HistoryServer

修改主机名

1
$ hostnamectl set-hostname centos-node1

修改服务器静态IP

可以使用 netstat -r 来查询网关如下图所示:

image-20200911142643578

然后将 dhcp 改为 静态IP

1
$ vim /etc/sysconfig/network-scripts/ifcfg-enp0s8

完全配置如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
#BOOTPROTO="dhcp"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s8"
UUID="5b4ea2f4-a5af-4fac-8793-81692730dad9"
DEVICE="enp0s8"
ONBOOT="yes"

# 新增
GATEWAY=192.168.99.0 # 修改网关,虚拟机需要注意修改nat
IPADDR=192.168.99.101 # 分配IP地址
NETMASK=255.255.255.0 # 子网掩码
DNS1=223.5.5.5 # 使用阿里公共DNS1
DNS2=223.6.6.6 # 使用阿里公共DNS2

修改 hosts

1
2
3
4
5
$ vi /etc/hosts
# 添加
192.168.99.101 centos-node1
192.168.99.102 centos-node2
192.168.99.103 centos-node3

安装 JDK8

1
2
3
4
5
6
7
$ vi /etc/profile
# 添加
JAVA_HOME=/usr/local/java/
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

增加 dhfs 用户

通常,建议HDFS和YARN以单独的用户身份运行。

在大多数安装中,HDFS进程以 “hdfs” 执行。YARN通常使用 “yarn” 帐户

1
2
$ adduser hdfs
$ passwd hdfs # 修改密码

/etc/sudoers添加如下图所示:

image-20200911170014063

设置 SSH 无密码登录

  1. 3 台服务器全部设置

    1
    $ ssh-keygen -t rsa
  2. 各自分配 ssh key

    1
    2
    3
    $ ssh-copy-id centos-node1
    $ ssh-copy-id centos-node2
    $ ssh-copy-id centos-node3

安装部署 Hadoop

切换至 hdfs 用户

1
$ su - hdfs

下载

1
$ curl -O https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

解压

1
2
3
$ tar -zxf hadoop-2.7.4.tar.gz  -C /opt/hadoop-2.7.4
$ ln -s /opt/hadoop-2.7.4 /usr/local/hadoop
$ chown -R hdfs /opt/hadoop-2.7.4

修改环境变量

1
2
3
4
5
6
7
8
9
10
$ sudo vi /etc/profile
# 修改为
JAVA_HOME=/usr/local/java/
JRE_HOME=$JAVA_HOME/jre
HADOOP_HOME=/usr/local/hadoop
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin

export JAVA_HOME JRE_HOME PATH CLASSPATH HADOOP_HOME

修改 Hadoop 配置

这里我们进入$HADOOP_HOME文件夹开始操作

1
2
$ mkdir -p $HADOOP_HOME/hdfs/data
$ mkdir -p $HADOOP_HOME/tmp

配置hadoop-env.sh

1
$ sudo vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

增加 或 修改

1
export JAVA_HOME=/usr/local/java/

配置core-site.xml

1
$ sudo vi $HADOOP_HOME/etc/hadoop/core-site.xml

configuration配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://centos-node1:9000</value>
<description>HDFS的URI,文件系统://namenode标识:端口号</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
<description>namenode上本地的hadoop临时文件夹</description>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.zhaoshb.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.zhaoshb.groups</name>
<value>*</value>
</property>
</configuration>

配置说明:

fs.defaultFSNameNode的地址。

hadoop.tmp.dirhadoop临时目录的地址。默认情况下,NameNodeDataNode的数据文件都会存在这个目录下的对应子目录下。

配置hdfs-site.xml

1
$ sudo vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>centos-node2:50090</value>
</property>
<property>
<name>dfs.http.address</name>
<value>centos-node1:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>

配置说明:

dfs.namenode.secondary.http-address是指定secondaryNameNode的http访问地址和端口号,因为在规划中,我们将centos-node2规划为SecondaryNameNode服务器。

dfs.http.address配置的是本机默认的dfs地址,有些服务器可以不用配置,我的试过了,必须加上,不然后续网页打不开。

dfs.namenode.name.dir 指定name文件夹。

dfs.datanode.data.dir 指定data文件夹。

dfs.datanode.data.dir 指定副本数,一般小于服务器数,我们设置为3

配置 slaves

hadoop2.x中叫做slaves,在3.x版本中改名workers。 用来指定HDFS上有哪些DataNode节点,以及各个节点使用ip地址或者主机名,用换行分隔。

1
$ sudo vi $HADOOP_HOME/etc/hadoop/slaves

这里我们就使用主机名

1
2
3
centos-node1
centos-node2
centos-node3

配置yarn-site.xml

1
$ sudo vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>centos-node3</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>106800</value>
</property>
<name>yarn.application.classpath</name>
<value>
/opt/hadoop-2.7.4/etc/hadoop,
/opt/hadoop-2.7.4/share/hadoop/common/*,
/opt/hadoop-2.7.4/share/hadoop/common/lib/*,
/opt/hadoop-2.7.4/share/hadoop/hdfs/*,
/opt/hadoop-2.7.4/share/hadoop/hdfs/lib/*,
/opt/hadoop-2.7.4/share/hadoop/mapreduce/*,
/opt/hadoop-2.7.4/share/hadoop/mapreduce/lib/*,
/opt/hadoop-2.7.4/share/hadoop/yarn/*,
/opt/hadoop-2.7.4/share/hadoop/yarn/lib/*
</value>
</configuration>

配置说明:

按照规划使用centos-node3做为 resourcemanager 使用yarn.log-aggregation-enable开启日志聚合,yarn.log-aggregation.retain-seconds配置聚集的日志在HDFS上最多保存多长时间。

配置mapred-site.xml

1
$ sudo vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<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_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
<name>mapreduce.jobhistory.address</name>
<value>centos-node3:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>centos-node3:19888</value>
</property>
</configuration>

配置说明:

mapreduce.framework.name设置mapreduce任务运行在yarn上。

mapreduce.jobhistory.address是设置mapreduce的历史服务器安装在centos-node3上。

mapreduce.jobhistory.webapp.address是设置历史服务器的web页面地址和端口号。

yarn.app.mapreduce.am.env,mapreduce.map.env,mapreduce.reduce.env需要设置为HADOOP_MAPRED_HOME=${HADOOP_HOME},否则在运行yarn程序的时候会出现jar包未找到的错误。

修改防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看当前区域
$ firewall-cmd --get-active-zones
# 新建一个自定义服务
$ firewall-cmd --new-service=hadoop --permanent
$ firewall-cmd --service=hadoop --add-port 4000/tcp --permanent
$ firewall-cmd --service=hadoop --add-port 8088/tcp --permanent
$ firewall-cmd --service=hadoop --add-port 50090/tcp --permanent
$ firewall-cmd --service=hadoop --add-port 50070/tcp --permanent
$ firewall-cmd --service=hadoop --add-port 10020/tcp --permanent
$ firewall-cmd --service=hadoop --add-port 19888/tcp --permanent
# 不中断服务的重新加载
$ firewall-cmd --reload
$ firewall-cmd --add-service=hadoop
# 将当前防火墙的规则永久保存;
$ firewall-cmd --runtime-to-permanent

启动 Hadoop 集群

完成上述所有必要的配置后,将文件分发到所有服务器的HADOOP_CONF_DIR目录下/usr/local/hadoop/etc/hadoop。在所有计算机上,该目录应该是相同的目录。

注意:启动和停止单个hdfs相关的进程使用的是”hadoop-daemon.sh”脚本,而启动和停止yarn使用的是”yarn-daemon.sh”脚本。

格式化

要启动Hadoop集群,需要同时启动HDFSYARN集群。 首次启动HDFS时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs.

1
$ $HADOOP_HOME/bin/hdfs namenode -format <群集名称>

集群名称可以不填写,不出意外,执行完成后$HADOOP_HOME/hdfs中就有东西了。

启动 HDFS

如果配置了slavesssh互信我们可以

1
$ $HADOOP_HOME/sbin/start-dfs.sh

启动 YARN

如果配置了workers和ssh互信我们可以

1
$ $HADOOP_HOME/sbin/start-yarn.sh

启动 ResourceManager

规划在centos-node3上,因此我们在centos-node3上执行

1
$ $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager

启动 HistoryServer

规划在centos-node3上,因此我们在centos-node3上执行

1
$ $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver

ps: Hadoop 3.3.0 版本时用这个命令启动mapred --daemon start

查看HDFS Web页面

位于centos-node150070端口:http://centos-node1:50070/

image-20200913152341967

查看YARN Web 页面

位于centos-node38088端口:http://centos-node3:8088/

image-20200913152504612

查看历史WEB页面

位于centos-node319888端口:http://centos-node3:19888/

image-20200913152549303

测试

为了测试我们使用 wordcount 来测试

  1. 新建文件

    1
    $ sudo vi /opt/word.txt
  2. 文本内容

    1
    2
    3
    4
    hadoop mapreduce hive
    hbase spark storm
    sqoop hadoop hive
    spark hadoop
  3. 新建hadoop里文件夹demo

    1
    $ hadoop fs -mkdir /demo
  4. 文件写入

    1
    $ hdfs dfs -put /opt/word.txt /demo/word.txt
  5. 执行输入到hadoop/output

    1
    $ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /demo/word.txt /output
  6. 查看文件列表

    1
    $ hdfs dfs -ls /output
    1
    2
    3
    Found 2 items
    -rw-r--r-- 3 root supergroup 0 2020-09-13 16:01 /output/_SUCCESS
    -rw-r--r-- 3 root supergroup 60 2020-09-13 16:01 /output/part-r-00000
  7. 查看文件中内容

    1
    $ hdfs dfs -cat /output/part-r-00000
    1
    2
    3
    4
    5
    6
    7
    hadoop  3
    hbase 1
    hive 2
    mapreduce 1
    spark 2
    sqoop 1
    storm 1