-
Flink当前是流计算中非常火的框架,同时可以利用Flink对HBase进行读写,这个是初学者的技术分享,用来分享Flink读写HBase,属于入门级的操作,Flink也可以实现更复杂的读写HBase,包括对数据的修改,后续的文章会持续给出原文地址 https://bbs.huaweicloud.com/blogs/198191Lettle whale 发表于2020-09-29 16:57:57 2020-09-29 16:57:57 最后回复 whisper_chen 2020-09-29 17:04:422525 2
-
原文地址:https://bbs.huaweicloud.com/blogs/197757一个用户做查询时遇到了MultiActionResultTooLarge,从表面来看,以为是scan的blocksize超出了,但实际不是,可以看看这个文章,了解一下具体情况,积累点经验。Lettle whale 发表于2020-09-24 09:53:50 2020-09-24 09:53:50 最后回复 whisper_chen 2020-09-24 10:06:312222 1
-
原文地址:------>https://bbs.huaweicloud.com/blogs/197806这篇文章分享了搭建单机版zookeeper,hbase,phoenix的开发环境,可以在缺少服务器的时候使用,网上也已经有许多类似的帖子Lettle whale 发表于2020-09-24 09:51:45 2020-09-24 09:51:45 最后回复 whisper_chen 2020-09-24 10:08:001818 1
-
背景:多租户共享集群时,可以针对namespace,Table,User进行请求的限制,控制负载,避免请求过多导致集群受影响。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/174641
-
生产环境HBase集群内存经常处于高位(90%),而且GC之后也是内存依然处于高位,经分析内存全部由集群的regionserver进程所持有,,经常重启之后,大概3-4天就会保持在高位。由上述症状,可以判断集群内存有泄露的嫌疑。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173946
-
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173527
-
场景说明场景说明假定HBase的table1表存储用户当天消费的金额信息,table2表存储用户历史消费的金额信息。现table1表有记录key=1,cf:cid=100,表示用户1在当天消费金额为100元。table2表有记录key=1,cf:cid=1000,表示用户1的历史消息记录金额为1000元。基于某些业务要求,要求开发Spark应用程序实现如下功能:根据用户名累计用户的历史消费金额,即用户总消费金额=100(用户当天的消费金额) + 1000(用户历史消费金额)。上例所示,运行结果table2表用户key=1的总消费金融为cf:cid=1100元。数据规划使用Spark-Beeline工具创建Spark和HBase表table1、table2,并通过HBase插入数据。确保JDBCServer已启动。然后在Spark2x客户端,使用Spark-Beeline工具执行如下操作。使用Spark-beeline工具创建Spark表table1。create table table1(key string,cid string)using org.apache.spark.sql.hbase.HBaseSourceoptions(hbaseTableName "table1",keyCols "key",colsMapping "cid=cf.cid");通过HBase插入数据,命令如下:put 'table1', '1', 'cf:cid', '100'使用Spark-Beeline工具创建Spark表table2。create table table2(key string,cid string)using org.apache.spark.sql.hbase.HBaseSourceoptions(hbaseTableName "table2",keyCols "key",colsMapping "cid=cf.cid");通过HBase插入数据,命令如下:put 'table2', '1', 'cf:cid', '1000'开发思路查询table1表的数据。根据table1表数据的key值去table2表做查询。把前两步相应的数据记录做相加操作。把上一步骤的结果写到table2表。Java样例代码功能介绍用户可以使用Spark调用HBase接口来操作HBase table1表,然后把table1表的数据经过分析后写到HBase table2表中。代码样例下面代码片段仅为演示,具体代码参见:com.huawei.bigdata.spark.examples.SparkHbasetoHbase。/** * 从table1表读取数据,根据key值去table2表获取相应记录,把两者数据后,更新到table2表 */ public class SparkHbasetoHbase { public static void main(String[] args) throws Exception { SparkConf conf = new SparkConf().setAppName("SparkHbasetoHbase"); conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); conf.set("spark.kryo.registrator", "com.huawei.bigdata.spark.examples.MyRegistrator"); JavaSparkContext jsc = new JavaSparkContext(conf); // 建立连接hbase的配置参数,此时需要保证hbase-site.xml在classpath中 Configuration hbConf = HBaseConfiguration.create(jsc.hadoopConfiguration()); // 声明表的信息 Scan scan = new org.apache.hadoop.hbase.client.Scan(); scan.addFamily(Bytes.toBytes("cf"));//colomn family org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Scan proto = ProtobufUtil.toScan(scan); String scanToString = Base64.encodeBytes(proto.toByteArray()); hbConf.set(TableInputFormat.INPUT_TABLE, "table1");//table name hbConf.set(TableInputFormat.SCAN, scanToString); // 通过spark接口获取表中的数据 JavaPairRDD rdd = jsc.newAPIHadoopRDD(hbConf, TableInputFormat.class, ImmutableBytesWritable.class, Result.class); // 遍历hbase table1表中的每一个partition, 然后更新到Hbase table2表 // 如果数据条数较少,也可以使用rdd.foreach()方法 rdd.foreachPartition( new VoidFunction<Iterator<Tuple2<ImmutableBytesWritable, Result>>>() { public void call(Iterator<Tuple2<ImmutableBytesWritable, Result>> iterator) throws Exception { hBaseWriter(iterator); } } ); jsc.stop(); } /** * 在exetutor端更新table2表记录 * * @param iterator table1表的partition数据 */ private static void hBaseWriter(Iterator<Tuple2<ImmutableBytesWritable, Result>> iterator) throws IOException { // 准备读取hbase String tableName = "table2"; String columnFamily = "cf"; String qualifier = "cid"; Configuration conf = HBaseConfiguration.create(); Connection connection = null; Table table = null; try { connection = ConnectionFactory.createConnection(conf); table = connection.getTable(TableName.valueOf(tableName)); List<Get> rowList = new ArrayList<Get>(); List<Tuple2<ImmutableBytesWritable, Result>> table1List = new ArrayList<Tuple2<ImmutableBytesWritable, Result>>(); while (iterator.hasNext()) { Tuple2<ImmutableBytesWritable, Result> item = iterator.next(); Get get = new Get(item._2().getRow()); table1List.add(item); rowList.add(get); } // 获取table2表记录 Result[] resultDataBuffer = table.get(rowList); // 修改table2表记录 List<Put> putList = new ArrayList<Put>(); for (int i = 0; i < resultDataBuffer.length; i++) { Result resultData = resultDataBuffer;//hbase2 row if (!resultData.isEmpty()) { // 查询hbase1Value String hbase1Value = ""; Iterator<Cell> it = table1List.get(i)._2().listCells().iterator(); while (it.hasNext()) { Cell c = it.next(); // 判断cf和qualifile是否相同 if (columnFamily.equals(Bytes.toString(CellUtil.cloneFamily(c))) && qualifier.equals(Bytes.toString(CellUtil.cloneQualifier(c)))) { hbase1Value = Bytes.toString(CellUtil.cloneValue(c)); } } String hbase2Value = Bytes.toString(resultData.getValue(columnFamily.getBytes(), qualifier.getBytes())); Put put = new Put(table1List.get(i)._2().getRow()); // 计算结果 int resultValue = Integer.parseInt(hbase1Value) + Integer.parseInt(hbase2Value); // 设置结果到put对象 put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier), Bytes.toBytes(String.valueOf(resultValue))); putList.add(put); } } if (putList.size() > 0) { table.put(putList); } } catch (IOException e) { e.printStackTrace(); } finally { if (table != null) { try { table.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null) { try { // 关闭Hbase连接 connection.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
-
superset可以用来数据可视化展示,可以对接Hive和HBase。由于Hive不适用于实时展示数据,所以尝试用superset链接HBase数据库,但是superset不能直接访问HBase,需要安装Phoenix,所以本文介绍Phoenix的安装,Phoenix对接HBase以及对接superset的方法。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173189
-
原文地址:https://bbs.huaweicloud.com/blogs/192853 ,可以学习一下HBase是怎样从HFile中找到某个rowkey?如果创建表时,指定了BloomFilter,那么就根据BloomFilter快速的判断该rowkey是否在这个HFile中。但BloomFilter也会存在错误率。所以主要来看下不使用BloomFilter下,是如何查找到rowkey在哪个HFile下。HBase首先根据时间戳和查询列的信息对file做一次过滤,将查询范围缩小。仍然需要扫描其余的文件,storeFile之间是无序的,而且StoreFile的rowkey范围会有交叉,所以并不会按照StoreFile顺序的查找。HBase会首先查看每个StoreFile的最小的rowkey,然后按照从小到大的顺序进行排序,结果放到一个队列中。接下来只会扫描比查询Rowkey大的记录的StoreFile,下面开始查询数据,整个过程用到了类似归并排序的算法,首先通过poll取出队列的头storefile,会从storefile读取一条记录返回;接下来呢,该StoreFile的下条记录并不一定是查询结果的下一条记录,因为队列的比较顺序是比较的每个storefile的第一条符合要求的rowkey。所以,hbase会继续从队列中剩下的storefile取第一条记录,把该记录与头storefile的第二条记录做比较,如果前者大,那么返回头storefile的第二条记录;如果后者大,则会把头storefile放回队列重新排序,在重新取队列的头storefile。然后重复上面的整个过程,直到找到key所在的HFile。范围缩小到该HFile后,就根据HFile文件中的索引去定位到块,快速的找到对应的记录。单个HFile文件中的索引主要是根据索引块的大小来提升速率。 Region下单个HFile文件数越多,一次查询就会需要更多的IO操作,延迟必然会越来越大。 如下图一所示,随着数据写入不断增加,文件数不断增多,读取延时也在不断变大。 文件数基本稳定,进而IO Seek次数会比较稳定,延迟就会稳定在一定范围。下图是不断写入数据,hfile数量变多,不断Compaction合成大文件,文件数量基本稳定,查询时延也基本稳定。 HFile结构HFile的数据块,元数据块通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO 图中上面三层为索引层,在数据量不大的时候只有最上面一层,数据量大了之后开始分裂为多层,最多三层,如图所示。最下面一层为数据层,存储用户的实际keyvalue数据。这个索引树结构类似于InnoSQL的聚集索引,只是HBase并没有辅助索引的概念。图中红线表示一次查询的索引过程(HBase中相关类为HFileBlockIndex和HFileReaderV2),基本流程可以表示为:1. 用户输入rowkey为fb,在root index block中通过二分查找定位到fb在’a’和’m’之间,因此需要访问索引’a’指向的中间节点。因为root index block常驻内存,所以这个过程很快。2. 将索引’a’指向的中间节点索引块加载到内存,然后通过二分查找定位到fb在index ‘d’和’h’之间,接下来访问索引’d’指向的叶子节点。3. 同理,将索引’d’指向的中间节点索引块加载到内存,一样通过二分查找定位找到fb在index ‘f’和’g’之间,最后需要访问索引’f’指向的数据块节点。4. 将索引’f’指向的数据块加载到内存,通过遍历的方式找到对应的keyvalue。上述流程中因为中间节点、叶子节点和数据块都需要加载到内存,所以io次数正常为3次。但是实际上HBase为block提供了缓存机制,可以将频繁使用的block缓存在内存中,可以进一步加快实际读取过程。所以,在HBase中,通常一次随机读请求最多会产生3次io,如果数据量小(只有一层索引),数据已经缓存到了内存,就不会产生io。 1、数据块–保存表中的数据,每一个数据块由块头和一些keyValue(record)组成,key的值是严格按照顺序存储的。块大小默认为64K(由建表时创建cf时指定或者HColumnDescriptor.setBlockSize(size)),这一部分可以压缩存储。在查询数据时,是以数据块为单位从硬盘load到内存。查找数据时,是顺序的遍历该块中的keyValue对。2、元数据块 (可选的)–保存用户自定义的kv对,可以被压缩。比如booleam filter就是存在元数据块中的,该块只保留value值,key值保存在元数据索引块中。每一个元数据块由块头和value值组成。可以快速判断key是都在这个HFile中。3、File Info–Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。4、数据索引块 –Data Block的索引,每条索引的key是被索引的block的第一条记录的key(格式为:头信息,数据块offset数据块大小块第一个记录的key,........)。 BloomFilter的作用,以及单HFile,关闭BloomFilter的作用BloomFilter Meta Block & Bloom BlockBloomFilter对于HBase的随机读性能至关重要,对于get操作以及部分scan操作可以剔除掉不会用到的HFile文件,减少实际IO次数,提高随机读性能。在此简单地介绍一下Bloom Filter的工作原理,Bloom Filter使用位数组来实现过滤,初始状态下位数组每一位都为0,如下图所示:假如此时有一个集合S = {x1, x2, … xn},Bloom Filter使用k个独立的hash函数,分别将集合中的每一个元素映射到{1,…,m}的范围。对于任何一个元素,被映射到的数字作为对应的位数组的索引,该位会被置为1。比如元素x1被hash函数映射到数字8,那么位数组的第8位就会被置为1。下图中集合S只有两个元素x和y,分别被3个hash函数进行映射,映射到的位置分别为(0,2,6)和(4,7,10),对应的位会被置为1:现在假如要判断另一个元素是否是在此集合中,只需要被这3个hash函数进行映射,查看对应的位置是否有0存在,如果有的话,表示此元素肯定不存在于这个集合,否则有可能存在。下图所示就表示z肯定不在集合{x,y}中:HBase中每个HFile都有对应的位数组,KeyValue在写入HFile时会先经过几个hash函数的映射,映射后将对应的数组位改为1,get请求进来之后再进行hash映射,如果在对应数组位上存在0,说明该get请求查询的数据不在该HFile中。一次get请求进来,首先会根据key在所有的索引条目中进行二分查找,查找到对应的Bloom Index Entry,就可以定位到该key对应的位数组,加载到内存进行过滤判断。而如果只有一个HFile,就不需要查找BloomIndex,可以减少一次IO。
-
HBase在设计上,遵循了LSM-Tree的原理:写数据阶段,尽最大努力先将每一个Region的数据保留在内存(MemStore)中,等达到一定的阈值(默认为64M)之后,再将这些数据固化(Flush)到文件(HFile)中。在这过程中,为了保证数据的安全性,通过将数据写入到一个日志文件(HLog)中:详情请点击博文链接:https://bbs.huaweicloud.com/blogs/165014
-
标签数据已经成为越来越普遍的一类数据,以用户画像场景最为典型,如在电商场景中,这类数据可被应用于精准营销推荐。常见的用户画像标签数据举例如下:基础信息:如性别,职业,收入,房产,车辆等。购买能力:消费水平、败家指数等。行为特征:活跃程度,购物类型,起居时间等。兴趣偏好:品牌偏好,颜色偏好,价格偏好等。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/163489
-
原文地址:https://bbs.huaweicloud.com/blogs/184848初学者在使用HBase时,由于不了解原理,在使用的时候经常会犯一些错误,导致使用时性能不佳,这篇文章列出了一些客户端api的规范,可以参考学习一下。Lettle whale 发表于2020-07-15 11:35:10 2020-07-15 11:35:10 最后回复 whisper_chen 2020-08-04 09:59:181414 3
-
hbtop是针对HBase的实时监视工具,其模仿Unix的_top_命令。 它可以显示摘要信息和每个Region / Namespace / Table / RegionServer的各项指标。 使用此工具,你可以查看按选定字段排序的指标,并且可以过滤仅查看感兴趣的指标。此外,借助向下钻取功能,您可以挖掘热点Region。此工具可以在hbase2.2.2,2.3.0版本中使用,对监控集群状态有很好的帮助,感兴趣的可以点击链接查看:https://bbs.huaweicloud.com/blogs/180585
上滑加载中
推荐直播
-
华为AI技术发展与挑战:集成需求分析的实战指南
2024/11/26 周二 18:20-20:20
Alex 华为云学堂技术讲师
本期直播将综合讨论华为AI技术的发展现状,技术挑战,并深入探讨华为AI应用开发过程中的需求分析过程,从理论到实践帮助开发者快速掌握华为AI应用集成需求的框架和方法。
去报名 -
华为云DataArts+DWS助力企业数据治理一站式解决方案及应用实践
2024/11/27 周三 16:30-18:00
Walter.chi 华为云数据治理DTSE技术布道师
想知道数据治理项目中,数据主题域如何合理划分?数据标准及主数据标准如何制定?数仓分层模型如何合理规划?华为云DataArts+DWS助力企业数据治理项目一站式解决方案和应用实践告诉您答案!本期将从数据趋势、数据治理方案、数据治理规划及落地,案例分享四个方面来助力企业数据治理项目合理咨询规划及顺利实施。
去报名
热门标签