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作业读取数据帧中已排序的AVRO文件,但不按顺序写入kafka_Apache Spark_Apache Kafka_Avro - Fatal编程技术网

Apache spark Spark作业读取数据帧中已排序的AVRO文件,但不按顺序写入kafka

Apache spark Spark作业读取数据帧中已排序的AVRO文件,但不按顺序写入kafka,apache-spark,apache-kafka,avro,Apache Spark,Apache Kafka,Avro,我用ID对AVRO文件进行排序,每个ID都有一个名为“ID=234”的文件夹,文件夹中的数据是AVRO格式的,并根据日期进行排序。 我正在运行spark作业,它获取输入路径并读取数据帧中的avro。然后,该数据帧用5个分区写入kafka主题 val properties: Properties = getProperties(args) val spark = SparkSession.builder().master(properties.getProperty("master"))

我用ID对AVRO文件进行排序,每个ID都有一个名为“ID=234”的文件夹,文件夹中的数据是AVRO格式的,并根据日期进行排序。 我正在运行spark作业,它获取输入路径并读取数据帧中的avro。然后,该数据帧用5个分区写入kafka主题

val properties: Properties = getProperties(args)


val spark = SparkSession.builder().master(properties.getProperty("master"))
  .appName(properties.getProperty("appName")).getOrCreate()
val sqlContext = spark.sqlContext

val sourcePath = properties.getProperty("sourcePath")

val dataDF = sqlContext.read.avro(sourcePath).as("data")
val count = dataDF.count();
val schemaRegAdd = properties.getProperty("schemaRegistry")

val schemaRegistryConfs = Map(
  SchemaManager.PARAM_SCHEMA_REGISTRY_URL          -> schemaRegAdd,
  SchemaManager.PARAM_VALUE_SCHEMA_NAMING_STRATEGY -> SchemaManager.SchemaStorageNamingStrategies.TOPIC_NAME
)
val start = Instant.now

dataDF.select(functions.struct(properties.getProperty("message.key.name")).alias("key"), functions.struct("*").alias("value"))
  .toConfluentAvroWithPlainKey(properties.getProperty("topic"), properties.getProperty("schemaName"),
  properties.getProperty("schemaNamespace"))(schemaRegistryConfs)
  .write.format("kafka")
  .option("kafka.bootstrap.servers",properties.getProperty("kafka.brokers"))
  .option("topic",properties.getProperty("topic")).save()
}


我的用例是按顺序写入来自每个ID(按日期排序)的所有消息,例如来自一个ID 1的所有排序数据应首先添加,然后添加来自ID 2的所有排序数据,依此类推。Kafka消息的密钥为ID。

不要忘记,在进行转换时,RDD/数据集中的数据是无序的,因此会丢失顺序


实现这一点的最佳方法是逐个读取文件并将其发送到kafka,而不是读取
val sourcePath=properties.getProperty(“sourcePath”)

中的完整目录,谢谢您的建议。即使我迭代分区目录,spark job也会将文件拆分为多个分区,并并行处理数据。因此,最终的结果是混合数据。