栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

通过java将数据并行load到hive分区表/hive load慢优化

通过java将数据并行load到hive分区表/hive load慢优化

需求

将数据通过java解析处理后,写入hdfs,同时入到带有分区的hive表中,数据有时延要求,需要及时快速的实现这个过程。

实现思路

1.多线程并行处理数据,以提高效率

2.每个线程中,将处理好的数据以orc文件的形式输出到hdfs某路径,eg /usr/tmp。之所以选用orc文件,是因为压缩文件占用空间小,至于压缩方式,大家可以自行搜索hive压缩方式。

3.每个线程中,将输出到hdfs的orc文件,通过hive jdbc 的方式load到hive分区表中,命令

LOAD DATA INPATH '/usr/tmp' INTO TABLE psn;

LOAD DATA LOCAL INPATH '/usr/tmp' INTO TABLE psn;

带local的命令表示从本地load,不带local的表示从hdfs load

按照以上方式初步实现,发现输出的是大量的小文件,load的速度慢,效率低,赶不上数据输出的速度

后来发现,load会把数据从原来的路径,剪切到hive表,分区所在路径下

并参考:hive大量数据导入分区表时过慢优化_kamisamak的博客-CSDN博客

这篇文章提到的方法,直接将数据按格式写入到hdfs下的hive文件夹中,再进行修复

修复命令:

msck repair table tablename;

按照,直接写入路径,再对数据进行修复这个思路修改之后,发现在多线程中通过jdbc频繁进行数据修复操作,也需要频繁建立与hive的连接,也比较慢,不能接受。

后来查了一下修复命令,恍然大悟

修复命令用来将分区的信息同步到元数据库,只要分区信息同步过一次,写到对应分区路径下的文件,hive是可以实时读到的! 所以只需要产生新的分区时,用定时脚本执行一下msck repair table 这个命令同步一下分区信息就行了。

同理,如果没有分区的表,只需要将数据直接输出到hdfs上的hive表的路径下,就可以从hive中实时查询数据。

综上,整个数据入hive的过程的效率只取决于多线程并发的将数据输出到hdfs的效率,这样应该能够满足实时性要求。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/752212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号