问题:HBase的索引(rowkey也有索引—通常是一个组合行键、二级索引)
Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。
当您需要对大数据进行随机,实时读/写访问时,请使用Apache HBase™。该项目的目标是托
管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上。Apache HBase是一个开源的,分布式
的,版本化的非关系数据库,模仿Google的Bigtable: Chang等人的结构化数据分布式存储系
统。正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和
HDFS之上提供类似Bigtable的功能。
2006年-google发表了bigtable的白皮书
2006年-开始开发hbase
2008年-hbase正式成为apache的子项目
2010年-正式成为apache的顶级项目
一、使用Java API操作HBase
二、搭建HBase的全分布环境和HA
1、搭建HBase的全分布:
bigdata112 bigdata113 bigdata114
注意:时间同步
如果不同步:
(1)Hadoop:执行MR出错
(2)HBase:RegionServer会自动停止
bigdata112: HMaster、ZooKeeper
bigdata113: RegionServer
bigdata114: RegionServer
在主节点上
解压 tar -zxvf hbase-1.3.1-bin.tar.gz -C ~/training/
设置环境变量
hbase-site.xml
<!--HBase对应的HDFS目录-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.157.112:9000/hbase</value>
</property>
<!--是一个分布式环境-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--指定ZK的地址-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.157.112</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--允许集群各个节点的时间误差的最大值,单位是毫秒-->
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>
regionservers
bigdata113
bigdata114
把安装目录复制到从节点上
scp -r hbase-1.3.1/ root@bigdata113:/root/training
scp -r hbase-1.3.1/ root@bigdata114:/root/training
2、搭建HA(不需要单独搭建)
3、对比:在不同的模式下,HBase在Zk中保存的数据
三、数据保存的过程(一定注意:Region的分裂)
注意:数据的存储,都需要注意。
HDFS:数据的平衡 -----> 数据的移动(拷贝)
HBase:数据越来越多 —> Region的分裂 —> 数据的移动(拷贝)
四、HBase的过滤器(相当于SQL中的:where语句)
准备测试数据
五、HBase上的MapReduce:重写WorkCount单词计数
1、建立输入的表
create ‘word’,‘content’
put ‘word’,‘1’,‘content:info’,‘I love Beijing’
put ‘word’,‘2’,‘content:info’,‘I love China’
put ‘word’,‘3’,‘content:info’,‘Beijing is the capital of China’
2、输出表
create ‘stat’,‘content’
注意:export HADOOP_CLASSPATH=$HBASE_HOME/lib/*:$CLASSPATH
Hbase优化
1)上传
2)解压
3)修改配置文件
hbase-env.sh
JAVA_HOME=
ZK=
hbase-site.xml
加入配置信息
regionservers
加入从节点
4)解决依赖问题
把相关版本的zookeeper和hadoop的依赖包导入到
hbase/lib下
软连接hadoop配置
ln -s /hadoop/core-site.xml /hbase/conf
ln -s /hadoop/hdfs-site.xml /hbase/conf
5)启动集群
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
6)启动终端
bin/hbase shell
7)ui界面
http://192.168.50.183:16010/master-status
Hbase shell
1)查看服务器状态
status ‘hd09-01’
2)查看当前有哪些表
list
3)查看帮助
help
hbase表操作
1)创建表
create '表名','列族'
2)全表扫描
scan '表名'
rowkey:行键:唯一 不重复
timestamp:时间戳
cell:单元格 数据存放位置
column familly:列族,列族下包含多个列
column:列
3)向表中插入数据
put '表名','rowkey','列族:列名','值'
4)覆盖数据
在hbase中没有修改,但是可以覆盖只要保持rowkey,列族,列相同即可进行覆盖操作
5)筛选扫描
scan 'user',{STARTROW =>'101',STOPROW => '101'}
6)查看表结构
describe '表名'
7)变更表信息
alter '表名',{NAME => 'info',VERSIONS => '3'}
8)删除数据
根据rowkey删除
deleteall '表名','rowkey'
根据具体的列删除
delete '表名','rowkey','列族:列'
9)清空表
truncate '表名'
10)删除表
第一步:设置不可用状态
disable '表名'
第二部:删除该表
drop '表名'
11)统计表中数据行数
count '表名'
12)查看指定rowkey值
get '表名','rowkey'
13)查看具体列值
get '表名','rowkey','列族:列'
HbaseMR
官方Hbase-Mapreduce
需求1:对一张表的rowkey进行计数
1)导入环境变量
export HBASE_HOME=/root/hd/hbase-1.3.0
export HADOOP_HOME=/root/hd/hadoop-2.8.4
export HADOOP_CLASSPATH = `${HBASE_HOME}/bin/hbase mapredcp`
可以添加到:hbase-env.sh
2)启动hbase-mr任务
/root/hd/hadoop-2.8.4/bin/yarn jar lib/hbase-server-1.3.0.jar rowcounter tongliya
需求2:本地数据导入到hbase中
思路?hbase底层存储是hdfs,把数据先导入到hdfs
hbase对应创建一张表
利用mr导入数据到表中
1)在hdfs中创建文件夹 导入本地数据
hdfs dfs -mkdir /
hdfs dfs -put .tsv /
2)创建表
create 'love','info'
3)导入操作
/root/hd/hadoop-2.8.4/bin/yarn jar lib/hbase-server-1.3.0.jar importtsv \ -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:description love hdfs:// hd09-01:9000/lovein/
需求3:将hbase中love表进行指定列的筛选然后倒入到lovemr表
1)构建Mapper类,读取love表中数据
2)构建Reducer类,将love表中数据写入到lovemr表中
3)构建driver驱动类
4) 打包 放入集群中运行这个任务
Hbase
优化方案
1)预分区设计
真正存储数据的是region要维护一个区间段的rowkey
startRow~endRowkey
-》手动设置预分区
create 'user_p','info','partition',SPLITS => ['101','102','103','104']
存在-∞ +∞
第一个分区 -∞ ~ 101
第二个分区 101~102
第三个分区 102~103
第四个分区 103~104
第五个分区 104 ~ +∞
-》生成16进制序列预分区
create 'user_p2','info','partition',{NUMREGIONS => 15,SPLITALGO => 'HexSt ringSplit'}
-》按照文件中设置的规则设置预分区
create 'user_p4','partition',SPLITS_FILE => 'splits.txt'
2)rowkey设计
一条数据的唯一标识是rowkey,此rowkey存储在哪个分区取决于
属于哪个预分区内。
为什么要设计rowkey?数据倾斜
为了防止出现数据倾斜的办法?
(1)生成随机数/hash/散列值
例如:rowkey是101 变成:dd21231dqwdqd123131d112131
102 变成:wqdqdq212131dqdwqwdqdw1d21
(2)字符串反转
2018120800011 1100080218102
2018120800012 2100080218102
(3)字符串拼接
2018120800011_a12e
2018120800012_odd12c
101~105 105~100000
3)hbase优化
(1)内存优化
一般分配70%内存给Hbase的java堆
不建议分配非常大的堆内存
一般设置为 16~48G内存即可
设置:export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"
注意:etc/hadoop下 hadoop-env.sh
(2)基础优化
-》优化DataNode
最大文件打开数
hdfs-site.xml
属性:dfs.datanode.max.transfer.threads
默认值:4096 设置大于4096
-》优化延迟高的数据操作等待时间
hdfs-site.xml
属性:dfs.image.transfer.timeout
默认:60000毫秒
调大
-》数据写入效率
压缩
属性:mapreduce.map.output.compress
值:org.apache.hadoop.io.compress.GzipCodec
-》优化Hstore的文件大小
属性:hbase.hregion.max.filesize
默认值:10GB
调小
linux/hdfs/mr/zookeeper/hive/flume/sqoop/azkaban/hbase
kafka storm