sqoop导入hbase

sqoop导入hbase

标签(空格分隔): sqoop


导入命令

sqoop import \
--connect jdbc:mysql://192.168.5.135:3306/toolbox --username root --P \
--query "select CONCAT(id,'_',IFNULL(xhdwsbh,''),'_',IFNULL(kprq,''), '') row_key,tit.* from t_invoice_ticket tit where \$CONDITIONS " \
--split-by tit.id -m 5 \
--hbase-table t_invoice_ticket_kaifa \
--column-family i \
--hbase-row-key row_key

regin自动分割问题

使用默认参数创建表时,hbase的表默认只有一个region,并且hbase采用自动分区的方式对数据进行分区,在分区过程中,region对下线。此时sqoop继续插入数据就会报错。关于hbase分区可以参考Hbase split的三种方式和split的过程
因此使用sqoop导入数据前最好先进行预分区,预分区的分配计算方式可以参考HBase Rowkey的散列与预分区设计
如果rowkey只包含HEX,可以使用hbase自带的HexStringSplit功能进行预分区。但在实际使用过程中,数据表的主键使用了UUID,导入数据后发现并没有均匀分布在所有分区上,而是只有某几个分区有数据,原因暂时不清楚。
因为原始数据预估是由3-4G,所以采用了提前创建了10个region,使region的split大小成为10G,这样在sqoop导入时不会出现split region,就可以一次导入成功。
建表语句如下,采用了SNAPPY压缩,10个分区,Hex分区工具

create 'sqoop_test', { NAME => 'i', COMPRESSION => 'SNAPPY' }, {NUMREGIONS => 10, SPLITALGO => 'HexStringSplit'}

FULL GC问题

sqoop导入过程中,出现异常信息RetriesExhaustedWithDetailsException: Failed 438 actions: FailedServerException: 438 times
检查后发现hmaster挂掉,日志中提示警告We slept 85585ms instead of 3000ms, this is likely due to a long garbage collecting pause and it’s usually bad, see http://hbase.apache.org/book.html#trouble.rs.runtime.zkexpired
原因是hbase长时间full gc导致zookeeper认为hbase断线,关闭了hbase的连接。可以通过修改hbase的heap size加快full gc的速度,或者修改zookeeper超时时间
修改hbase的heap size

如果正常运行过程中,hbase频繁出现full gc,导致RegionServer异常退出,可以Centos6.6下RegionServer因长时间GC退出参考解决

RegionServer频繁宕机,日志出现大量Slow sync

解决HBase Replication在数据大量写入时导致RegionServer崩溃问题
增加hbase的内存,也可以缓解这种问题

最终参考这篇文章修改配置后解决HBase随机宕机事件处理 & JVM GC回顾

正常环境中超时时间设置为120s,导入数据时设置为300s

hbase调优参考资料

Hbase万亿级存储性能优化总结
HBASE性能优化之最佳内存实践
hadoop 集群调优实践总结
Java GC 及HBase RegionServer GC调优

猜你喜欢

转载自blog.csdn.net/zh350229319/article/details/80168630