在尝试了一些监视结构化流媒体性能,输入/输出指标的方法之后,我看到一种可靠的方法是附加streamingQueryListener来输出streamingQueryProgress以获取输入/输出数字。
除了SparkUI,
有没有更好的方法来监控结构化流媒体性能?
将queryProgress输出到文件或Kafka的最佳方法是什么?
比较火花流和火花结构流之间的性能(速度,输入,输出记录)的有效方法是什么?
答案 0 :(得分:1)
其中一种方法是使用ELK堆栈。
Spark应用程序可以将jmx接收到Logstash,Logstash能够聚合数据,并将数据发送到ElasticSearch进行索引。
Kibana能够使用可视化功能显示ElasticSearch的数据。
1)你需要在build.sbt中包含spark-sql-kafka依赖项, (此刻,我使用Spark 2.2.0与spark-sql-kafka 0.10)
// https://mvnrepository.com/artifact/org.apache.spark/spark-sql-kafka-0-10
libraryDependencies += "org.apache.spark" %% "spark-sql-kafka-0-10" % "2.2.0"
或包括 - 执行spark-submit时的包,
spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0
2)为了让spark应用程序输出jmx,所有与jmx相关的行都需要在文件metrics.properties中取消注释,
并且,在spark-submit期间,指向文件目录,如下所示
--files=metrics.properties --conf spark.metrics.conf=metrics.properties
3)安装ElasticSearch,Logstash,Kibana。
如果您在Window中,启动ELK堆栈的方式如下,
C:\elasticsearch> .\bin\elasticsearch.bat
C:\logstash> bin\logstash.bat -f .\jmx.conf
C:\kibana> .\bin\kibana.bat
在jmx.conf中,需要配置jmx路径和轮询频率。
input {
jmx {
path => "C:/logstash/config/jmx/"
polling_frequency => 15
type => "jmx"
nb_thread => 2
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
}
在jmx路径的文件夹中,需要创建一个json文件来列出您希望Logstash检索的object_names和属性。 (Logstash将根据polling_frequency读取此json文件,因此当Spark应用程序运行时,此json文件中的任何更新都会更新,Logstash将会启动,这意味着无需重新启动Logstash)
您可以在提交Spark应用程序
后列出jconsole中的可用object_names和属性示例文件如下,
{
"host" : "localhost",
"port" : 9000,
"alias" : "spark.jmx.sample1",
"queries" : [
{
"object_name" : "kafka.consumer:type=consumer-metrics,client-id=*",
"attributes" : ["incoming-byte-rate","outgoing-byte-rate"],
"object_alias" : "byteRate"
},
{
"object_name" : "metrics:name=local-1528139073457.driver.spark.streaming.e6c4b9da-a7d1-479f-b28f-ba2b9b1397d0.inputRate-total",
"attrivutes" : ["Value"],
"object_alias" : "somethingTeste1"
}
]}
4)最后,您将通过http://localhost:5601
访问Kibana然后,首先设置索引模式。 (您应该看到数据索引的日期)
然后,转到可视化页面,使用您从jmx json文件列出的object_names和属性创建指标。