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

时间:2024-10-05 07:10:10

需求

将数据通过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的博客-****博客

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

修复命令:

msck repair table tablename;

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

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

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

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

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