【问题标题】:how to efficiently move data from Kafka to an Impala table?如何有效地将数据从 Kafka 移动到 Impala 表?
【发布时间】:2016-05-02 11:27:19
【问题描述】:
以下是当前流程的步骤:
-
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”一定是一个相当常见的用例,所以我很想知道其他人是如何解决这个问题的。
【问题讨论】:
-
Here 是一种替代架构,它似乎具有更少的跃点并且可能相对更快
-
标签:
hadoop
apache-kafka
flume
impala
【解决方案1】:
如果您需要将 Kafka 数据按原样转储到 HDFS,最好的选择是使用 Kafka Connect 和 Confluent 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