我对蜂巢/混蛋还比较陌生
我正在阅读此Hive Storage Handlers。
现在,我正在尝试编写HiveStorageHandler的自定义实现,以便使用Hive表查询并将消息推送到Kafka。
我看到HiveStorageHandler的其他实现使我们可以使用hive表在NoSQL数据库上查询和编写。
我正在尝试为卡夫卡复制该内容。我在上面找到了一个项目
HiveKa - query Kafka using Hive
在这里,他们正尝试使用配置单元表上的查询从Kafka读取数据。我希望在桌子上使用插入来写关于kafka的话题。
有人可以指导我吗?
答案 0 :(得分:1)
我希望使用表格上的插入内容来写关于kafka的话题。
使用Kafka HiveStorageHandler可以做到这一点。以下是此功能可能的一般使用情况
您正在尝试做第三个用例。
首先为源和目标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`
);
注意:
使用了外部非本地表
除了用户定义的有效载荷架构外,Kafka存储处理程序还会附加4列(__key,__ partition,__ offset,__ timestmap),用户可以使用这些列来查询Kafka元数据字段
如果数据不是csv格式,则用户必须设置“ kafka.serde.class”表属性
用户还可以设置“ 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生成事件可能是一个更好的选择