其中一种方法是使用 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 时包含 --packages,
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 和属性创建指标。