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

时间:2016-01-25 23:54:24

标签: hadoop apache-kafka flume impala

以下是当前流程的步骤:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

您可以将数据转储到可以在Impala中加载的HDFS上的parket文件。 您需要我认为您希望每隔X毫秒使用一个TimeBasedPartitioner分区器来制作镶木地板文件(调整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