我们有一个基于Hadoop的解决方案(CDH 5.15),在某些目录下我们会得到新的HDFS文件。在这些目录的顶部,我们有4-5个Impala表(2.1)。将文件写入HDFS的过程是Spark Structured Streaming (2.3.1)。
现在,我们在文件写入HDFS时运行一些DDL查询:
- `ALTER TABLE table1 RECOVER PARTITONS` 以检测添加到表中的新分区(及其HDFS目录和文件)。 - `REFRESH table1 PARTITIONS (partition1=X, partition2=Y)`,使用每个分区的所有键。
目前,这些DDL查询花费的时间有点长,它们在系统中排队等候,影响了系统数据的可用性。
所以,我的问题是:有没有一种更有效地将数据纳入到系统中的方法? 我们已考虑过以下方法:
- 使用`ALTER TABLE..RECOVER PARTITONS`,但是根据文档,它只刷新新分区。 - 尝试使用`REFRESH ..PARTITION...`一次性刷新多个分区,但语法不支持这样做。 - 尝试分批处理查询,但Hive JDBC驱动程序不支持批量查询。
您知道其他的方法吗?
现在,我们在文件写入HDFS时运行一些DDL查询:
- `ALTER TABLE table1 RECOVER PARTITONS` 以检测添加到表中的新分区(及其HDFS目录和文件)。 - `REFRESH table1 PARTITIONS (partition1=X, partition2=Y)`,使用每个分区的所有键。
目前,这些DDL查询花费的时间有点长,它们在系统中排队等候,影响了系统数据的可用性。
所以,我的问题是:有没有一种更有效地将数据纳入到系统中的方法? 我们已考虑过以下方法:
- 使用`ALTER TABLE..RECOVER PARTITONS`,但是根据文档,它只刷新新分区。 - 尝试使用`REFRESH ..PARTITION...`一次性刷新多个分区,但语法不支持这样做。 - 尝试分批处理查询,但Hive JDBC驱动程序不支持批量查询。
考虑到系统已经很忙,我们可以尝试并行进行这些更新吗?
谢谢!
Victor
注:我们知道哪些分区需要刷新的方式是通过使用HDFS事件,因为在Spark Structured Streaming中,我们不知道文件何时被写入。
注2:同时,HDFS中写入的文件有时很小,如果能够合并这些文件,那就太好了。