大数据HBase(二)
Hbase的shell命令
1. help 帮助命令
help '命令名字'
2. hbase中数据库的概念
hbase中没有数据库的概念 , 只有 namespace,我们为了方便,暂时也叫做数据库
2.1 显示所有的数据库
list_namespace
默认会有 default hbase 两个库
2.2 显示当前数据库中所有的表 (namespace_name 以下简称 ns)
list_namespace_tables 'ns'
2.3 创建一个数据库
create_namespace 'ns'
2.4 描述数据库
describe_namespace 'ns'
2.5 修改数据库
alter_namespace
2.6 删除数据库
drop_namespace 'ns'
3. 创建hbase中的表【重点】
3.1 基本的建表方式【默认建在default库中】
create 't1','cf1' ---- t1:代表表名 cf1:代表列簇
3.2 创建多个列簇【默认建在default库中】
create 't1','cf1','cf2'
3.3 指定表所属的数据库
create 'ns:t1','cf1'
3.4 详细描述列簇的相关属性
create 'ns:t2',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2'}
4. 描述表
describe 'ns:t1'
5. 修改表
alter 'ns:t2',{NAME=>'cf2',VERSIONS=>2}
6. 删除表
disable 'ns:t2'
drop 'ns:t2'
7. 失效 生效表相关命令
enable disable
enable_all disable_all
is_enable is_disable
8. 判断表是否存在
exists
9. 表的查找命令
list 'ns:t.*'
10. 插入数据
put 't1','rowkey','family:qualify','value'
put 'ns:t1','rowkey','family:qualify','value'
11. 删除数据
delete 'ns:t1','rowkey','family:qualify','timestamp'
12. 全表扫描
scan '表名'
scan 'ns1:tb1',{STARTROW=>'001',STOPROW=>'003'}
# 不包括stoprow的值
13. 某条数据的查询
get 'ns:t1','rowkey'
get 'ns:t1','rowkey','base:cf1'
Hbase集群的搭建(我是以三台虚拟机为例,如有需要可以扩充)
hadoop.hbase1、hadoop.hbase2、hadoop.hbase3
-
时间同步集群
hadoop.hbase1 作为时间同步服务器 主节点 1. yum -y install ntp yum安装ntp 2. service ntpd start 三台虚拟机 chkconfig ntpd on 设置开机自启动 3. 服务器节点 主节点 ntpdate -u 202.112.10.36 同步主节点时间 vi /etc/ntp.conf 修改配置文件 添加以下内容 restrict 192.168.134.0 mask 255.255.255.0 nomodify notrap # 中国这边最活跃的时间服务器 : http://www.pool.ntp.org/zone/cn server 210.72.145.44 perfer # 中国国家受时中心 server 202.112.10.36 # 1.cn.pool.ntp.org server 59.124.196.83 # 0.asia.pool.ntp.org # 允许上层时间服务器主动修改本机时间 restrict 210.72.145.44 nomodify notrap noquery restrict 202.112.10.36 nomodify notrap noquery restrict 59.124.196.83 nomodify notrap noquery # 外部时间服务器不可用时,以本地时间作为时间服务 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 service ntpd restart 4. client端(也就是其他两个从机) vi /etc/ntp.conf server 192.168.111.41 #这里指的是ntp服务的ip 192.168.206.130 restrict 192.168.111.41 nomodify notrap noquery server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 5. 三台机器重启服务 service ntpd restart 6. 从节点同步主节点时间 ntpdate -u 主节点IP 7. date 命令查看处理结果
-
Hadoop集群(详见 大数据Hadoop、yarn学习笔记)
HDFS集群 Yarn集群
-
Zookeeper集群(详见 大数据zookeeper 学习笔记)
1. 解压缩 2. 创建数据文件夹 zookeeper_home/data 3. 修改配置文件 conf/zoo.cfg dataDir server.0 4. 在data文件夹中创建 myid文件 0 1 2 5. 启动服务
-
Habse集群
1. 准备:hbase_home下 data/tmp logs目录中的内容清空 hdfs服务器 上面 hbase目录清空 如果没有 需要创建 hbase文件夹 2. 修改 hbase_home/conf/hbase-env.sh export JAVA_HOME=/usr/java/jdk1.7.0_71 #本机安装jdk的路径 export HBASE_MANAGES_ZK=false #默认true:使用集群自带的zookeeper 3. conf/hbase-site.xml <property> <name>hbase.tmp.dir</name> <value>/opt/install/hbase-0.98.6-hadoop2/data/tmp</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop41:8020/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop41,hadoop42,hadoop43</value> </property> 4. regionservers hadoop.hbase1 hadoop.hbase2 hadoop.hbase3 5. 替换 hbase_home/lib 下面的jar包 hadoop zookeeper jar #此步骤同 hbase伪分布式集群搭建步骤 6. scp分发 给其他两个从机 7. 启动hbase bin/hbase-daemon.sh start master bin/hbase-daemon.sh start regionserver
Hbase的Java API
# java访问Hbase的核心API
Configuration Hbase相关的配置
HTable Hbase中的表
Put 插入数据
Get 查询数据
Scan 扫描数据
BytesUtil 字节处理
pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.6-hadoop2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>0.98.6-hadoop2</version>
</dependency>
对象 | 作用 | 基本用法 |
---|---|---|
Configuration | Hbase相关的配置文件 | conf.set(“key”,“value”); |
HTable | Hbase中的表 | 表相关的操作都是HTable完成 |
Put | Hbase中插入数据 | Put put=new Put(rowkey) put.add HTable.put(put) |
Delete | Hbase中的删除操作 | Delete delete = new Delete(rowkey) HTable.delete(delete) |
Get | Hbase查询单条数据 | Get get = new Get(rowkey) HTabel.get(get) --> result |
Result | 单行数据 | Result – Cells – Cell cloneFamily cloneQualify cloneValue |
Scan | 表的扫描 | ResultScanner —> Result |
Hbase中的过滤器
-
行键相关的过滤
1. 比较行键值的大小 Filter filter = new RowFilter(CompareFilter.CompareOp.GREATER,new BinaryComparator(Bytes.toBytes('rowkey'))); // rowkey 为需要比较的行键值 需要填入真实的行键 scan.setFilter(filter); 2. 比较行键 按照自己设定的规则设计 Filter filter = new PrefixFilter(Bytes.toBytes('xxx')); //xxx:需要填入 自定义的行键值,可以是行键的一部分 比如:rowkey:0001 xxx:000 scan.setFilter(filter);
-
列簇相关的筛选
1. 只要base列簇相关的数据 Filter filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes('cf'))); // cf:column family 填入需要筛选的列簇 scan.setFilter(filter);
-
限定符相关的筛选
~~Filter filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes('qualify'))); //qualify:填入需要筛选的限定符 scan.setFilter(filter);
-
值的筛选
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator('value')); //value:填入需要筛选的值 scan.setFilter(filter);
-
列簇中的数据筛选
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("cf"),Bytes.toBytes("qualify"),CompareFilter.CompareOp.EQUAL,new SubstringComparator("value")); filter.setFilterIfMissing(true); //filter.setFilterIfMissing(false); //符合要求的数据 password=123456 //column 中不包含password限定符 查询出来 scan.setFilter(filter); 同时要排除qualify限定符 SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter(Bytes.toBytes("cf"),Bytes.toBytes("qualify"),CompareFilter.CompareOp.NOT_EQUAL,new SubstringComparator("value")); filter.setFilterIfMissing(true); //filter.setFilterIfMissing(false); //符合要求的数据 password=123456 //column 中不包含password限定符 查询出来 scan.setFilter(filter);
-
FilterList
设置多个过滤器 同时生效 FilterList filterList = new FilterList(); Filter filter1 = new PrefixFilter(Bytes.toBytes('xxx')); SingleColumoValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes('cf'),Bytes.toBytes('qualify'),CompareFilter.CompareOp.EQUAL,new SubstringComparator('value')); filter2.setFilterIfMissing(true); filterList.addFilter(filter1); filterList.addFilter(filter2); scan.setFilter(filterList);
HBase中列簇的相关属性
1. 创建HBase表
create 'table_name',{NAME=>'',VERSIONS=>''}
2. Hbase列簇的常见属性
# 列簇的名字
NAME='xxxxx'
# 列簇对应限定符 能存几个版本的数据
VERSIONS => '1'
# TTL Time To Live
指定的是cell中的数据,存储在HBase中的存活时间 'FOREVER'
TTL => 100
# 指定HBase上存储的数据 是否 启动压缩
COMPRESSION => 'NONE'
COMPRESSION => 'snappy'
# 列簇中的数据,存储在内存中,提高查询效率 (默认关闭)
IN_MEMORY => 'false’
# 缓存 列簇部分数据,从而提高查询效率
BLOCKCACHE => 'true'
# Block是列簇中存储数据的最小单位
BLOCKSIZE => '65536'
调整大 顺序查询 需求高
调整小 随机查询 需求高
# 提高查询效率
BLOOMFILTER 布隆过滤
HBase的体系结构
-
RegionServer 【重点】
-
HMaster作用
1. HRegionServer 集群是否健康 2. Region---RegionServer分配 3. 新Region加入后,负载均衡
-
Zookeeper作用 【重点】
1. 管理HMaster的高可用 2. 存储了HBase中非常重要的信息 meta信息 rowkey 范围 ---- region ---- RegionServer(健康)
-
HBase compact 和 split
RowKey设计
1. HBase相关的查询操作,95%上都是对RowKey查询。
2. 设计过程
2.1 复合
2.2 查询内容作为rowkey组成
3. rowkey 64K 10--100字节唯一
4. rowkey结合自己的实际需求
4.1 区域查询多,建议 rowkey 连续
4.4 区域查询少,散列 hash ---> 加密、UUID
System.out.println(UUID.randomUUID().toString());
String rowkey = "suns_male_130";
String result = DigestUtils.md5Hex(rowkey);
System.out.println(result);
HBase优化策略
-
解决热点效应
1. 预分区 在创建表时,不按照默认的策略,为表只创建一个Region,而是根据需要,为一张表创建多个Region,从而避免热点效应 2. 预分区的依据 基于Rowkey进行预分区 3. 语法: 3.1 create 't1', 'f1', SPLITS => ['10', '20', '30', '40'] 3.2 create 't1', 'f1', SPLITS_FILE => 'splits.txt' splits.txt 10 20 30 40 3.3 create 't2', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} 4. 根本上解决热点问题需要注意如下几点 1. 预分区 2. rowkey设置 综上2者尽量解决热点问题。
-
如何提高检索效率
1. rowkey 相对连续 那么检索效率一定高 (顺序查询 scan操作) 2. 设置Memstore大小 , Block Cache大小 hbase-site.xml 设置 hbase.hregion.memstore.flush.size 128M 每一个memstore达到128M flush hbase.regionserver.global.memstore.size 0.4 堆空间的40% (regionserver占用JVM 对空间) 1. 让数据尽可能多的放置在内存中,提高检索效率 2. 避免flush memstore 阻塞client操作 hbase.regionserver.global.memstore.size.lower.limit 当全局flush到 memstore用量达95%不在flush hfile.block.cache.size 0.4 3. hbase内部的块数据索引,布隆过滤器
-
JVM参数配置
1. JVM Java进程 2. JVM (堆空间) HBase 新生代 1/3 老年代 2/3 永久代(静态,常量) eden survivor(from) survivor(to) 8 1 1 ParNewGC ConcMarkSweepGC ”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC -XX:UseConcMarkSweepGC - XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log” hbase-env.sh export HBASE_REGIONSERVER_OPTS=”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log”
-
mslab
1. 防止内存碎片,内存碎片过多,内存泄露,发生FullGC,导致STW. hbase.hregion.memstore.mslab.enabled true hbase.hregion.memstore.mslab.chunksize 2M --> 4,5M 6M
-
自动化处理的功能变成手工处理
结合定时,shell脚本 完成处理 hbase tools 手工操作 compact split test.sh /opt/install/hbase-0.98.6-hadoop2/bin/hbase shell /root/hbase/test
HBase与MapReduce的集成
-
Hbase为什么需要和MR集成?
HBase数据的迁移。
-
MR改如何与HBase集成
hadoop-env.sh export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/install/hbase-0.98.6-hadoop2/lib/*