赞
踩
BigTable
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据,其的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表;
Hadoop生态系统中HBase与其它部分的关系
HBase与BigTable的低层技术对应关系
BigTable | HBase | |
---|---|---|
文件存储系统 | GFS | HDFS |
海量数据处理 | MapReduce | Hadoop MapReduce |
协同管理服务 | Chubby | Zookeeper |
Why we need HBase? (已有关系数据库,Hadoop的HDFS与MapReduce)
HBase与传统关系数据库的对比
传统关系型数据库 | HBase | |
---|---|---|
数据类型 | 关系模型,具有丰富的数据类型与存储方式 | 数据存储为未经解释的字符串 |
数据操作 | 涉及多表连接 | 只有简单操作(插入、查询、删除、清空等) |
存储模式 | 基于行模式存储 | 基于列模式存储(列族) |
数据索引 | 通常可以针对不同列构建复杂的多个索引,以提高数据访问性能 | 行键(访问 and 扫描) |
数据维护 | 旧值会被覆盖 | 保留旧版本(时间戳) |
可伸缩性 | 横向扩展困难,纵向扩展(CPU、内存) | 水平扩展灵活 |
HBase访问接口
概述
基本概念
概念视图:
物理视图:
面向列的存储
Ex
功能组件
客户端不依赖于Master,而是通过Zookeeper来获得Region位置信息,然后从Region服务器上读取数据
表、Region
Region定位
元数据表(.META.表)存储Region和Region服务器的映射关系(Region id, RS id);
根数据表(-ROOT-表)记录所有元数据的具体位置;只有唯一一个Region;
Zookeeper文件记录-Root-表位置;
⇒ \Rightarrow ⇒
客户端访问数据的“三级寻址”
HBase系统架构
客户端
Zookeeper服务器
一个集群管理工具,被大量用于分布式计算,提供配置维护、域名服务、分布式同步、组服务.
Master
Region服务器
Region服务器工作原理
系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记:
每次刷写都生成一个新的StoreFile文件,因此,每个Store包含多个StoreFile文件;
每个Region服务器都有一个自己的HLog 文件,每次启动都检查该文件,确认最近一次执行缓存刷新操作之后是否发生新的写入操作;如果发现更新,则先写入MemStore,再刷写到StoreFile,最后删除旧的Hlog文件,开始为用户提供服务;
Store工作原理
HLog工作原理
共用日志优点:提高对表的写操作性能;缺点:恢复时需要分拆日志.
HBase实际应用的性能优化方法
HBase的性能监视(Pass)
Master-status(自带)
HBase Master默认基于Web的UI服务端口为16010
Master
RegionServer
OpenTSDB
Ambari
HBase上构建SQL引擎
NoSQL区别于关系型数据库的一点就是NoSQL不使用SQL作为查询语言,至于为何在NoSQL数据存储HBase上提供SQL接口,原因是:
- 易使用
- 减少编码
Hive整合HBase
Hive与HBase的整合功能从Hive0.6.0版本已经开始出现,利用两者对外的API接口互相通信,通信主要依靠hive_hbase-handler.jar工具包(Hive Storage Handlers). 由于HBase有一次比较大的版本变动,所以并不是每个 版本的Hive都能和现有的HBase版本进行整合,所以在使用过程中特别注意 的就是两者版本的一致性.
Phoenix
Phoenix由Salesforce.com开源,是构建在Apache HBase之上的一个SQL中间层,可以让开发者在HBase上执行SQL查询.
构建HBase二级索引
HBase只有一个针对行键的索引,访问HBase表的行,只有三种方式:
采用HBase0.92版本之后引入的Coprocessor特性,可以使用其它产品为HBase提供索引功能:
Coprocessor
- Coprocessor提供了两个实现:endpoint and observer;
- endpoint相当于关系型数据库的存储过程,而observer则相当于触发器;
- observer允许在记录put前后作一些处理,故可以在插入数据时同步写入索引表;
- 优点:
- 非侵入性:引擎构建在HBase之上,既没有对HBase进行任何改动,也不需要上层应用做任何妥协;
- 缺点:
- 每插入一条数据需要向索引表插入数据,即耗时是双倍的,对HBase的集群的压力也是双倍的;
Hindex二级索引
HBase+Redis
HBase+solr
附:zookeeper的安装(不选择hbase自带的zookeeper)
下载Zookper安装包:Apache Zookeeper:apache-zookeeper-3.6.2-bin.tar.gz
解压:sudo tar -zxvf ~/Downloads/apache-zookeeper-3.6.2-bin.tar.gz -C /usr/local
重名名:sudo mv apache-zookeeper-3.6.2-bin.tar.gz zookeeper
修改权限:sudo chown -R hadoop:hadoop zookeeper
配置环境变量:vim ~/.bashrc
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
环境变量生效:source ~/.bashrc
修改zookeeper配置文件:
- cd /usr/local/zookeeper/conf
- cp zoo_sample.cfg zoo.cfg
- 设置其中的数据目录及日志存放目录并注册结点及端口号:vim zoo.cfg
dataDir=/usr/local/zookeeper/tmp/data
dataLogDir=/usr/local/zookeeper/tmp/logs
clientPort=2181 # 记住这个端口号,一般都有,不需要编写
server.1=localhost:2888:3888 # 保持跟hadoop配置文件一致即可
- 启动:cd /usr/local/zookeeper/bin、./zkServer.sh start
- 查看状态:./zkServer.sh status
- 关闭:./zkServer.sh stop
附:Hadoop与Hbase兼容性
下载HBase安装包:Apache Downloads Mirrors
解压:sudo tar -zxvf ~/Downloads/hbase-2.3.2-bin.tar.gz -C /usr/local
重名名hbase安装目录(cd /usr/local):sudo mv hbase-2.3.2 hbase
修改hbase目录权限(cd /usr/local):sudo chown -R hadoop:hadoop hbase
配置环境变量
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin # 无需进入安装目录的bin文件夹即可使用相关命令
伪分布式配置(注意是否有JAVE_HOME环境变量、jdk、hadoop)
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_271
export HBASE_CLASSPATH=/usr/local/hbase/conf
export HBASE_MANAGES_ZK=true # 默认用hbase自带的zookeeper
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs:/localhost:9000/hbase</value> <!--主机名或主机ip,注意与hadoop对应--> </property> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> <description>The directory shared by RegionServers.</description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> </configuration>
附:HBase部分shell命令
- create ‘tablename’,‘rowkey’
- list
- put ‘tablename’,‘rowkey’,‘rowFamily:rowName’,‘value’
- get ‘tablename’,‘rowkey’, {COLUMN=>‘rowFamily:rowName’}
- enable ‘tablename’
- disable ‘tablename’
- drop ‘tablename’(删除前需disable)
apache_hbase_reference_guide.pdf
目标:如何通过HBase Java API实现HBase表的创建、单元格数据的插入更新以及获取单元格数据
What we will do?
Step
<dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-auth</artifactId> <version>3.2.1</version> <!-- NoSuchMethodError: org.apache.hadoop.securityadoopKerberosName.setRuleMechanism --> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase</artifactId> <version>2.3.2</version> <type>pom</type> </dependency>
新建类并设置属性
protected static Configuration configuration;
protected static Connection connection;
protected static Admin admin;
编写init()方法
private static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try {
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
编写createTable()方法
public static void createTable(String myTableName, String[] colFamily) throws IOException {
TableName tableName = TableName.valueOf(myTableName);
if(admin.tableExists(tableName)){
System.out.print("table exists");
}else{
TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
for(String str:colFamily){
ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();
tableDescriptor.setColumnFamily(family);
}
admin.createTable(tableDescriptor.build());
}
}
编写insertData()方法
public static void insertData(String tableName, String rowKey, String colFamily, String col, String val) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
table.put(put);
table.close();
}
编写getData方法
public static void getData(String tableName, String rowKey, String colFamily, String col) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(), col.getBytes());
Result result = table.get(get);
System.out.println(new String(result.getValue(colFamily.getBytes(), col.getBytes())));
table.close();
}
编写close()方法
private static void close(){
try{
if(admin != null){
admin.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
main方法:调用上述编写的方法即可
异常:
Source:Hadoop Course PPT of NEU
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。