作家
登录

大数据查询——HBase 读写设计与实践

作者: 来源: 2017-12-20 16:04:59 阅读 我要评论

不合的营业场景及数据特点肯定命目标方法不一样,我小我认为应当综合推敲数据量大年夜小和集群大年夜小等身分。比如 check 表大年夜小约为 11G,测试集群大年夜小为 10 台机械,hbase.hregion.max.filesize=3G(当 region 的大年夜小跨越这个数时,将拆分为 2 个),所以初始化时尽量使得一个 region 的大年夜小为 1~2G(不会一上来就 split),region 数据分到 11G/2G=6 个,但为了充分应用集群资本,本文中 check 表划分为 10 个分区。如不雅数据量为 100G,且赓续增长,集群情况不变,则 region 数量增大年夜到 100G/2G=50 个阁下较合适。Hbase check 表建表语句如下:

个中,Column Family =‘f’,越短越好。

COMPRESSION => 'SNAPPY',HBase 支撑 3 种紧缩 LZO, GZIP and Snappy。GZIP 紧缩率高,然则耗 CPU。后两者差不多,Snappy 稍微胜出一点,cpu 消费的比 GZIP 少。一般在 IO 和 CPU 均衡下,选择 Snappy。

DATA_BLOCK_ENCODING => 'FAST_DIFF',本案例中 RowKey 较为接近,经由过程以下敕令查看 key 长度相对 value 较长。


Step2:RowKey 构成

Salt

让数据均衡的分布到各个 Region 上,结合 pre-split,我们对萌芽键即 check 表的 check_id 求 hashcode 值,然后 modulus(numRegions) 作为前缀,留意补齐数据。

解释:如不雅数据量达上百 G 以上,则 numRegions 天然到 2 位数,则 salt 也为 2 位。

Hash 散列

因为 check_id 本身是不定长的字符数字串,为使数据散列化,便利 RowKey 萌芽和比较,我们对 check_id 采取 SHA1 散列化,并使之 32 位定长化。

独一性

以上 salt+hash 作为 RowKey 前缀,加上 check 表的主键 id 来保障 RowKey 独一性。综上,check 表的 RowKey 设计如下:(check_id=A208849559)

为加强可读性,中心还可以加上自定义的瓜分符,如’+’,’|’等。

以上设计能包管对每次萌芽而言,其 salt+hash 前缀值是肯定的,并且落在同一个 region 中。须要解释的是 HBase 中 check 表的各列同数据源 Oracle 中 check 表的各列存储。

WEB 萌芽设计

RowKey 设计与萌芽互相干注,萌芽方法决定 RowKey 设计,反之基于以上 RowKey 设计,萌芽时经由过程设置 Scan 的 [startRow,stopRow], 即可完成扫描。以萌芽 check_id=A208849559 为例,根据 RowKey 的设计原则,对其进行 salt+hash 计算,得前缀。

代码实现关键流程

Spark write to HBase

Step0: prepare work

因为是大年夜上游体系承接的营业数据,存量数据采取 sqoop 抽到 hdfs;增量数据每日以文件的情势大年夜 ftp 站点获取。因为营业数据字段中包含一些换行符,且 sqoop1.4.6 今朝只支撑单字节,所以本文选择’0x01’作为列分隔符,’0x10’作为行分隔符。

Step1: Spark read hdfs text file

SparkContext.textfile() 默认行分隔符为”n”,此处我们用“0x10”,须要在 Configuration 中设备。应用设备,我们调用 newAPIHadoopFile 办法来攫取 hdfs 文件,返回 JavaPairRDD ,个中 LongWritable 和 Text 分别为 Hadoop 中的 Long 类型和 String 类型(所有 Hadoop 数据类型和 java 的数据类型都很相像,除了它们是针对收集序列化而做的特别优化)。我们须要的数据文件放在 pairRDD 的 value 中,即 Text 指代。为后续处理便利,可将 JavaPairRDD 转换为 JavaRDD< String >。

Step2: Transfer and sort RDD

1)将 avaRDD< String>转换成 JavaPairRDD,个中参数依次表示为,RowKey,col,value。做如许转换是因为 HBase 的基来源基本理是基于 RowKey 排序的,并且当采取 bulk load 方法将数据写入多个预分区(region)时,请求 Spark 各 partition 的数据是有序的,RowKey,column family(cf),col name 均须要有序。在本案例中因为只有一个列簇,所以将 RowKey 和 col name 组织出来为 Tuple2 格局的 key。请留意本来数据库中的一行记录(n 个字段),此时会被拆成 n 行。

2)基于 JavaPairRDD进行 RowKey,col 的二次排序。如不雅不做排序,会报以下异常:


3)将数据组织成 HFile 请求的 JavaPairRDD hfileRDD。

1)重要调用 saveAsNewAPIHadoopFile 办法:

2)hfilebulk load to HBase

注:如不雅集群开启了 kerberos,step4 须要放置在 ugi.doAs()办法中,在进行如下验证后实现


  推荐阅读

  Ryzen 5大战八代酷睿i5 你最关心的我都测了

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?岁终已至,更多的商家都捋臂将拳竞相推出更多的促销,力争在硬件市场获得年关的收官之战中取得好成就。并且《绝地求生:大>>>详细阅读


本文标题:大数据查询——HBase 读写设计与实践

地址:http://www.17bianji.com/lsqh/39994.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)