HBase 的学习笔记

HBase学习笔记,有点乱。

Hbase特点:
稀疏
多版本
无类型:都是字符串
高性能随机读写
三种查询方式:单个rowkey 查询,通过rowkey的range查询,全表扫描
HDFS 只支持 append,追加操作?
数据模型:kv 
rowKey
column family
column
cell 包含多个版本的value
时间戳(版本)
 rowkey + column family:column + version => value


table:
多个 region组成,存储和负载均衡的最小单位,存放在多个region server 中,按照 rowkey 的字典序(1,11,2,21,3)排序
大的region split 成 2个 region并 负载均衡;父region退出。
HRegionServer <--> dataNode
每个region server(每个region )有个HLog ,保存记录操作,先写入memstore ,阈值 flush 到 storefile -> compact 形成大的 storefile,以hfile的格式写到HDFS中
体系:
client
zookeeper(保证只有一个master,存储所有region的寻址入口)
Master
为RegionServer 分配 region,负责 regionServer loadbalance
RegionServer
切分(split)在运行过程中过大的region
Root表(也是存放在regionserver中)
meta表
3级表结构:(存储层面)
zookeeper file 记录root的location。
root 表 记录 meta 中每个region的信息,root中最多只有一个region,
meta表,记录各表每个region所在的regionserver,meta表总可能包含多个region。为什么是这样的存放结构


操作:cf(column family)对应 一个 store(包括memstore+storefile)
1)flush
内存有限,需当memstore满后flush至磁盘,每flush,每个region 的每个cf产生一个hfile,regionserver会把多个hfile并一起
2)compaction
flush产生的hfile越来越多,需归并减少hfile,旧数据被清理
3)split
compaction 到某个阈值就触发split,把region split成2个region,这2个region被分发到不同的regionserver中
4)scan
顺序扫描,
5)bulk load
快速导入大批量数据的方法
shell 操作:


HA 的 editlog
QJM 的方案


Hadoop HA 特点
 hadoop /conf/
  core-site.xml
  ha.zookeeper.quoram -> xxx:2181,yyy:2181,zzz:2181


 HBase操作:
  1) create 't1','f1','f2' --> 建表t1时,列族f1','f2' --> 建表t1时,列族需要确定
  2) list 查看表
  3) describe 't1' 查看表结构
  --> VERSIONS = 1(默认只有最新的版本),怎么改
  alter  't1',{NAME=>'f1',VERSIONS=>3} 改成有3个版本
  4) put 't1'(表名),'t1_rowkey'(rowkey),'f1:column1'(列族:列),'hello'(value)
  5) scan (全表扫描,很少用) scan
  scan 't1',{STARTROW=>'j',ENDROW='K'}  
  6) get 't1','t1_rowkey' --> 默认最新的值
  get 'scores','Tom',{COLUMN=>'course:math',VERSION=>2}  获得2个版本的值
7) count 't1' ,采用 协处理器coprocess 的思想
8) 删除表 disable 't1' --> 改为 offline 的状态
   drop 't1'  删除表结构
9) truncate 't1' ,删除数据,表结构还在 (disable drop create 的组合)
10) delete 't1','rowkey'


HBaseConfigarution
HBaseConfigarution config = new HBaseConfigarution();
HBaseAdmin(对表进行管理)
HBaseAdmin admin = new HBaseAdmin(config)
admin.disble("table_name")
HTableDescriptor(对应Table及其列族,对表信息进行操作)
HTableDescriptor ht = new HTableDescriptor("table_name");
ht.addFamily(new HColumnDescriptor("family")) -> 增加列族 
HColumnDescriptor(列族)
见HTableDescriptor
HTable(真正的表实例,非线程安全),使用HConnection,HTablePool已经弃用
HTable<1>Configuration -> HTable<1>HConnection,因为根据Configuration 创建 HConnection 
HConnection才是HBase客户端到Hbase集群的真正的连接。Hbase抛弃了HTablePool,我们唯一要做的就是保证HConnection实例是唯一的,全局共享的。使用同一个Confuguration的HTable都会共用一个HConnection,那么HTablePool就显得那么多余。然后针对HTableInterface对象最好在每次操作HBase表的时候根据HConnection对象来重新创建,使用完成之后及时关闭即可!
Configuration config = HBaseConfiguration.create();
Connection conn = HConnectionManager.createConnection(config);
conn.getTable("table_name");
Put(先写到缓冲区中)
HTable tb = conn.getTable("table_name");
Put put = new Put(rowKey); //参数是rowkey
put.add(family,qualifer,value);
tb.put(put);
Get 返回值 Result
ResultScanner canner=table.getScanner(table_name)
for(Result result:canner){


}
写代码,要有log
Scanner 配合 cache 使用
Scanner scan = new Scanner();--> 从第一条开始
scan.setCaching(1000);
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Byte.toBytes("Jack")));
scan.setFilter(filter);
//------------------   
PageFilter(可用于分页)
PageFilter filter = new PageFilter(15);
Byte[] lastRow =  null;
int pageCount = 0;
Scan scan = new Scan(filter);
if(lastRow !=null){
scan.setStartRow(lastRow);
}
ResultScanner scanner = table.getScanner(scan);
int count = 0;
for(Result rs:scanner){
lastRow = rs.getRow();
-->有个问题,上批次的最后一条会处理2次
我的处理办法
if(rs.getRow.getId()%(15-1)!=0){
lastRow = rs.getRow();--根据Index
}
或者是多取一条,最后一条不处理
}
Filter
Comparision Filter(比较过滤器)
Dedicated Filter(专用过滤器)
Decorating Filter (附加过滤器)


************HBase coprocessor*********************
协处理器:帮助容易实现二索,和复杂过滤器(谓词下推)处理的本质是先在服务器上统计,然后返回给客户端
MR是先返回给客户端,再做统计。
HBase的缺点:无法简易建二级索引。
两种:系统协处理器,可全局导入regionserver的所有表
表协处理器,指定一张表
包括2个功能模块
Observer(向触发器,主动触发,不灵活)
RegionObserver(表数据)
WALObserver(WAL的操作)
MasterObserver(表结构)
EndPoint(像存储过程,用户提交)
************HBase容错*********************
WAL(预写日志)[HLog]
先写到HLog,再写memstore
一个RegionServer 只有一个HLog
优点:减少IO,速度快。
问题:split log ,如果regionA 挂了,在其他regionserver中恢复,那么也需要吧HLog 分裂到 那台regionServer中去。
WALEditer:
包含了多个client的操作,成一个原子操作。
LogSyncer:
同步同一个表中不同region的日志


************HBase备份*********************
HBase Replication
基本架构:主推送(master-push),有点像Mysql主从备份
方案比较
简单备份模式:通过snapshot定时Dump数据
Master-Slave:实时写入,读写分离,用checkpoing实现,
主,读写服务;从,读(异步写入从)
Master-Master:主1,写;主2,读。要同时提交到2主中区
对数据延迟性要求比较高,吞吐量不高。
2阶段提交:保证强一致性和事务。服务器返回数据说明备份成功,用同步的方式,不会造成任何数据的丢失。缺点,延迟高。吞吐量下降。
Paxos:强一致性。
************HBase数据迁移*********************
静态迁移
动态迁移


************HBase数据导入*********************
利用ImportTsv将csv文件导入到HBase
/bin/...ImportTsv -Dimporttsv.separator=","
-Dimporttsv.columns=
bulkload的入库方式
先用ImportTsv生成HFile,再BulkLoad,非常高效
import 导入 seqence文件
export 导出
********HBase构建二级索引(一级索引:rowkey)********
MapReduce:倒数索引,需写MapReduce程序,并打成Jar包
ad:并发批量构建Index,disa:不能实时
需要另外创建表
原表:
create 'studens','f1'
put 'students','1','f1:name','zhangsan'
索引表:
create 'students-name','f1'
将Jar包放在hbase/lib下,
hbase XXX [+参数]
如果hadoop jar lib/XXX.jar 会报找不到Hbase/lib的错
IHBASE/ITHbase:hbase的扩展,消耗大量内存,需要重构hbase,没有更新了
原理:flush时,IHbase进行拦截,并为这个memstore构建索引,索引以cf的格式存储在表内。scan会利用这个索引加速。
HIndex 华为的方案(基于hbase0.94),利用Coprocessor
原理:index 是一个单独的表,与实际表的region 一一对应。 
Index table rowkey = region startkey + index name + indexed column value + user table rowkey。
Solr:比较灵活,没有修改代码
HBase对多字段的组合并不支持
原理:Solr中存放的index信息,Hbase存放的是原始信息。
下载 hbase-solr-xxx.tar.gz 文件
hbase->hbase-indexer-> solr
hbase-indexer-env.sh
配置hbase-indexer-site.xml,必须开启hbase.replication=true,因为需要使用这个功能
add indexer jars to HBase
-> cp lib/hbase-sep-*  $HBASE_HOME/lib
启动solr: 
//----操作
./hbase-indexer server
$hbase shell
create 'indexdemo-user',{NAME='info',REPLICATION_SCORE=>'1'}
<indexer table="indexdemo-user">
<field name="firstname_s" value="info:firstname">
<field name="lastname_s" value="info:lastname">
</indexer>
添加索引(1.添加到了hbase中)
./hbase-indexer add-indexer -n myindexer -c indexdemo-indexer.xml
-cp ......
然后(2.添加到了solr中,用来solr对数据的查询)
把indexdemo-indexer.xml中的字段名放到 slor/conf/schema.xml中
--这样的格式
<field name="firstname_s" type="string" indexed="true" stored="true">
<field name="lastname_s" type="string" indexed="true" stored="true">
solr-config.xml
开启auto-commit
solr API
solrJ API 
*****************************
BloomFilter cf级别的配置属性
默认在hbase中基于row的,根据row 来过滤storefile
还有一种rowcol,根据row+ qualifier 来过滤storefile
提高随机读(Get)的性能
Get/Scan 版本推进:
memstore(storefile) --> read -> merge --> client
memstore(storefile)-->Block cache->read->merge->scaner cache --> client
memstore(storefile)->Block cache->bloom filter->read->merge->scaner cache --> client


************HBase存储文件*********************
B+树:
LSM树 :解决HBase 中大文件分散的存储
HBase中 HFile 大致包括
Data|Meta(可选)|FileInfo(表信息)|Index(data偏移量)|Trailer(指针) 4部分
HRegionServer中有基于LRU的BlockCache机制
MapReduce 中,
Combiner 
对 map output的数据在本地 进行 combine,这样可以提高reducer速度
使用场景:
Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。
Partioner
hashPartioner是Partitioner默认实现。
which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到当前的目的reducer。
HDFS
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值