使用HiveStorageHandler的Kafka生产者

时间:2018-11-25 08:13:07

标签: hadoop hive apache-kafka kafka-producer-api

我对蜂巢/混蛋还比较陌生

我正在阅读此Hive Storage Handlers

现在,我正在尝试编写HiveStorageHandler的自定义实现,以便使用Hive表查询并将消息推送到Kafka。

我看到HiveStorageHandler的其他实现使我们可以使用hive表在NoSQL数据库上查询和编写。

我正在尝试为卡夫卡复制该内容。我在上面找到了一个项目

HiveKa - query Kafka using Hive

在这里,他们正尝试使用配置单元表上的查询从Kafka读取数据。我希望在桌子上使用插入来写关于kafka的话题。

有人可以指导我吗?

2 个答案:

答案 0 :(得分:1)

  

我希望使用表格上的插入内容来写关于kafka的话题。

使用Kafka HiveStorageHandler可以做到这一点。以下是此功能可能的一般使用情况

  1. 查询Kafka主题
  2. 从Kafka主题中查询数据并将其插入Hive托管/外部 桌子
  3. 从Kafka主题中查询数据并推入其他Kafka主题
  4. 从配置单元外部/托管表中查询数据并推送至Kafka主题

您正在尝试做第三个用例。

首先为源和目标Kafka主题创建两个外部表。

create external table if not exists source_topic_table
(
<fields>
)
STORED BY 'org.apache.hadoop.hive.kafka.KafkaStorageHandler'
TBLPROPERTIES (
'kafka.topic'='source_topic_name',
'kafka.bootstrap.servers'=''
);


create external table if not exists target_topic_table
(
<fields>
)
STORED BY 'org.apache.hadoop.hive.kafka.KafkaStorageHandler'
TBLPROPERTIES (
'kafka.topic'='target_topic_name',
'kafka.bootstrap.servers'=''
);

然后使用合并查询将数据插入目标Kafka主题

merge into target_topic_table
using (
select
<columns>,
cast(null as binary) as `__key`,
cast(null as int) as `__partition`,
cast(-1 as bigint) as `__offset`,
cast(to_epoch_milli(current_timestamp) as bigint) as `__timestamp`
from source_topic_table
) sub
on
sub.column_name = target_topic_table.coulmn_name <Some condition>
when not matched then insert values
(
<sub.columns>,
sub.`__key`,sub.`__partition`,sub.`__offset`,sub.`__timestamp`
);

注意:

  1. 使用了外部非本地表

  2. 除了用户定义的有效载荷架构外,Kafka存储处理程序还会附加4列(__key,__ partition,__ offset,__ timestmap),用户可以使用这些列来查询Kafka元数据字段

  3. 如果数据不是csv格式,则用户必须设置“ kafka.serde.class”表属性

  4. 用户还可以设置“ kafka.write.semantic”表属性,该属性允许NONE,AT_LEAST_ONCE或EXACTLY_ONCE值。

答案 1 :(得分:0)

如果我的理解正确,那么您想从Hive中读取事件,然后推送到Kafka。我没有存储处理程序的经验,但是我宁愿建议编写适当的代码以生成给Kafka,然后将这些事件提供给Hadoop / Hive。

在Kafka中有一个名为Kafka Connect的框架可以写入外部系统。Confluent编写了这样的HDFS连接器,只要将文件写入HDFS,它就可以通过更新Hive Metastore来提供Hive支持。

无需编写存储处理程序,就可以尝试使用JDBC Source连接器,或者使用Spark / Flink从Hive读取该数据并将其推入Kafka。

但是,通常,Hadoop是CDC事件的目的地,而不是它的生成源。主要是因为它的查询速度很慢...如果您想在插入上创建事件,则通常需要进行一些表扫描,因此从Cassandra / Hbase生成事件可能是一个更好的选择