本书强调HBase在企业的实际应用,立足于企业的实际生产环境,旨在帮助企业切实解决大数据技术如何落地的问题。三位作者都是奋战在中国大数据技术一线的实践派专家,本书是他们实践经验的结晶。
本书内容在三个维度上具有重要特色:功能维度,从HBase的安装配置、参数设置,到数据模型、表结构设计、客户端使用、高级特性,本书做了系统且详尽的介绍;实战维度,不仅通过3个典型的应用案例详细讲解了如何使用HBase设计大型的数据应用系统,而且还结合实际生产系统讲解了HBase的集群运维、监控和性能调优;理论维度,则深入分析了HBase、框架设计、模式设计和基本原理。可谓是理论与实践结合,深度与广度兼备!
国内博学Hadoop技术专家实践经验结晶,从企业实际生产环境和需求出发,旨在帮助企业真正解决大数据的落地问题
系统介绍HBase的功能使用、框架设计、基本原理和高级特性;详细讲解使用HBase设计大型数据应用系统的实践方法和技巧;深刻总结系统运维、监控和性能调优的实践
马延辉 博学Hadoop技术专家,对Hadoop生态系统相关技术有深刻的理解。曾就职于、Answers.com、暴风影音等知名互联网公司,从事Hadoop相关的技术工作,在企业级的大数据系统的研发、运维和管理方面积累了丰富的实战经验。开源HBase监控工具Ella作者。在国内Hadoop社区内非常活跃,经常在各种会议和沙龙上做技术分享,深受欢迎。现在专注于大数据技术在传统行业的落地,致力于大数据技术的普及和推广。
孟鑫 博学Hadoop技术专家,在软件行业从业近10年,对海量数据处理技术有着深刻的认识,曾负责Hadoop平台建设工作,在Hadoop开发和运维方面积累了大量的实战经验。于2013年获取了Cloudera的Hadoop Developer认证,多次到企业和社区去分享Hadoop、HBase等方面的技术知识和经验。对技术拥有极大的兴趣,热衷于研究各种新技术,总结和分享经验及教训,目前从事管理工作,但依然热衷于产品设计和实现。
李立松 博学Hadoop技术专家,Easyhadoop技术社区创始人之一,对HDFS、MapReduce、HBase、Hive等Hadoop生态系统中的技术有比较深入的研究,在Hadoop开发方面积累了丰富的经验。曾就职于暴风,负责暴风大数据平台开发与应用,暴风大数据项目负责人。现在就职于缔元信,担任Hadoop高级工程师,负责缔元信DMP平台的研发工作。
前 言
及时部分 基础篇
第1章 认识HBase
1.1 理解大数据背景
1.1.1 什么是大数据
1.1.2 为何大数据至关重要
1.1.3 NoSQL在大数据中扮演的角色
1.2 HBase是什么
1.2.1 HBase的发展历史
1.2.2 HBase的发行版本
1.2.3 HBase的特性
1.3 HBase与Hadoop的关系
1.4 HBase的核心功能模块
1.4.1 客户端Client
1.4.2 协调服务组件ZooKeeper
1.4.3 主节点HMaster
1.4.4 Region节点HRegionServer
1.5 HBase的使用场景和经典案例
1.5.1 搜索引擎应用
1.5.2 增量数据存储
1.5.3 用户内容服务
1.5.4 实时消息系统构建
1.6 本章小结
第2章 HBase安装与配置
2.1 先决条件
2.2 HBase运行模式
2.2.1 单机模式
2.2.2 分布式模式
2.3 HBase的Web UI
2.4 HBase Shell工具使用
2.5 停止HBase集群
2.6 本章小结
第3章 数据模型
3.1 两类数据模型
3.1.1 逻辑模型
3.1.2 物理模型
3.2 数据模型的重要概念
3.2.1 表
3.2.2 行键
3.2.3 列族
3.2.4 单元格
3.3 数据模型的操作
3.3.1 读Get
3.3.2 写Put
3.3.3 扫描Scan
3.3.4 删除Delete
3.4 数据模型的特殊属性
3.4.1 版本
3.4.2 排序
3.4.3 列的元数据
3.4.4 连接查询
3.4.5 计数器
3.4.6 原子操作
3.4.7 事务特性ACID
3.4.8 行锁
3.4.9 自动分区
3.5 CAP原理与最终一致性
3.6 本章小结
第4章 HBase表结构设计
4.1 模式创建
4.2 Rowkey设计
4.3 列族定义
4.3.1 可配置的数据块大小
4.3.2 数据块缓存
4.3.3 布隆过滤器
4.3.4 数据压缩
4.3.5 单元时间版本
4.3.6 生存时间
4.4 模式设计实例
4.4.1 实例1:动物分类
4.4.2 实例2:店铺与商品
4.4.3 实例3:网上商城用户消费记录
4.4.4 实例4:微博用户与粉丝
4.5 本章小结
第5章 HBase客户端
5.1 精通原生Java客户端
5.1.1 客户端配置
5.1.2 创建表
5.1.3 删除表
5.1.4 插入数据
5.1.5 查询数据
5.1.6 删除数据
5.1.7 过滤查询
5.2 使用HBase Shell工具操作HBase
5.2.1 命令分类
5.2.2 常规命令
5.2.3 DDL命令
5.2.4 DML命令
5.2.5 工具命令Tools
5.2.6 复制命令
5.2.7 安全命令
5.3 使用Thrift客户端访问HBase
5.3.1 Thrift与Thrift2区别
5.3.2 安装与部署Thrift2
5.3.3 Python使用案例
5.4 通过REST客户端访问HBase
5.4.1 启动服务
5.4.2 使用REST访问example表
5.5 使用MapReduce批量操作HBase
5.5.1 三种访问模式
5.5.2 实现MapReduce API
5.5.3 HBase作为输入源示例
5.5.4 HBase作为输出源示例
5.5.5 HBase作为共享源示例
5.6 通过Web UI工具查看HBase状态
5.6.1 Master状态界面
5.6.2 RegionServer状态界面
5.6.3 ZooKeeper统计信息页面
5.7 其他客户端
5.8 本章小结
第二部分 实战篇
第6章 整合SQL引擎层
6.1 NoSQL背景知识
6.1.1 什么是NoSQL
6.1.2 将SQL整合到HBase的原因
6.1.3 基于HBase的SQL引擎实现
6.2 Hive整合HBase的实现
6.2.1 认识Hive
6.2.2 Hive整合HBase的环境准备
6.2.3 Linux环境下重新编译Hive
6.2.4 Hive参数配置
6.2.5 启动Hive
6.2.6 Hive与HBase整合后的框架如何使用
6.2.7 HBase到Hive的字段映射
6.2.8 多列与Hive Map类型
6.3 查询引擎Phoenix
6.3.1 认识Phoenix
6.3.2 Phoenix安装环境准备
6.3.3 Phoenix安装部署
6.3.4 Phoenix源码编译
6.3.5 Phoenix中SQLLine的快速使用
6.3.6 使用JDBC访问Phoenix
6.4 对象映射框架Kundera
6.4.1 认识Kundera
6.4.2 Kundera的客户端API快速使用
6.4.3 Kundera模块介绍
6.4.4 Kundera的REST访问方式
6.5 分布式SQL引擎Lealone
6.5.1 认识Lealone
6.5.2 Lealone的安装部署
6.5.3 通过JDBC访问Lealone
6.5.4 通过Python访问Lealone
6.5.5 Lealone特有的建表语法
6.6 本章小结
第7章 构建音乐站用户属性库
7.1 案例背景
7.1.1 音乐站
7.1.2 需求概述
7.1.3 需求范围和系统边界
7.1.4 需求详述
7.1.5 名词解释
7.2 概要设计
7.2.1 设计目标
7.2.2 数据规模假设
7.2.3 功能指标
7.2.4 系统流程
7.3 表结构设计
7.3.1 功能抽象
7.3.2 逻辑结构
7.3.3 Rowkey设计
7.3.4 列族设计
7.3.5 版本定义
7.3.6 优化属性定义
7.4 数据加载
7.4.1 加载流程
7.4.2 Mapper类
7.4.3 Main类
7.4.4 运行
7.5 数据检索
7.5.1 HBaseTable
7.5.2 HBaseAdmin
7.5.3 几种检索类型
7.6 后台查询
7.6.1 二级索引实现
7.6.2 后台查询系统
7.7 本章小结
第8章 构建广告实时计算系统
8.1 理解广告数据和流处理框架
8.1.1 网络广告的几大特性
8.1.2 网络广告的数据类型
8.1.3 流处理框架
8.1.4 背景与需求描述
8.2 概要设计
8.2.1 设计目标
8.2.2 主要功能
8.2.3 系统架构
8.3 详细设计
8.3.1 表结构设计
8.3.2 功能模块设计
8.4 核心功能实现
8.4.1 规划集群环境部署
8.4.2 安装ZooKeeper集群
8.4.3 安装Kafka分布式集群
8.4.4 实现Kafka生产者
8.4.5 安装Storm分布式集群
8.4.6 查看集群节点部署情况
8.4.7 基于Storm-kafka中间件实现计算逻辑
8.4.8 如何使用HBase中统计数据
8.5 本章小结
第三部分 高级篇
第9章 核心概念
9.1 核心结构
9.1.1 B+树
9.1.2 LSM树
9.1.3 两种结构本质区别
9.2 底层持久化
9.2.1 存储基本架构
9.2.2 HDFS文件
9.2.3 Region切分
9.2.4 合并
9.2.5 HFile格式
9.2.6 KeyValue格式
9.3 预写日志
9.3.1 概要流程
9.3.2 相关Java类
9.3.3 日志回放
9.3.4 日志一致性
9.4 写入流程
9.4.1 客户端
9.4.2 服务器端
9.5 查询流程
9.5.1 两种查询操作
9.5.2 客户端
9.5.3 服务器端
9.6 数据备份
9.6.1 备份机制架构
9.6.2 故障恢复
9.7 数据压缩
9.7.1 支持的压缩算法
9.7.2 使用配置
9.8 本章小结
第10章 HBase高级特性
10.1 过滤器
10.1.1 过滤器的两类参数
10.1.2 比较器
10.1.3 列值过滤器
10.1.4 键值元数据过滤器
10.1.5 行键过滤器
10.1.6 功能过滤器
10.1.7 Thrift使用过滤器
10.1.8 过滤器总结
10.2 计数器
10.2.1 使用Shell操作计数器
10.2.2 基于单列的计数器
10.2.3 多列计数器
10.3 协处理器
10.3.1 认识协处理器
10.3.2 观察者Observer
10.3.3 终端EndPoint
10.3.4 协处理器部署
10.4 Schema设计要点
10.4.1 行键设计
10.4.2 列族设计
10.5 二级索引
10.5.1 Client-managed方式
10.5.2 ITHBase实现
10.5.3 IHBase实现
10.5.4 Coprocessor方式
10.5.5 MapReduce两种方式
10.6 布隆过滤器
10.6.1 基本概念
10.6.2 配置布隆过滤器
10.6.3 使用布隆过滤器
10.7 负载均衡
10.7.1 全局计划
10.7.2 随机分配计划
10.7.3 批量启动分配计划
10.7.4 通过Shell控制负载均衡
10.8 批量加载
10.8.1 准备数据:importtsv
10.8.2 加载数据:completebulkload
10.9 本章小结
第11章 集群运维管理
11.1 HBase常用工具
11.1.1 文件检测修复工具hbck
11.1.2 文件查看工具hfile
11.1.3 WAL日志查看工具hlog
11.1.4 压缩测试工具CompressionTest
11.1.5 数据迁移工具CopyTable
11.1.6 导出工具export
11.1.7 导入工具Import
11.1.8 日志回放工具WALPlayer
11.1.9 行数统计工具RowCounter
11.2 Region和RegionServer管理
11.2.1 大合并工具major_compact
11.2.2 Region合并工具Merge
11.2.3 下线节点
11.2.4 滚动重启
11.3 性能指标Metrics
11.3.1 Master Metrics
11.3.2 RegionServer Metrics
11.3.3 RPC Metrics
11.3.4 JVM Metrics
11.3.5 集群属性Metrics
11.4 监控系统Ganglia
11.4.1 HBase监控指标
11.4.2 安装、部署和使用Ganglia
11.5 HBase管理扩展JMX
11.5.1 如何使用JMX
11.5.2 基于JMX的监控工具Ella
11.6 报警工具Nagios
11.7 故障处理
11.7.1 问题咨询渠道
11.7.2 常用日志信息
11.7.3 常用故障调试工具
11.7.4 客户端故障排查
11.7.5 MapReduce故障排查
11.7.6 网络故障排查
11.7.7 RegionServer相关问题解决
11.7.8 Master相关问题解决
11.7.9 ZooKeeper相关问题解决
11.8 集群备份
11.8.1 冷备份
11.8.2 热备份之Replication
11.8.3 热备份之CopyTable
11.8.4 热备份之Export
11.9 本章小结
第12章 性能调优
12.1 硬件和操作系统调优
12.1.1 配置内存
12.1.2 配置CPU
12.1.3 操作系统
12.2 网络通信调优
12.2.1 配置交换机
12.2.2 添加机架感知
12.3 JVM优化
12.3.1 Java垃圾回收算法
12.3.2 Java垃圾收集器
12.3.3 垃圾回收器的选择
12.3.4 JVM参数设置
12.4 HBase查询优化
12.4.1 设置Scan缓存
12.4.2 显式地指定列
12.4.3 关闭ResultScanner
12.4.4 禁用块缓存
12.4.5 优化行键查询
12.4.6 通过HTableTool访问
12.4.7 使用批量读
12.4.8 使用Filter降低客户端压力
12.4.9 使用Coprocessor统计行数
12.4.10 缓存查询结果
12.5 HBase写入优化
12.5.1 关闭写WAL日志
12.5.2 设置AutoFlush
12.5.3 预创建Region
12.5.4 延迟日志flush
12.5.5 通过HTableTool访问
12.5.6 使用批量写
12.6 HBase基本核心服务优化
12.6.1 优化分裂操作
12.6.2 优化合并操作
12.7 HBase配置参数优化
12.7.1 设置RegionServer Handler数量
12.7.2 调整BlockCache大小
12.7.3 设置MemStore的上下限
12.7.4 调整影响合并的文件数
12.7.5 调整MemStore的flush因子
12.7.6 调整单个文件大小
12.7.7 调整ZooKeeper Session的有效时长
12.8 分布式协调系统ZooKeeper优化
12.8.1 配置ZooKeeper节点数
12.8.2 独立ZooKeeper集群
12.9 表设计优化
12.9.1 开启布隆过滤器
12.9.2 调整列族块大小
12.9.3 设置In Memory属性
12.9.4 调整列族较大版本数
12.9
及时部分 Part 1
基 础 篇
第1章 认识HBase
第2章 HBase安装与配置
第3章 数据模型
第4章 HBase表结构设计
第5章 HBase客户端
Chapter 1 第1章
认识HBase
本章将介绍大数据背景和HBase的基本概念,从大数据引申到NoSQL,并阐述HBase出现的契机。随后,将介绍HBase的概念、发展历史、发行版本和基本特性。其中,HBase的核心功能模块将作为一个小节单独重点介绍,通过介绍HBase的使用场景和经典案例,让读者朋友能够清晰地了解HBase可以做什么。
作为NoSQL家庭的一员,HBase的出现弥补了Hadoop只能离线批处理的不足,同时能够存储小文件,提供海量数据的随机检索,并保障一定的性能。而这些特性也完善了整个Hadoop生态系统,泛化其大数据的处理能力,结合其高性能、稳定、扩展性好的特行,给使用大数据的企业带来了福音。
因为本章是全书的开篇,唯有简明扼要地介绍才能帮助正在学习和想要学习HBase的读者,所以本章将提纲掣领地介绍HBase的相关知识,重点介绍HBase是什么以及HBase能做什么两部分。
1.1 理解大数据背景
经美国机构IDC调查发现,现如今的公司正在以前所未有的速度和丰富的类型产生数据,并且也有能力存储这些数据,但是,如何关联这两方面以便产生较大的商业价值,是所有公司共同面临的挑战。这个问题非常复杂:虽然业务人员在技能提升和专业工具的帮助下,越来越了解数据,但由于数据的增长速度越来越快,积累量级越来越大,公司可以利用的数据比例正在迅速下降。
1.1.1 什么是大数据
Gartner认为与过去相关概念相比,大数据强调3V特征,即Volume(量级)、Varity(种类)和Velocity(速度),如图1-1所示。
图1-1 大数据三大特性
如今存储的数据量正在急剧增长,2000年全球存储了EB级别的数据,预计到2020年,该值将变为ZB级别。仅Twitter每天就会生成超过10TB的数据,Facebook的数据为几十TB,一些特殊的企业在每小时就会产生TB级别的数据。
上面这些企业是一些典型的案例,其实我们生活的方方面面都会形成很多"轨迹"。例如,打开手机会生成一个事件;乘坐公共交通刷卡,这是一个事件;检票登机、打卡上班、App Store上购买应用、更换电视频道、使用高速路电子收费系统等。每一项操作都会生成数据,并且该数据的量级与参与的人数相关,全球60亿人口,如果仅仅1/10的人参与进来,那么这个数据量级就已经非常惊人。就在10年前IT界超过1TB的数据仓库屈指可数,而现在则是"举不胜举"。
随着传感器、智能设备以及社交协作技术的激增,企业中的数据也变得更加复杂,因为它不仅包含传统的关系型数据,还包含来自网页、Web日志文件、社交媒体论坛、电子邮件、文档、传感器数据等原始、半结构化和非结构化数据。
传统系统可能很难存储、分析这些数据的内容,更不要说挖掘有价值的信息。因为传统的数据库、数据仓库、联机事务处理等技术并不适合处理这些数据。尽管一些公司正在朝大数据方向大力发展,但总体而言,大部分公司只是刚开始理解大数据。当回首整个数据库发展的历程会发现,人们将大部分时间都花在仅20%的数据上:这些数据格式整齐且符合严格模式的关系类型。但事实是,全球80%的数据是非结构化的或者半结构化的。
视频和图片不能轻松或高效地存储在关系型数据库中,某些事件信息可能动态地更改(如气象),它们不太适合严格的模式。要利用大数据,企业必须能够分析所有类型的数据,包括关系和非关系数据:文本、传感器数据、音频和视频等。
有效处理大数据需要在数据变化的过程中对它的数量和种类进行分析,而不只是在"静止"状态进行分析。业界定义这种情况为从单纯批量计算模式到实时动态计算模式的内涵式转变。内涵式在这里也比较容易理解,即结构优化、质量提高,是一种实现实质性的跨越式的进程。大数据平台允许用户将所有数据存储为其原生的业务对象格式,通过可用组件上的大规模并行计算实现价值,不仅仅是批量处理和离线分析,同时支持实时查询和处理等特征,甚至要求响应时间在毫秒级别,并且可承受大规模的并发访问,这些都是"速度"特征的范畴。