如何有效地将数据从Kafka移动到Impala表?

Ale*_*ord 13 hadoop flume apache-kafka impala

以下是当前流程的步骤:

  1. Flafka将日志写入HDFS上的"着陆区".
  2. 由Oozie安排的工作将完整文件从着陆区复制到临时区域.
  3. 临时数据由Hive表"架构化",该表使用暂存区域作为其位置.
  4. 来自登台表的记录被添加到永久Hive表(例如insert into permanent_table select * from staging_table).
  5. 来自Hive表的数据在Impala中通过refresh permanent_table在Impala中执行而可用.

现有数据流

我看看我构建的过程并且"闻起来"很糟糕:有太多的中间步骤会影响数据流.

大约20个月前,我看到了一个演示,其中数据从Amazon Kinesis管道流式传输,并且可以近乎实时地被Impala查询.我不认为他们做了一件非常丑陋/错综复杂的事情.有没有更有效的方法将数据从Kafka传输到Impala(可能是可以序列化为Parquet的Kafka消费者)?

我认为"将数据流式传输到低延迟SQL"必定是一个相当常见的用例,所以我很想知道其他人是如何解决这个问题的.

Iñi*_*lez 2

如果您需要将 Kafka 数据按原样转储到 HDFS,最好的选择是使用 Kafka Connect 和 Confluence HDFS 连接器。

您可以将数据转储到 HDFS 上的 Parket 文件,然后在 Impala 中加载。我认为您需要使用 TimeBasedPartitioner 分区程序每 X 毫秒创建一个镶木地板文件(调整partition.duration.ms 配置参数)。

将这样的内容添加到您的 Kafka Connect 配置中可能会成功:

# Don't flush less than 1000 messages to HDFS
flush.size = 1000 

# Dump to parquet files   

format.class=io.confluent.connect.hdfs.parquet.ParquetFormat

partitioner.class = TimebasedPartitioner

# One file every hour. If you change this, remember to change the filename format to reflect this change
partition.duration.ms = 3600000
# Filename format
path.format='year'=YYYY/'month'=MM/'day'=dd/'hour'=HH/'minute'=mm
Run Code Online (Sandbox Code Playgroud)