linux中Hadoop与HBase数据库搭建介绍与应用场景分析

一、 Hadoop

        Hadoop是Apache组织的一个分布式计算框架(java语言),其最核心的设计就是:HDFS 和MapReduce,HDFS实现存储,MapReduce实现原理分析处理。  

1.Hadoop架构

Hadoop框架核心模块:

  • Hadoop YARN:这是作业调度和集群资源管理的框架。
  • Hadoop分布式文件系统(HDFS):提供对应用程序数据的高吞吐量访问的分布式文件系统。
  • Hadoop MapReduce: 这是基于YARN的大型数据集并行处理系统。
 Hadop生态圈
   MAPREDUCE:分布式运算程序开发框架 
   HIVE:基于HADOOP的分布式数据仓库,提供基于SQL的查询数据操作 
   HBASE:基于HADOOP的分布式海量数据库 
   ZOOKEEPER:分布式协调服务基础组件 
   Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库 
   Oozie:工作流调度框架 
   Sqoop:数据导入导出工具(比如用于mysql和HDFS之间) 
   Flume:日志数据采集框架 Impala:基于Hadoop的实时分析  

2. HDFS文件系统

         HDFS(Hadoop Distributed File System)是一个高度容错的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集的应用程序。

2.1 设计特点

  • 大数据文件,适合大文件或者一堆大数据文件
  • 文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算机上
  • 流式数据访问,一次写入多次读写,和传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化只能在文件末尾添加
  • 廉价硬件
  • 备份,为防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其他某几个主机上

2.2 HDFS中名词介绍

  • Block:将文件分块,通常为64M。
  • NameNode:保存整个文件系统的目录信息、文件信息及分块信息,由唯一一台主机专门保存。(2.0版本后增加备份)
  • DataNode:用于存储Block文件。
  • NameNode全权管理数据块的复制,它周期性地从集群中的每个DataNode接受心跳信号和块状态报告(BlockReport)。接受心跳信号判断DataNode是否工作正常,块状态报告包含了一个该DataNode上所有数据块的列表。

2.3 Master / Slave架构

         一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode作为中心服务器负责管理文件系统的namespace和客户端对文件的访问,Datanode在集群中负责管理结点上他们附带的存储。在内部,一个文件其实分成一个或多个block,这些block存储在Datanode集合里。Namenode执行文件系统的namespace操作,如打开、关闭、重命名等,NameNode确定块到DataNodes的映射。Datanode在Namenode的指挥下进行block的创建、删除和复制。

3 MapReduce文件系统

       MapReduce是一种编程模型,用于大规模数据的并行运算。MapReduce分成两个部分:Map(映射)和Reduce(归纳)。当你向MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,每一个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce任务的输入数据。Reduce任务的主要目标就是把若干个Map的输出元组汇总为较小的一组元组并输出。reduce任务总是在map任务之后执行。

4. Hadoop的优点

  •    1.**扩容能力**(Scalable):Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可用方便的扩展到数以千计的节点中。 
       2.**成本低**(Economical):Hadoop通过普通廉价的机器组成服务器集群来分发以及处理数据,以至于成本很低。 
       3.**高效率**(Efficient):通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。 
       4.**可靠性**(Rellable):能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。所以Hadoop的按位存储和处理数据的能力值得人们信赖。

5. Hadoop搭建

5.1 资源获取

下载jdk地址 :https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html

下载Hadoop地址 (下载二进制格式,不带src)  :https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/

5.2 资源安装配置 

将压缩文件解压,cd到你的压缩文件下载目录,然后执行以下指令:

sudo  tar -zxvf  jdk压缩文件名.tar.gz

sudo tar xzf hadoop压缩文件名.tar.gz

将解压文件移到指定目录

sudo mv jdk解压后的文件名  /usr/local/jad8

sudo mv hadoop解压后的文件名  /usr/local/hadoop

更改文件权限,否则,在后面./sbin/start-dfs.sh步会遇到no such file or directory等错误。

chown -R hadoop hadoop 

配置环境,修改配置文件.bashrc,并用source命令保存修改

vim ~/.bashrc
在最后一行中写入
export JAVA_HOME=/usr/local/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin

source ~/.bashrc

检测环境

jdk检测

java -version

Hadoop检测

 cd /usr/local/hadoop
./bin/hadoop version

如果Hadoop检测出错,需要进行以下操作:
1.打开/usr/local/hadoop/etc/hadoop/hadoop-env.sh
2.将
export JAVA_HOME=${JAVA_HOME}
处修改为
export JAVA_HOME=/usr/local/jdk8    # 视Java安装位置而定

然后source hadoop-env.sh以保存修改

这样单模式工作环境就配置完成了

5.3 Hadoop伪分布式配置

Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml),将当

1
2
<configuration>
</configuration>

修改为下面配置:

 

1

2

3

4

5

6

7

8

9

10

11

 

<configuration>

<property>

<name>hadoop.tmp.dir</name>

<value>file:/usr/local/hadoop/tmp</value>

<description>Abase for other temporary directories.</description>

</property>

<property>

<name>fs.defaultFS</name>

<value>hdfs://localhost:9000</value>

</property>

</configuration>

同样的,修改配置文件 hdfs-site.xml:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

 

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>file:/usr/local/hadoop/tmp/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:/usr/local/hadoop/tmp/dfs/data</value>

</property>

</configuration

配置完成后,执行 NameNode 的格式化:

1
$./bin/hdfs namenode -format

如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。

接着开启 NameNode 和 DataNode 守护进程。

1
./sbin/start-dfs.sh

启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

二、HBase

      HBase是建立在Hadoop文件系统之上的分布式面向列的数据库,适用于结构化的存储,HBase 底层依赖 HDFS 来作为其物理存储。HBase 非常适合用来进行大数据的实时查询,例如 Facebook 用 HBase 进行消息和实时的分析。HBase 本身只提供了 Java 的 API 接口,并不直接支持 SQL 的语句查询。如果想要在 HBase 上使用 SQL,则需要联合使用 Apache Phonenix,或者联合使用 Hive 和 HBase。

 

HBase 与传统关系数据库的区别

         首先让我们了解下什么是 ACID。ACID 是指数据库事务正确执行的四个基本要素的缩写,其包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。对于一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction Processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。下面,我们就简单的介绍下这 4 个特性的含义。

  • 原子性(Atomicity)是指一个事务要么全部执行,要么全部不执行。换句话说,一个事务不可能只执行了一半就停止了。比如一个事情分为两步完成才可以完成,那么这两步必须同时完成,要么一步也不执行,绝不会停留在某一个中间状态。如果事物执行过程中,发生错误,系统会将事物的状态回滚到最开始的状态。
  • 一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性。也就是说,无论并发事务有多少个,但是必须保证数据从一个一致性的状态转换到另一个一致性的状态。例如有 a、b 两个账户,分别都是 10。当 a 增加 5 时,b 也会随着改变,总值 20 是不会改变的。
  • 隔离性(Isolation)是指两个以上的事务不会出现交错执行的状态。因为这样可能会导致数据不一致。如果有多个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
  • 持久性(Durability)指事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

       在具体的介绍 HBase 之前,我们先简单对比下 HBase 与传统关系数据库的(RDBMS,全称为 Relational Database Management System)区别。如表 1 所示。

                                                                                            表 1. HBase 与 RDBMS 的区别

 HBaseRDBMS
硬件架构类似于 Hadoop 的分布式集群,硬件成本低廉传统的多核系统,硬件成本昂贵
容错性由软件架构实现,由于由多个节点组成,所以不担心一点或几点宕机一般需要额外硬件设备实现 HA 机制
数据库大小PBGB、TB
数据排布方式稀疏的、分布的多维的 Map以行和列组织
数据类型Bytes丰富的数据类型
事物支持ACID 只支持单个 Row 级别全面的 ACID 支持,对 Row 和表
查询语言只支持 Java API (除非与其他框架一起使用,如 Phoenix、Hive)SQL
索引只支持 Row-key,除非与其他技术一起应用,如 Phoenix、Hive支持
吞吐量百万查询/每秒数千查询/每秒

我们看看数据是如何在 HBase 以及 RDBMS 中排布的。首先,数据在 RDBMS 的排布大致如表 2。

表 2. 数据在 RDBMS 中的排布示例

ID密码时间戳
111120160719
222220160720

那么数据在 HBase 中的排布会是什么样子呢?如表 3 所示(这只是逻辑上的排布)。

表 3. 数据在 HBase 中的排布(逻辑上),表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。

Row-KeyValue(CF、Qualifier、Version)
1info{'姓': '张','名':'三'}
pwd{'密码': '111'}
2Info{'姓': '李','名':'四'}
pwd{'密码': '222'}

从上面示例表中,我们可以看出,在 HBase 中首先会有 Column Family 的概念,简称为 CF。CF 一般用于将相关的列(Column)组合起来。在物理上 HBase 其实是按 CF 存储的,只是按照 Row-key 将相关 CF 中的列关联起来。物理上的数据排布大致可以如表 4 所示。

表 4. 数据在 HBase 中的排布

Row-KeyCF:Column-Key时间戳Cell Value
1info:fn123456789
1info:ln123456789
2info:fn123456789
2info:ln123456789

我们已经提到 HBase 是按照 CF 来存储数据的。在表 3 中,我们看到了两个 CF,分别是 info 和 pwd。info 存储着姓名相关列的数据,而 pwd 则是密码相关的数据。上表便是 info 这个 CF 存储在 Hbase 中的数据排布。Pwd 的数据排布是类似的。

Hbase 中逻辑上数据的排布与物理上排布的关联

                                                    

从上图我们看到 Row1 到 Row5 的数据分布在两个 CF 中,并且每个 CF 对应一个 HFile。并且逻辑上每一行中的一个单元格数据,对应于 HFile 中的一行,然后当用户按照 Row-key 查询数据的时候,HBase 会遍历两个 HFile,通过相同的 Row-Key 标识,将相关的单元格组织成行返回,这样便有了逻辑上的行数据。

     我们可以认为 HBase 就是一个有序的多维 Map,其中每一个 Row-key 映射了许多数据,这些数据存储在 CF 中的 Column。在大多数的情况下,一个表格不会超过 2 到 3 个 CF,而且很多情况下都是 1 个 CF 就足够了。

HBase 的数据映射关系

                               

HFile 的结构

                                               

从图中我们可以看到 HFile 由很多个数据块(Block)组成,并且有一个固定的结尾块。其中的数据块是由一个 Header 和多个 Key-Value 的键值对组成。在结尾的数据块中包含了数据相关的索引信息,系统也是通过结尾的索引信息找到 HFile 中的数据。HFile 中的数据块大小默认为 64KB。如果访问 HBase 数据库的场景多为有序的访问,那么建议将该值设置的大一些。如果场景多为随机访问,那么建议将该值设置的小一些。一般情况下,通过调整该值可以提高 HBase 的性能。

HBase 相关的模块及工作原理

      HDFS 为 Hbase 提供可靠的底层数据存储服务,MapReduce 为 Hbase 提供高性能的计算能力,Zookeeper 为 Hbase 提供稳定服务和 Failover 机制。

HBase 的相关模块

                                          

 

  • Master(主服务器)

    HBase Master 用于协调多个 Region Server,侦测各个 Region Server 之间的状态,并平衡 Region Server 之间的负载。HBase Master 还有一个职责就是负责分配 Region 给 Region Server。HBase 允许多个 Master 节点共存,但是这需要 Zookeeper 的帮助。不过当多个 Master 节点共存时,只有一个 Master 是提供服务的,其他的 Master 节点处于待命的状态。当正在工作的 Master 节点宕机时,其他的 Master 则会接管 HBase 的集群。

  • 分配区域给区域服务器并在Apache ZooKeeper的帮助下完成这个任务。
  • 处理跨区域的服务器区域的负载均衡。它卸载繁忙的服务器和转移区域较少占用的服务器。
  • 通过判定负载均衡以维护集群的状态。
  • 负责模式变化和其他元数据操作,如创建表和列。
  • Region Server(区域服务器)

    对于一个 Region Server 而言,其包括了多个 Region。Region Server 的作用只是管理表格,以及实现读写操作。Client 直接连接 Region Server,并通信获取 HBase 中的数据。对于 Region 而言,则是真实存放 HBase 数据的地方,也就说 Region 是 HBase 可用性和分布式的基本单位。如果当一个表格很大,并由多个 CF 组成时,那么表的数据将存放在多个 Region 之间,并且在每个 Region 中会关联多个存储的单元(Store)。

  • 与客户端进行通信并处理数据相关的操作。
  • 句柄读写的所有地区的请求。
  • 由以下的区域大小的阈值决定的区域的大小。

区域服务器:包含区域和存储,如下图所示:

                                         Regional Server

 

          存储包含内存存储和HFiles。memstore就像一个高速缓存。在这里开始进入了HBase存储。数据被传送并保存在Hfiles作为块并且memstore刷新。
 

  • Zookeeper

              对于 HBase 而言,Zookeeper 的作用是至关重要的。 Zookeeper 保证了至少有一个 HBase Master 处于运行状态。并且 Zookeeper 负责 Region 和 Region Server 的注册。 Zookeeper 已经成为了分布式大数据框架中容错性的标准框架。

  • Zookeeper管理是一个开源项目,提供服务,如维护配置信息,命名,提供分布式同步等;
  • Zookeeper代表不同区域的服务器短暂节点。主服务器使用这些节点来发现可用的服务器;
  • 除了可用性,该节点也用于追踪服务器故障或网络分区;
  • 客户端通过与zookeeper区域服务器进行通信;
  • 在模拟和独立模式,HBase由zookeeper来管理。

HBase 的工作原理

                                            

 

            HBase 的集群是通过 Zookeeper 来进行机器之前的协调,也就是说 HBase Master 与 Region Server 之间的关系是依赖 Zookeeper 来维护。当一个 Client 需要访问 HBase 集群时,Client 需要先和 Zookeeper 来通信,然后才会找到对应的 Region Server。每一个 Region Server 管理着很多个 Region,数据都存储在 Region 中。这里我们需要特别注意,每一个 Region 都只存储一个 Column Family 的数据,并且是该 CF 中的一段(按 Row 的区间分成多个 Region)。Region 所能存储的数据大小是有上限的,当达到该上限时(Threshold),Region 会进行分裂,数据也会分裂到多个 Region 中,这样便可以提高数据的并行化,以及提高数据的容量。每个 Region 包含着多个 Store 对象。每个 Store 包含一个 MemStore,和一个或多个 HFile。        MemStore 便是数据在内存中的实体,并且一般都是有序的。当数据向 Region 写入的时候,会先写入 MemStore。当 MemStore 中的数据需要向底层文件系统倾倒(Dump)时(例如 MemStore 中的数据体积到达 MemStore 配置的最大值),Store 便会创建 StoreFile,而 StoreFile 就是对 HFile 一层封装。所以 MemStore 中的数据会最终写入到 HFile 中,也就是磁盘 IO。由于 HBase 底层依靠 HDFS,因此 HFile 都存储在 HDFS 之中。

     HBase 中的 HLog 机制是 WAL 的一种实现,而 WAL(一般翻译为预写日志)是事务机制中常见的一致性的实现方式。每个 Region Server 中都会有一个 HLog 的实例,Region Server 会将更新操作(如 Put,Delete)先记录到 WAL(也就是 HLog)中,然后将其写入到 Store 的 MemStore,最终 MemStore 会将数据写入到持久化的 HFile 中(MemStore 到达配置的内存阀值)。这样就保证了 HBase 的写的可靠性。如果没有 WAL,当 Region Server 宕掉的时候,MemStore 还没有写入到 HFile,或者 StoreFile 还没有保存,数据就会丢失。或许有的读者会担心 HFile 本身会不会丢失,这是由 HDFS 来保证的。

   名词说明    

Hmaster

1) 监控 RegionServer
2) 处理 RegionServer 故障转移
3) 处理元数据的变更
4) 处理 region 的分配或移除
5) 在空闲时间进行数据的负载均衡
6) 通过 Zookeeper 发布自己的位置给客户端

Regionserver

1) 负责存储 HBase 的实际数据
2) 处理分配给它的 Region
3) 刷新缓存到 HDFS
4) 维护 HLog
5) 执行压缩
6) 负责处理 Region 分片

HFile

这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。

Store

HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。

MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL 中之后,RegsionServer 会在内存中存储键值对。

Region

Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。

                                            hbaseåæ°æ®æµç¨

工作原理总结

  1. Client 也是先访问 zookeeper,找到 - ROOT - 表(新版本没有该表,暂不讨论),进而找到. META. 表,并获取. META. 表信息。
  2. 确定当前将要写入的数据所对应的 RegionServer 服务器和 Region。
  3. Client 向该 RegionServer 服务器发起写入数据请求,然后 RegionServer 收到请求并响应。
  4. Client 先把数据写入到 HLog,以防止数据丢失。
  5. 然后将数据写入到 Memstore。
  6. 如果 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore 达到阈值(128MB),会把 Memstore 中的数据 flush 到 StoreFile 中。
  7. 当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile 合并成一个大的 Storefile。当 Storefile 越来越大,即 region 越来越大,大于 max.filesize(默认 10GB),达到阈值后,会触发 Split 操作,将 Region 一分为二。

需要注意的是 hbase.hregion.max.filesize 参数的设置:

  • 当 hbase.hregion.max.filesize 比较小时,触发 split 的机率更大,系统的整体访问服务会出现不稳定现象。
  • 当 hbase.hregion.max.filesize 比较大时,由于长期得不到 split,因此同一个 region 内发生多次 compaction 的机会增加了。这样会降低系统的性能、稳定性,因此平均吞吐量会受到一些影响而下降。

region 寻址:

前面已经介绍 Region 类似于数据库的分片和分区的概念,每个 region 负责一小部分 Rowkey 的数据的读写和维护,region 包含了对应的起始行到结束行的所有信息,master 将对应的 region 分配给不同的 regionserver,由 regionserver 来提供 Region 的读写服务和相关的管理工作。如下图所示          
region分配

上图模拟了一个 Hbase 的表是如何拆分成 region,以及分配到不同的 RegionServer 中去。上面是 1 个 Userinfo 表,里面有 7 条记录,其中 rowkey 为 0001 到 0002 的记录被分配到了 Region1 上,Rowkey 为 0003 到 0004 的记录被分配到了 Region2 上,而 rowkey 为 0005、0006 和 0007 的记录则被分配到了 Region3 上。region1 和 region2 被 master 分配给了 RegionServer1(RS1),Region3 被 master 配分给了 RegionServer2(RS2)。

 

参考文献

https://www.jianshu.com/p/ac98bd415baa

https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-bigdata-hbase/index.html

https://www.wzwei.club/archives/hbase.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值