以下是当前流程的步骤:
- Flafka将日志写入 HDFS 上的“着陆区”。
- 由 Oozie 安排的作业将完整文件从着陆区复制到暂存区。
- 暂存数据由使用暂存区域作为其位置的 Hive 表“模式化”。
- 将暂存表中的记录添加到永久 Hive 表中(例如,
insert into permanent_table select * from staging_table
)。 - 通过在 Impala 中执行
refresh permanent_table
,可以在 Impala 中使用来自 Hive 表的数据。
我查看了我构建的流程,它“闻起来”很糟糕:有太多的中间步骤会影响数据流。
大约 20 个月前,我看到了一个演示,其中数据从 Amazon Kinesis 管道流式传输并且可以由 Impala 近乎实时地查询。我不认为他们做了如此丑陋/令人费解的事情。有没有更有效的方法将数据从 Kafka 流式传输到 Impala(可能是可以序列化到 Parquet 的 Kafka 消费者)?
我想“将数据流式传输到低延迟 SQL”一定是一个相当常见的用例,所以我很想知道其他人是如何解决这个问题的。
最佳答案
如果您需要将 Kafka 数据按原样转储到 HDFS,最好的选择是使用 Kafka Connect 和 Confluent HDFS 连接器。
您可以将数据转储到可以在 Impala 中加载的 HDFS 上的 parket 文件。 你需要我认为你会想要使用 TimeBasedPartitioner 分区程序每 X 毫秒生成 Parquet 文件(调整 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
关于hadoop - 如何有效地将数据从 Kafka 移动到 Impala 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004712/