Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 将Spark结构化流与融合模式注册表集成_Apache Spark_Apache Kafka_Avro_Confluent Schema Registry_Spark Structured Streaming - Fatal编程技术网

Apache spark 将Spark结构化流与融合模式注册表集成

Apache spark 将Spark结构化流与融合模式注册表集成,apache-spark,apache-kafka,avro,confluent-schema-registry,spark-structured-streaming,Apache Spark,Apache Kafka,Avro,Confluent Schema Registry,Spark Structured Streaming,我在Spark结构化流媒体中使用Kafka源来接收合流编码的Avro记录。我打算使用Confluent Schema Registry,但与spark结构化流媒体的集成似乎是不可能的 我已经看到了这个问题,但无法让它与汇合模式注册表一起工作 我花了几个月的时间阅读源代码并进行测试。简而言之,Spark只能处理字符串和二进制序列化。您必须手动反序列化数据。在spark中,创建汇合rest服务对象以获取模式。使用Avro解析器将响应对象中的模式字符串转换为Avro模式。接下来,正常阅读卡夫卡主题。然

我在Spark结构化流媒体中使用Kafka源来接收合流编码的Avro记录。我打算使用Confluent Schema Registry,但与spark结构化流媒体的集成似乎是不可能的


我已经看到了这个问题,但无法让它与汇合模式注册表一起工作

我花了几个月的时间阅读源代码并进行测试。简而言之,Spark只能处理字符串和二进制序列化。您必须手动反序列化数据。在spark中,创建汇合rest服务对象以获取模式。使用Avro解析器将响应对象中的模式字符串转换为Avro模式。接下来,正常阅读卡夫卡主题。然后使用合流的KafkaAvroDeSerializer映射二进制类型的“value”列。我强烈建议进入这些类的源代码,因为这里有很多内容,所以为了简洁起见,我将省略许多细节

//使用Confluent版本3.2.2编写此代码。
导入io.confluent.kafka.schemaregistry.client.rest.RestService
导入io.confluent.kafka.Serializer.KafkaAvroDeserializer
导入org.apache.avro.Schema
case类从KafkarRecord反序列化(键:String,值:String)
val schemaRegistryURL=”http://127.0.0.1:8081"
val topicName=“Schema-Registry-Example-topic1”
val subjectValueName=topicName+“-value”
//创建RestService对象
val restService=新的restService(schemaRegistryURL)
//.getLatestVersion返回io.confluent.kafka.schemaregistry.client.rest.entities.Schema对象。
ValueResponseSchema=restService.getLatestVersion(subjectValueName)
//使用Avro解析类获取Avro模式
val parser=newschema.parser
val-topicValueAvroSchema:Schema=parser.parse(valueResponseSchema.getSchema)
//键模式通常只是字符串,但可以对键和值执行相同的过程
val keySchemaString=“\”字符串“”
val keySchema=parser.parse(keySchemaString)
//使用架构注册表url创建映射。
//这是Confluent的KafkaAvroDeserializer唯一需要的配置。
val props=Map(“schema.registry.url”->schemaRegistryURL)
//在使用Spark结构化流式映射之前声明SerDe VAR。避免不可序列化的类异常。
var-keyDeserializer:KafkaAvroDeserializer=null
var valueDeserializer:KafkaAvroDeserializer=null
//创建结构化流式DF以从主题中读取。
val rawTopicMessageDF=sql.readStream
.格式(“卡夫卡”)
.option(“kafka.bootstrap.servers”,“127.0.0.1:9092”)
.选项(“订阅”,主题名称)
.选项(“起始偏移量”、“最早”)
.option(“maxOffsetsPerTrigger”,20)//为产品移除
.load()
//实例化SerDe类(如果还没有),然后反序列化!
val deserializedTopicMessageDS=rawTopicMessageDF.map{
行=>
if(键反序列化器==null){
keyDeserializer=新的KafkaAvroDeserializer
keyDeserializer.configure(props.asJava,true)//isKey=true
}
如果(valueDeserializer==null){
valueDeserializer=新的Kafkavrodeserializer
valueDeserializer.configure(props.asJava,false)//isKey=false
}
//传递Avro模式。
val deserializedKeyString=keyDeserializer.deserialize(topicName,row.key,keySchema)。toString//topic name在源代码中实际上未使用,只是签名需要。对吗?
val deserializedValueString=valueDeserializer.deserialize(topicName,row.value,topicValueAvroSchema).toString
从Kafka记录反序列化的数据(反序列化的KeyString,反序列化的ValueString)
}
val deserializedDSOutputStream=deserializedTopicMessageDS.writeStream
.outputMode(“追加”)
.格式(“控制台”)
.选项(“截断”,false)
.start()

我花了几个月的时间阅读源代码并进行测试。简而言之,Spark只能处理字符串和二进制序列化。您必须手动反序列化数据。在spark中,创建汇合rest服务对象以获取模式。使用Avro解析器将响应对象中的模式字符串转换为Avro模式。接下来,正常阅读卡夫卡主题。然后使用合流的KafkaAvroDeSerializer映射二进制类型的“value”列。我强烈建议进入这些类的源代码,因为这里有很多内容,所以为了简洁起见,我将省略许多细节

//使用Confluent版本3.2.2编写此代码。
导入io.confluent.kafka.schemaregistry.client.rest.RestService
导入io.confluent.kafka.Serializer.KafkaAvroDeserializer
导入org.apache.avro.Schema
case类从KafkarRecord反序列化(键:String,值:String)
val schemaRegistryURL=”http://127.0.0.1:8081"
val topicName=“Schema-Registry-Example-topic1”
val subjectValueName=topicName+“-value”
//创建RestService对象
val restService=新的restService(schemaRegistryURL)
//.getLatestVersion返回io.confluent.kafka.schemaregistry.client.rest.entities.Schema对象。
ValueResponseSchema=restService.getLatestVersion(subjectValueName)
//使用Avro解析类获取Avro模式
val parser=newschema.parser
val-topicValueAvroSchema:Schema=parser.parse(valueResponseSchema.getSchema)
//键模式通常只是字符串,但可以对键和值执行相同的过程
val keySchemaString=“\”字符串“”
val keySchema=parser.parse(keySchemaString)
//使用架构注册表url创建映射。
//这是Confluent的KafkaAvroDeserializer唯一需要的配置。
val props=Map(“schema.registry.url”->schemaRegistryURL)
//在使用Spark结构化流式映射之前声明SerDe VAR。避免不可序列化的类异常。
var-keyDeserializer:KafkaAvroDeserializer=null
var valueDeserializer:KafkaAvroDeserializer=null
//创建结构化流式DF以从主题中读取。
val rawTopicMessageDF=sql.readStream
.格式(“卡夫卡”)
.option(“kafka.bootstrap.servers”,“127.0.0.1:9092”)
.选择权
dataDF
  .select(
    to_avro($"key", lit("t-key"), schemaRegistryAddr).as("key"),
    to_avro($"value", lit("t-value"), schemaRegistryAddr).as("value"))
  .writeStream
  .format("kafka")
  .option("kafka.bootstrap.servers", servers)
  .option("topic", "t")
  .save()
<!-- READ AND WRITE AVRO DATA -->
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-avro_${scala.compat.version}</artifactId>
  <version>${spark.version}</version>
</dependency>
<!-- INTEGRATION WITH SCHEMA REGISTRY -->
<dependency>
  <groupId>io.confluent</groupId>
  <artifactId>kafka-schema-registry</artifactId>
  <version>${confluent.version}</version>
</dependency>