BigData-12:HBase进阶

问题: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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phial03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值