繁体   English   中英

使用Apache Spark为Kafka产生Avro主题

[英]Produce Avro topic to Kafka using Apache Spark

我已经在本地安装了kafka(目前还没有群集/模式注册表),并试图生成一个Avro主题,下面是与该主题相关的架构。

{
  "type" : "record",
  "name" : "Customer",
  "namespace" : "com.example.Customer",
  "doc" : "Class: Customer",
  "fields" : [ {
    "name" : "name",
    "type" : "string",
    "doc" : "Variable: Customer Name"
  }, {
    "name" : "salary",
    "type" : "double",
    "doc" : "Variable: Customer Salary"
  } ]
}

我想创建一个简单的SparkProducerApi以基于上述架构创建一些数据并将其发布到kafka。 考虑创建示例数据,将其转换为dataframe avro ,然后将其更改为avro ,然后发布。

val df = spark.createDataFrame(<<data>>)

然后,如下所示:

df.write
  .format("kafka")
  .option("kafka.bootstrap.servers","localhost:9092")
  .option("topic","customer_avro_topic")
  .save()
}

现在可以manually将模式附加到该Avro主题。

可以仅通过使用Apache Spark APIs而不是使用Java/Kafka Apis来完成此操作吗? 这是用于批处理而不是streaming处理。

我认为这不可能直接实现,因为Spark中的Kafka生产者期望两列键和值,这两列都必须是字节数组。

如果从磁盘读取现有的Avro文件,则您可能已经使用Avro数据帧读取器创建了两列,分别用于名称和薪水。 因此,您将需要一个操作从包含整个Avro记录的其他操作构造一个value列,然后删除其他列,然后必须使用Bijection之类的库将其序列化为字节数组,例如,因为您没有使用架构注册表。

如果要生成数据但没有文件,则需要为Kafka消息键和字节数组值构建Tuple2对象列表,然后可以将它们parallelize化为RDD,然后将其转换放入数据框。 但是到那时,仅使用常规的Kafka Producer API更加简单。

另外,如果您已经知道自己的架构,请尝试方法中提到的项目以在Kafka中生成测试数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM