1. 认识 Hadoop 和 Hbasehtml
1.1 Hadoop 简单介绍node
Hadoop 是一个使用 Java 编写的 Apache 开放源代码框架,它容许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。Hadoop 框架工做的应用程序能够在跨计算机群集提供分布式存储和计算的环境中工做。Hadoop 旨在从单一服务器扩展到数千台机器,每台机器都提供本地计算和存储。web
1.2 Hadoop 架构shell
Hadoop 框架包括如下四个模块:数据库
Hadoop Common:这些是其余 Hadoop 模块所需的 Java 库和实用程序。这些库提供文件系统和操做系统级抽象,并包含启动 Hadoop 所需的必要 Java 文件和脚本。apache
Hadoop YARN:这是做业调度和集群资源管理的框架。编程
Hadoop 分布式文件系统(HDFS):提供对应用程序数据的高吞吐量访问的分布式文件系统。vim
Hadoop MapReduce:这是基于 YARN 的大型数据集并行处理系统。服务器
咱们可使用下图来描述 Hadoop 框架中可用的这四个组件。架构
自 2012 年以来,术语“Hadoop”一般不只指向上述基本模块,并且还指向能够安装在 Hadoop 之上或以外的其余软件包,例如 Apache Pig、Apache Hive、Apache HBase、Apache 火花等。
1.3 Hadoop 如何工做?
(1)阶段1
用户/应用程序能够经过指定如下项目向 Hadoop(Hadoop 做业客户端)提交所需的进程:
分布式文件系统中输入和输出文件的位置。
Java类以 JAR 文件的形式包含了 Map 和 Reduce 功能的实现。
经过设置做业特定的不一样参数来进行做业配置。
(2)阶段2
而后,Hadoop 做业客户端将做业(JAR/可执行文件等)和配置提交给 JobTracker,JobTracker 负责将软件/配置分发到从站,调度任务和监视它们,向做业客户端提供状态和诊断信息。
(3)阶段3
不一样节点上的 TaskTrackers 根据 MapReduce 实现执行任务,并将 reduce 函数的输出存储到文件系统的输出文件中。
1.4 Hadoop 的优势
Hadoop 框架容许用户快速编写和测试分布式系统。它是高效的,它自动分配数据并在机器上工做,反过来利用 CPU 核心的底层并行性。
Hadoop 不依赖硬件提供容错和高可用性(FTHA),而是 Hadoop 库自己被设计为检测和处理应用层的故障。
服务器能够动态添加或从集群中删除,Hadoop 继续运行而不会中断。
Hadoop 的另外一大优势是,除了是开放源码,它是全部平台兼容的,由于它是基于 Java 的。
1.5 HBase 介绍
Hbase 全称为 Hadoop Database,即 Hbase 是 Hadoop 的数据库,是一个分布式的存储系统。Hbase 利用 Hadoop 的 HDFS 做为其文件存储系统,利用 Hadoop 的 MapReduce 来处理 Hbase 中的海量数据。利用 ZooKeeper 做为其协调工具。
1.6 HBase 体系架构
Client
包含访问 HBase 的接口并维护 Cache 来加快对 HBase 的访问
ZooKeeper
保证任什么时候候,集群中只有一个 Master
存贮全部 Region 的寻址入口。
实时监控 Region Server 的上线和下线信息。并实时通知 Master
存储 HBase 的 Schema 和 table 元数据
Master
为 Region Server 分配 region
负责 Region Server 的负载均衡
发现失效的 Region Server 并从新分配其上的 region
管理用户对 table 的增删改操做
RegionServer
Region Server 维护 region,处理对这些 region 的 IO 请求
Region Server 负责切分在运行过程当中变得过大的 region
HLog(WAL log)
HLog 文件就是一个普通的 Hadoop Sequence File,Sequence File 的 Key 是 HLogKey 对象,HLogKey 中记录了写入数据的归属信息,除了 table 和 region 名字外,同时还包括 Sequence Number 和 Timestamp,Timestamp 是” 写入时间”,Sequence Number 的起始值为 0,或者是最近一次存入文件系统中 Sequence Number。
HLog SequeceFile 的 Value 是 HBase 的 KeyValue 对象,即对应 HFile 中的 KeyValue
Region
HBase 自动把表水平划分红多个区域(Rregion),每一个 Region 会保存一个表里面某段连续的数据;每一个表一开始只有一个 Region,随着数据不断插 入表,region 不断增大,当增大到一个阀值的时候,Region 就会等分会 两个新的 Region(裂变);
当 table 中的行不断增多,就会有愈来愈多的 Region。这样一张完整的表被保存在多个 Regionserver 上。
Memstore 与 StoreFile
一个 Region 由多个 Store 组成,一个 Store 对应一个 CF(列族)
store 包括位于内存中的 Memstore 和位于磁盘的 StoreFile 写操做先写入 Memstore,当 MemStore 中的数据达到某个阈值,HRegionServer 会启动 FlashCache 进程写入 StoreFile,每次写入造成单独的一个 StoreFile
当 StoreFile 文件的数量增加到必定阈值后,系统会进行合并(minor、 major compaction),在合并过程当中会进行版本合并和删除工做 ,造成更大的 StoreFile。
当一个 Region 全部 StoreFile 的大小和超过必定阈值后,会把当前的 region 分割为两个,并由 HMaster 分配到相应的 RegionServer 服务器,实现负载均衡。
客户端检索数据,先在 MemStore 找,找不到再找 StoreFile。
HRegion 是 HBase 中分布式存储和负载均衡的最小单元。最小单元就表示不一样的 HRegion 能够分布在不一样的 HRegion Server上。
HRegion 由一个或者多个 Store 组成,每一个 Store 保存一个 Columns Family。
每一个 Strore 又由一个 MemStore 和 0 至多个 StoreFile 组成。
2. 安装搭建 Hadoop
2.1 配置说明
本次集群搭建共三台机器,具体说明下:
主机名IP说明
hadoop01192.168.10.101DataNode、NodeManager、ResourceManager、NameNode
hadoop02192.168.10.102DataNode、NodeManager、SecondaryNameNode
hadoop03192.168.10.106DataNode、NodeManager
2.2 安装前准备
2.2.1 机器配置说明
注:本集群内全部进程均由 CLSN 用户启动;要在集群全部服务器都进行操做。
2.2.2 关闭 SELinux、防火墙
2.2.3 准备用户
2.2.4 修改 Hosts 文件,域名解析
2.2.5 同步时间
2.2.6 SSH 互信配置
(1)生成密钥对,一直回车便可
(2)保证每台服务器各自都有对方的公钥
注:要在集群全部服务器都进行操做
(3)验证无秘钥认证登陆
2.3 配置 JDK
在三台机器上都须要操做
2.4 安装 Hadoop
[root@hadoop01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz[root@hadoop01 ~]# tar -xvf hadoop-3.2.0.tar.gz -C /usr/local/[root@hadoop01 ~]# chown along.along -R /usr/local/hadoop-3.2.0/[root@hadoop01 ~]# ln -s /usr/local/hadoop-3.2.0/ /usr/local/hadoop
3. 配置启动 Hadoop
3.1 hadoop-env.sh 配置 Hadoop 环境变量
3.2 core-site.xml 配置 HDFS
3.3 hdfs-site.xml 配置 NameNode
[along@hadoop01 hadoop]$ vim hdfs-site.xml<!-- 设置namenode的http通信地址 -->dfs.namenode.http-addresshadoop01:50070 <!-- 设置secondarynamenode的http通信地址 -->dfs.namenode.secondary.http-addresshadoop02:50090 <!-- 设置namenode存放的路径 -->dfs.namenode.name.dir/data/hadoop/name <!-- 设置hdfs副本数量 -->dfs.replication2<!-- 设置datanode存放的路径 -->dfs.datanode.data.dir/data/hadoop/datanode dfs.permissionsfalse[root@hadoop01 ~]# mkdir /data/hadoop/name -p[root@hadoop01 ~]# mkdir /data/hadoop/datanode -p
3.4 mapred-site.xml 配置框架
3.5 yarn-site.xml 配置 ResourceManager
[along@hadoop01 hadoop]$ vim yarn-site.xmlyarn.resourcemanager.hostnamehadoop01 The http address of the RM web application.yarn.resourcemanager.webapp.address${yarn.resourcemanager.hostname}:8088 The address of the applications manager interface in the RM.yarn.resourcemanager.address${yarn.resourcemanager.hostname}:8032 The address of the scheduler interface.yarn.resourcemanager.scheduler.address${yarn.resourcemanager.hostname}:8030 yarn.resourcemanager.resource-tracker.address${yarn.resourcemanager.hostname}:8031 The address of the RM admin interface.yarn.resourcemanager.admin.address${yarn.resourcemanager.hostname}:8033
3.6 配置 Masters & Slaves
3.7 启动前准备
3.7.1 准备启动脚本
启动脚本文件所有位于 /usr/local/hadoop/sbin 文件夹下:
(1)修改 start-dfs.sh stop-dfs.sh 文件添加:
(2)修改 start-yarn.sh 和 stop-yarn.sh 文件添加:
3.7.2 受权
3.7.3 配置 Hadoop 命令环境变量
3.7.4 集群初始化
3.8 启动 Hadoop 集群
3.8.1 第一次启动前须要格式化,集群全部服务器都须要
3.8.2 启动并验证集群
(1)启动 NameNode、DataNode
(2)启动 YARN
3.9 集群启动成功
(1)网页访问:http://hadoop01:8088
该页面为 ResourceManager 管理界面,在上面能够看到集群中的三台 Active Nodes。
(2)网页访问:http://hadoop01:50070/dfshealth.html#tab-datanode
该页面为 NameNode 管理页面
到此 Hadoop 集群已经搭建完毕!!!
4. 安装配置 Hbase
4.1 安装 Hbase
[root@hadoop01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.4.9/hbase-1.4.9-bin.tar.gz[root@hadoop01 ~]# tar -xvf hbase-1.4.9-bin.tar.gz -C /usr/local/[root@hadoop01 ~]# chown -R along.along /usr/local/hbase-1.4.9/[root@hadoop01 ~]# ln -s /usr/local/hbase-1.4.9/ /usr/local/hbase
注:当前时间 2018.03.08,Hbase-2.1 版本有问题;也多是我配置的问题,Hbase 会启动失败;因此,我降级到了 Hbase-1.4.9 版本。
4.2 配置 Hbase
4.2.1 hbase-env.sh 配置 Hbase 环境变量
4.2.2 hbase-site.xml 配置 Hbase
[root@hadoop01 conf]# vim hbase-site.xmlhbase.rootdir<!-- hbase存放数据目录 -->hdfs://hadoop01:9000/hbase/hbase_db<!-- 端口要和Hadoop的fs.defaultFS端口一致-->hbase.cluster.distributed<!-- 是否分布式部署 -->truehbase.zookeeper.quorum<!-- zookooper 服务启动的节点,只能为奇数个 -->hadoop01,hadoop02,hadoop03<!--zookooper配置、日志等的存储位置,必须为以存在 -->hbase.zookeeper.property.dataDir/data/hbase/zookeeper<!--hbase master -->hbase.masterhadoop01<!--hbase web 端口 -->hbase.master.info.port16666
注:ZooKeeper 有这样一个特性:
集群中只要有过半的机器是正常工做的,那么整个集群对外就是可用的。
也就是说若是有 2 个 ZooKeeper,那么只要有 1 个死了 ZooKeeper 就不能用了,由于 1 没有过半,因此 2 个ZooKeeper 的死亡容忍度为 0;
同理,要是有 3 个 ZooKeeper,一个死了,还剩下 2 个正常的,过半了,因此 3 个ZooKeeper 的容忍度为 1;
再多列举几个:2->0 ; 3->1 ; 4->1 ; 5->2 ; 6->2 会发现一个规律,2n 和 2n-1 的容忍度是同样的,都是 n-1,因此为了更加高效,何须增长那一个没必要要的ZooKeeper。
4.2.3 指定集群节点
5. 启动 Hbase 集群
5.1 配置 Hbase 命令环境变量
5.2 启动前准备
5.3 启动 Hbase
注:只需在 Hadoop01 服务器上操做便可。
(1)启动
(2)验证
5.4 页面查看 Hbase 状态
网页访问 http://hadoop01:16666
6. 简单操做 Hbase
6.1 Hbase Shell 基本操做命令
名称命令表达式
建立表create '表名称','列簇名称1','列簇名称2'.......
添加记录put '表名称', '行名称','列簇名称:','值'
查看记录get '表名称','行名称'
查看表中的记录总数count '表名称'
删除记录delete '表名',行名称','列簇名称'
删除表①disable '表名称' ②drop '表名称'
查看全部记录scan '表名称'
查看某个表某个列中全部数据scan '表名称',['列簇名称:']
更新记录即重写一遍进行覆盖
6.2 通常操做
(1)启动 Hbase 客户端
[along@hadoop01 ~]$ hbase shell#须要等待一些时间SLF4J:Class path contains multiple SLF4J bindings.SLF4J:Found bindingin[jar:file:/usr/local/hbase-1.4.9/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J:Found bindingin[jar:file:/usr/local/hadoop-3.2.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J:Seehttp://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J:Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]HBase ShellUse"help"to get list of supported commands.Use"exit"to quit this interactive shell.Version1.4.9, rd625b212e46d01cb17db9ac2e9e927fdb201afa1, Wed Dec511:54:10PST2018 hbase(main):001:0>
(2)查询集群状态
(3)查询 Hive 版本
6.3 DDL 操做
(1)建立一个 demo 表,包含 ID 和 info 两个列簇
(2)得到表的描述
hbase(main):002:0>listTABLE demo 1row(s) in0.6380seconds => ["demo"]---获取详细描述hbase(main):003:0> describe'demo'Table demo is ENABLED demo COLUMN FAMILIES DESCRIPTION {NAME =>'id', 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'}{NAME =>'info', 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'}2row(s) in0.3500seconds
(3)删除一个列簇
注:任何删除操做,都须要先 disable 表
hbase(main):004:0> disable'demo'0row(s) in2.5930seconds hbase(main):006:0> alter'demo',{NAME=>'info',METHOD=>'delete'}Updating all regions with thenewschema...1/1regions updated.Done.0row(s) in4.3410seconds hbase(main):007:0> describe'demo'Table demo is DISABLED demo COLUMN FAMILIES DESCRIPTION {NAME =>'id', 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'}1row(s) in0.1510seconds
(4)删除一个表
要先 disable 表,再 drop
6.4 DML 操做
(1)插入数据
hbase(main):024:0>create'demo','id','info'0row(s)in10.0720seconds => Hbase::Table - demohbase(main):025:0>is_enabled'demo'true0row(s)in0.1930seconds hbase(main):030:0>put'demo','example','id:name','along'0row(s)in0.0180seconds hbase(main):039:0>put'demo','example','id:sex','male'0row(s)in0.0860seconds hbase(main):040:0>put'demo','example','id:age','24'0row(s)in0.0120seconds hbase(main):041:0>put'demo','example','id:company','taobao'0row(s)in0.3840seconds hbase(main):042:0>put'demo','taobao','info:addres','china'0row(s)in0.1910seconds hbase(main):043:0>put'demo','taobao','info:company','alibaba'0row(s)in0.0300seconds hbase(main):044:0>put'demo','taobao','info:boss','mayun'0row(s)in0.1260seconds
(2)获取 demo 表的数据
hbase(main):045:0>get'demo','example'COLUMN CELL id:age timestamp=1552030411620, value=24id:company timestamp=1552030467196, value=taobaoid:name timestamp=1552030380723, value=alongid:sex timestamp=1552030392249, value=male1row(s)in0.8850seconds hbase(main):046:0>get'demo','taobao'COLUMN CELL info:addres timestamp=1552030496973, value=chinainfo:boss timestamp=1552030532254, value=mayuninfo:company timestamp=1552030520028, value=alibaba1row(s)in0.2500seconds hbase(main):047:0>get'demo','example','id'COLUMN CELL id:age timestamp=1552030411620, value=24id:company timestamp=1552030467196, value=taobaoid:name timestamp=1552030380723, value=alongid:sex timestamp=1552030392249, value=male1row(s)in0.3150seconds hbase(main):048:0>get'demo','example','info'COLUMN CELL 0row(s)in0.0200seconds hbase(main):049:0>get'demo','taobao','id'COLUMN CELL 0row(s)in0.0410seconds hbase(main):053:0>get'demo','taobao','info'COLUMN CELL info:addres timestamp=1552030496973, value=chinainfo:boss timestamp=1552030532254, value=mayuninfo:company timestamp=1552030520028, value=alibaba1row(s)in0.0240seconds hbase(main):055:0>get'demo','taobao','info:boss'COLUMN CELL info:boss timestamp=1552030532254, value=mayun1row(s)in0.1810seconds
(3)更新一条记录
(4)获取时间戳数据
你们应该看到 Timestamp 这个标记
(5)全表显示
(6)删除 ID 为 example 的 'id:age' 字段
(7)删除整行
(8)给 example 这个 id 增长 'id:age' 字段,并使用 counter 实现递增
(9)清空整个表
能够看出 Hbase 是先 disable 掉该表,而后 drop,最后从新 create 该表来实现清空该表。