使用Apache Spark为Kafka产生Avro主题

时间:2019-04-21 02:16:17

标签: scala apache-spark apache-kafka apache-spark-sql spark-avro

我已经在本地安装了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,然后发布。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

此外,如果您已经知道自己的架构,请尝试Ways to generate test data in Kafka

中提到的项目。