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
如何在Kafka源上的流式查询中处理CSV格式的值?_Csv_Apache Spark_Apache Kafka_Spark Structured Streaming - Fatal编程技术网

如何在Kafka源上的流式查询中处理CSV格式的值?

如何在Kafka源上的流式查询中处理CSV格式的值?,csv,apache-spark,apache-kafka,spark-structured-streaming,Csv,Apache Spark,Apache Kafka,Spark Structured Streaming,我是结构化流媒体的新手,我想知道是否有一种方法可以指定Kafka值的schema,就像我们在普通结构化流媒体作业中所做的那样。Kafka值的格式是50多个字段的syslog,类似于csv,手动拆分速度非常慢 下面是我的代码的简短部分() 在没有进一步操作的情况下,我只能在24核128GB mem服务器上实现大约10MB/s的吞吐量。如果我在之前的版本中将系统日志转换为JSON,会有帮助吗?在这种情况下,我可以将from_json与schema一起使用,也许会更快 有没有一种方法可以像我们在普通结

我是结构化流媒体的新手,我想知道是否有一种方法可以指定Kafka值的
schema
,就像我们在普通结构化流媒体作业中所做的那样。Kafka值的格式是50多个字段的syslog,类似于csv,手动拆分速度非常慢

下面是我的代码的简短部分()

在没有进一步操作的情况下,我只能在24核128GB mem服务器上实现大约10MB/s的吞吐量。如果我在之前的版本中将系统日志转换为JSON,会有帮助吗?在这种情况下,我可以将
from_json
schema
一起使用,也许会更快

有没有一种方法可以像我们在普通结构化流媒体作业中所做的那样指定Kafka值的模式

不可以。卡夫卡外部数据源的所谓输出模式是固定的,不能更改。看

如果我在之前的版本中将系统日志转换为JSON,会有帮助吗?在这种情况下,我可以将from_json与schema结合使用,也许会更快

我不这么认为。我甚至可以说CSV是一种比JSON更简单的文本格式(通常只有一个分隔符)


使用
split
standard函数是一种方法,您认为很难获得更好的性能,因为它需要拆分一行并获取每个元素来构建最终输出。

即使使用JSON,您也需要解析字符串并从中提取字段。Spark将有更多的数据需要处理,这可能会使其比CSV或您现在拥有的任何数据都慢。我的建议是考虑可能使用Avro(Avro模式注册表+Syslog Kafka Connect源代码)或其他紧凑的二进制格式,如msgpack或Protobuf。并尝试通过Spark读取。卡夫卡本身没有schema@cricket_007谢谢你的快速回复。现在,我希望它保持简单,使用基于文本的格式,而不是引入像Avro这样的二进制格式,这增加了额外的复杂性。在结构化流媒体的设计中,表格数据应该至少有一种performant格式,否则就没有必要让它与DataFrame API一起工作。Avro或Protobuf的问题是,模式和类型内置在协议中。您可以使用嵌套字段而不是扁平的“列”。我不相信你可以流拼花地板或兽人列格式通过Kafka@cricket_007在我的rsyslog+omkafka设置中,似乎没有使用Avro进行传输的简单方法。此外,所有这些计算都在一台服务器上运行,因此转换为Avro然后再转换回Avro看起来效率不高。我相信有一些解决方案,如Logstash/Filebeat或Fluentd,可以输出为不同的格式,例如将Avro转换为Kafka。否则,瓶颈在哪里还不是很清楚。例如,您只处理一个分区吗?考虑到我在24物理核心+128GB服务器上运行简单代码,您认为10MB/s看起来正常吗?我还被建议在转换成卡夫卡之前将原始数据打包成一组二进制包,这会有帮助吗?还有哪里可以找到瓶颈?我注意到控制台接收器可能与我的性能问题有关,文档写道,“这应该用于低数据量上的调试……”。我通过过滤限制了输出数据帧的大小,并改为ElasticSearch sink,现在该作业可以处理至少60MB的吞吐量,CPU和内存消耗适中。
spark.readStream.format("kafka")
  .option("kafka.bootstrap.servers", "myserver:9092")
  .option("subscribe", "mytopic")
  .load()
  .select(split('value, """\^""") as "raw")
  .select(ColumnExplode('raw, schema.size): _*) // flatten WrappedArray
  .toDF(schema.fieldNames: _*)                  // apply column names
  .select(fieldsWithTypeFix: _*)                // cast column types from string
  .select(schema.fieldNames.map(col): _*)       // re-order columns, as defined in schema
  .writeStream.format("console").start()