HBASE-Spark操作hbase数据-思考

本篇文章主要记录一下Spark如何读写Hbase数据问题

1、Spark如何读取Hbase数据

   spark原生API读取Hbase数据时,是使用一个partition加载一个Region的数据的。

  此方式可能产生问题:

1)单个region太大,而spark每个partition资源是配置分配的,一般不是很大,由此会导致单个partition在做聚合操作时内存溢出;

2)每个partition数据条数不一致,数据发生倾斜

3)数据倾斜时,部分region数据量很大时,spark任务时间久,部分partition加载数据失败,导致整体任务失败

解决办法:

1)自定义实现hbase数据加载方法,通过region大小进行切分获取多个splitkey,分多个partition加载数据

问题:此方式获取的splitkey不一定可以均匀分割region,仍会有数据倾斜问题

2)定义实现hbase数据加载方法,先通过spark api加载hbase 的rowkey(仅rowkey)

然后按照固定条数10万条划分记录startkey,stopkey形成一个list

通过spark的parallel加载list,通过list去读取hbase数据,这样每个partition数据条数完全一致;

问题:需要先扫描一次数据,性能较差

 

2、如何通过挂载HFile的方式生成导入hbase数据?

导入Hbase数据的方式有以下几种:

1)全量历史导入:方法:在Hbase一定版本范围内,hbase数据存储文件HFile是兼容的,通过拷贝Hbase在HDfs上的数据文件到新的Hbase集群中,然后运行修复meta相关命令就可以完成迁移;

2)实时大批量数据导入:

   可以通过Hbase API批量或逐条导入;缺点: 1)可能导入失败   2)导入性能慢  3)影响Hbase服务使用(读写)

实时大批量导入的解决方法:

通过spark加载数据,生成HFile文件,然后通过bulk load方式挂载到Hbase上,实现; 优点:1)速度快,2)几乎不会失败  3)对hbase服务几乎无影响;

 

难点:

1)hfile文件的生成问题

2)单个Hfile文件内容要是一个region中的数据,否则挂载到hbase中,hbase会一直分裂,导致迁移速度变低,同时影响Hbase服务

解决2)的方法,通过spark的shuffle操作把同一个region的数据放在一个partition中,引申另一个问题,如果spark加载的一批数据过大,

很多都是在一个region中,做完shuffle后会导致单个partition过大,导致内存溢出,所以需要一个region的数据通过多个partition(shuffle到多个partitiion)

 

posted @ 2021-05-11 16:26  life_start  阅读(604)  评论(0编辑  收藏  举报