• [技术干货] 每日分享:Flink初学之读写HBase
    Flink当前是流计算中非常火的框架,同时可以利用Flink对HBase进行读写,这个是初学者的技术分享,用来分享Flink读写HBase,属于入门级的操作,Flink也可以实现更复杂的读写HBase,包括对数据的修改,后续的文章会持续给出原文地址 https://bbs.huaweicloud.com/blogs/198191
  • [技术干货] 每日分享:分享一个用户的HBase问题-MultiActionResultTooLarge
    原文地址:https://bbs.huaweicloud.com/blogs/197757一个用户做查询时遇到了MultiActionResultTooLarge,从表面来看,以为是scan的blocksize超出了,但实际不是,可以看看这个文章,了解一下具体情况,积累点经验。
  • [技术干货] 每日分享:分享一个单机版hbase开发环境的使用
    原文地址:------>https://bbs.huaweicloud.com/blogs/197806这篇文章分享了搭建单机版zookeeper,hbase,phoenix的开发环境,可以在缺少服务器的时候使用,网上也已经有许多类似的帖子
  • [技术干货] HBase Quota的使用
    背景:多租户共享集群时,可以针对namespace,Table,User进行请求的限制,控制负载,避免请求过多导致集群受影响。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/174641
  • [技术干货] HBase&&GeoMesa 内存优化
            生产环境HBase集群内存经常处于高位(90%),而且GC之后也是内存依然处于高位,经分析内存全部由集群的regionserver进程所持有,,经常重启之后,大概3-4天就会保持在高位。由上述症状,可以判断集群内存有泄露的嫌疑。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173946
  • [技术干货] HBase篇---Shell命令行和Rest API
     HBase篇---Shell命令行和Rest API详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173943
  • [技术干货] HBase学习之:HBase RPC
    RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173527
  • [赋能学习] 【场景用例】消费记录查询,Spark读写HBase
    场景说明场景说明假定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();         }       }     }   } }
  • [技术干货] MRS的HBase集群上安装Phoenix并对接superset
    superset可以用来数据可视化展示,可以对接Hive和HBase。由于Hive不适用于实时展示数据,所以尝试用superset链接HBase数据库,但是superset不能直接访问HBase,需要安装Phoenix,所以本文介绍Phoenix的安装,Phoenix对接HBase以及对接superset的方法。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/173189
  • [技术干货] 每日分享:HBase是怎样从HFile中找到某个rowkey
    原文地址: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。  
  • 活跃Region数对HBase运行集群的影响
    HBase在设计上,遵循了LSM-Tree的原理:写数据阶段,尽最大努力先将每一个Region的数据保留在内存(MemStore)中,等达到一定的阈值(默认为64M)之后,再将这些数据固化(Flush)到文件(HFile)中。在这过程中,为了保证数据的安全性,通过将数据写入到一个日志文件(HLog)中:详情请点击博文链接:https://bbs.huaweicloud.com/blogs/165014
  • [技术干货] HBase与AI/用户画像/推荐系统的结合:CloudTable标签索引特性介绍
    标签数据已经成为越来越普遍的一类数据,以用户画像场景最为典型,如在电商场景中,这类数据可被应用于精准营销推荐。常见的用户画像标签数据举例如下:基础信息:如性别,职业,收入,房产,车辆等。购买能力:消费水平、败家指数等。行为特征:活跃程度,购物类型,起居时间等。兴趣偏好:品牌偏好,颜色偏好,价格偏好等。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/163489
  • [技术干货] 每日分享:HBase客户端代码书写规范
    原文地址:https://bbs.huaweicloud.com/blogs/184848初学者在使用HBase时,由于不了解原理,在使用的时候经常会犯一些错误,导致使用时性能不佳,这篇文章列出了一些客户端api的规范,可以参考学习一下。
  • MRS:SparkStreaming对接安全kafka写入hbase样例
    参考https://bbs.huaweicloud.com/forum/thread-58924-1-1.html
  • [技术干货] 每日分享:hbase hbtop工具介绍
    hbtop是针对HBase的实时监视工具,其模仿Unix的_top_命令。 它可以显示摘要信息和每个Region / Namespace / Table / RegionServer的各项指标。 使用此工具,你可以查看按选定字段排序的指标,并且可以过滤仅查看感兴趣的指标。此外,借助向下钻取功能,您可以挖掘热点Region。此工具可以在hbase2.2.2,2.3.0版本中使用,对监控集群状态有很好的帮助,感兴趣的可以点击链接查看:https://bbs.huaweicloud.com/blogs/180585  
总条数:145 到第
上滑加载中