Anahtar noktaları
-Bir performans izleme sistemi tasarlarken, sunucu ve uygulama ölçümlerini toplarken, ölçümleri bir zaman serisi veritabanında depolarken ve veri görselleştirme için gösterge tabloları sağlarken üç hedef vardır.
Birçok endüstri, büyük veri işleme uygulamaları oluşturmak için Apache Spark kullanıyor. Spark, bu tür uygulamalar için örtük veri paralelliği ve hata toleransı sağlar. Bu tür uygulamalar, akışa, toplu işlemeye, SQL veri kümesi işlemeye veya makine öğrenmesine dayalı olabilir. Spark, bu uygulamaları hızlı bir bellek içi veri işleme motoru aracılığıyla bir kümede çalıştırır ve veri ardışık düzenindeki büyük miktarda veriyi dönüştürür ve işler. Bu uygulamaları sürekli ve güvenilir bir şekilde çalıştırmak, iyi bir performans izleme sistemi gerektiren zorlu bir görevdir. Spark, hayatın her kesiminde yaygın olarak benimsendiğinden, performans izleme, ölçüm analizi ve Spark uygulamalarının ayarlanması konuları giderek daha fazla dikkat çekmiştir. Uber kısa süre önce JVM Profiler'ını açık kaynaklı hale getirdi. Bu makalede, Uber JVM Profiler'ın nasıl genişletileceğini ve Spark uygulamalarının performans ölçümlerini izlemek ve raporlamak için InfluxDB ve Grafana ile birlikte nasıl kullanılacağını tartışacağız.
Spark uygulama performans izleme sistemi
Mevcut kaynakların kullanımını en üst düzeye çıkarmak ve olası sorunları olabildiğince erken tespit etmek için bir performans izleme sistemine ihtiyaç vardır. İzleme sisteminin, çalışan sistem için kapsamlı bir durum raporu sağlaması ve bir bileşen arızalandığında bir alarm göndermesi gerekir. Bir Spark kümesinde büyük ölçekli dağıtılmış sistemleri ve Hadoop ekosisteminin farklı bileşenlerini çalıştırmamız gerektiğinde, ayrıntılı bir performans izleme sistemine duyulan ihtiyaç vazgeçilmez hale gelir. Spark uygulamaları, paylaşılan kaynaklardaki verilerin dağıtılmış olarak işlenmesini gerçekleştirir ve bu da DevOps ekibinin çalışmasını çok karmaşık hale getirir. DevOps ekibi, mevcut kaynakları etkin bir şekilde yönetmeli ve kesinti sürelerini önlemek için sistemin farklı bileşenlerini yakından izlemelidir. Performans izleme sistemi tarafından sağlanan tam yığın görünürlüğü, DevOps ekiplerinin sistem davranışını anlamasına ve üretim sorunlarına hızla tepki vermesine yardımcı olur. Bu, Spark uygulamalarının güvenilirliğini, ölçeklenebilirliğini ve performansını garanti eder.
Bu karmaşık sistem için ideal performans izleme sistemi aşağıdaki özelliklere sahip olmalıdır:
Bu yazıda, bir performans izleme sistemi geliştirmek için açık kaynaklı araçları ve teknolojileri kullanacağız. Spark uygulama performans izleme sisteminin tasarımının üç amacı vardır:
Apache Spark, göstergeler için bir web-ui ve REST API sağlar. Spark ayrıca konsol, JMX, Servlet, Graphite vb. Dahil olmak üzere çeşitli alıcılar sağlar. Dr-fil, sparklint, prometheus vb. Gibi başka açık kaynak performans izleme araçları da mevcuttur. Bu araçların sağladığı göstergeler temel olarak sunucu düzeyinde göstergelerdir ve bunlardan bazıları uygulama bilgilerini de sağlar.
Uber JVM Profiler, sunucu düzeyinde ve uygulama ölçümlerini aynı anda toplar. Sürücü, yürütücü veya herhangi bir JVM'den tüm ölçümleri (cpu, bellek, arabellek havuzu vb.) Toplayabilir. Mevcut kodu değiştirmeden geliştirilebilir, böylece yöntemler, parametreler ve yürütme süresi hakkında ölçümler toplayabilir. Zaman serisi analizi için ölçümleri saklamak için güçlü bir zaman serisi veritabanı olan InfluxDB'yi kullanacağız. Uber JVM Profiler'ı genişleteceğiz ve InfluxDB'ye yeni bir Reporter ekleyeceğiz, böylece ölçüm verileri HTTP API aracılığıyla kaydedilebilir. Grafik gösterge tabloları için, InfluxDB'den gösterge verilerini sorgulayan Grafana'yı kullanacağız.
Aşağıda, Spark uygulama performans izleme sisteminde kullanılan araçların ve tekniklerin ayrıntıları verilmiştir.
Uber JVM Profiler
Uber JVM Profiler, kümedeki farklı düğümlerden performans göstergelerini ve kaynak kullanım göstergelerini toplayan dağıtılmış bir profil oluşturucudur. Uygulamayla birlikte bir Java aracısı olarak çalışır ve farklı ölçümleri toplar. Bu göstergeleri daha fazla analiz ve raporlama için belirlenen Raportörde yayınlar. Uber JVM Profiler, Spark uygulamalarını analiz etmek için geliştirilmiştir, ancak herhangi bir JVM tabanlı uygulamayı analiz etmek için de kullanılabilir. Uber JVM Profiler'ın üç ana bileşeni vardır:
Profiler: Uber JVM Profiler, aşağıdaki Profiler'ı içerir:
Transformer: Bu Sınıf Dosya Transformatörü, Java yöntemlerinin bayt kodunu geliştirmek için kullanılır.
Muhabir: Mevcut Muhabirler şunları içerir:
JVM Profiler hakkında daha ayrıntılı bilgi için lütfen Uber'in blog gönderisine bakın.
InfluxDB ve Grafana
InfluxDB: InfluxDB, büyük miktarlarda zaman damgalı veriyi depolamak ve sorgulamak için açık kaynaklı bir zaman serisi veritabanıdır. Bu veriler IoT sensör verileri, gerçek zamanlı analiz verileri, uygulama gösterge verileri veya DevOps izleme verileri olabilir. Eski verilerin süresinin dolmasına izin vererek ve eski verileri silerek otomatik veri yaşam döngüsü yönetimi gerçekleştirir. SQL benzeri bir sorgu dili, HTTP API ve istemci kitaplığı aracılığıyla yazma ve sorgulama işlevleri sağlar. Lütfen buradan daha fazla bilgi alın.
Grafana: Grafana, açık kaynaklı bir ölçüm panosu ve grafik düzenleyicidir. Grafana ayrıca uyarıları ve bildirimleri de destekler. Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch ve CloudWatch gibi birçok veri kaynağını destekler. Grafana web sitesinde birçok gösterge tablosu ve eklenti (hem açık kaynak hem de ticari) bulunabilir. Grafana hakkında daha ayrıntılı bilgi için lütfen bu web sitesini ziyaret edin.
sistem yapısı
Spark uygulamaları, binlerce düğüme kadar birkaç düğüm içerebilen bir küme ağında çalışır. Bu dağıtılmış sistemden ölçümleri toplamak ve bunları daha fazla analiz için diğer sistemlere göndermek için, gevşek bağlantı ve hata toleransı olan bir mimariye ihtiyacımız var. Metrikleri Kafka konularına yayınlamak en iyi çözümlerden biridir. Uber JVM Profiler, bu amaçla kullanılabilen "KafkaOutputReporter" ile birlikte gelir. Diğer bir çözüm ise InfluxDB kullanmaktır. InfluxDB, veritabanını sorgulamak ve ona yazmak için kullanılabilen bir HTTP API sağlar. Bu API, Temel ve JWT belirteç kimlik doğrulamasını destekler ve HTTPS erişimini destekler. Bu makaledeki "InfluxDBOutputReporter", farklı Profilciler tarafından toplanan ölçümleri depolamak için Write HTTP Endpoint'i çağıracaktır. Grafana, InfluxDB için zengin veri kaynağı eklentileri sağlar. Grafana, InfluxDB'den gösterge verilerini almak için Sorgu HTTP Uç Noktasını kullanır ve verileri gösterge tablosunda grafikler ve tablolar şeklinde görüntüler. Bu grafikler ve tablolar, Grafana'da ayarlanabilen sabit zaman aralıklarında otomatik olarak yenilenir.
Uber JVM Profiler, InfluxDB ve Grafana kullanan Spark uygulama performans izleme sisteminin mimari diyagramı aşağıdaki Şekil 1'de gösterilmektedir.
Şekil 1. Performans izleme sisteminin mimari diyagramı
Teknoloji ve araçlar
Aşağıdaki tablo, performans izleme sistemi tarafından kullanılan teknikleri ve araçları listelemektedir.
Bu araçların nasıl kurulacağını ve yapılandırılacağını öğrenmek için lütfen ilgili belgelere bakın.
Tasarım ve Uygulama
Aşağıdaki bölüm, Spark uygulama performans izleme sisteminin tasarım ve uygulama ayrıntılarını tanıtmaktadır. Uber JVM Profiler, sürücülerden ve uygulayıcılardan ölçümler toplar. Bu ölçümler, role, processUuid ve host gibi ayrıntılı bilgileri içerir. Bu bilgiler, farklı sistemleri tanımlamak ve bu sistemlerin göstergelerini analiz etmek için çok kullanışlıdır. InfluxDB'de, bu bilgileri farklı yürütme programlarının performans göstergelerini sorgulamak için kullanabiliriz. Sorgu performansını iyileştirmek için InfluxDB etiketine processUuid ekleyebiliriz. İlk olarak, InfluxDB'de "metrikler" veritabanını oluşturacağız, ardından JVM Profiler kod tabanına "InfluxDBOutputReporter" ekleyeceğiz ve son olarak Grafana panosunu yapılandıracağız.
InfluxDB'de metrik veritabanı oluşturun
InfluxDB sunucusunu başlatın, bağlantı noktası varsayılan olarak 8086'dır. Ubuntu sisteminde bir terminal açın ve "Influxd" komutunu çalıştırın.
/ kullanıcı / bin $ sudo influxd
Sunucu başlatıldıktan sonra, başka bir terminalde "akış" başlatın. Ardından "metrikler" veritabanını oluşturmak için komutu yürütün.
/ kullanıcı / bin $ sudo akışı
VERİTABANI metrikleri OLUŞTUR
InfluxDBOutputReporter'ı uygulayın
"InfluxDBOutputReporter" ı JVM-Profile kod tabanında uygulayacağız. Bu bölümde tartışılan uygulama ayrıntıları için lütfen GitHub'daki "Influxdb_reporter" dalının InfluxDBOutputReporter.java dosyasına bakın.
Grafana'da veri kaynakları ve gösterge tabloları ekleyin
Bu bölümde, Grafana'da bir metrik veri grafiği eklemek için gerekli adımlar açıklanacaktır.
Grafana sunucusunu başlatın. Ubuntu'da aşağıdaki komutları çalıştırabiliriz. Varsayılan bağlantı noktası numarası 3000'dir.
sudo hizmeti grafana sunucusu başlangıcı
Tarayıcınızda http: // localhost: 3000 / 'i açın ve InfluxDB için bir veri kaynağı oluşturun. Adı "InfluxDBDataSource" olarak, Türü "InfluxDB" olarak ayarlayın, InfluxDB'nin varsayılan URL'si "http: // localhost: 8086" ve veritabanı adı "metrics" dir.
Yeni bir gösterge tablosu oluşturmak için "Grafik" i tıklayın ve bir sorgu eklemek için "Düzenle" yi tıklayın. Aşağıda örnek bir sorgu verilmiştir.
Kodu kopyala
Committed olarak "heapMemoryComitted" öğesini, "metrics" den "heapMemoryTotalUsed" öğesini seçin. > şimdi () - 5mGrafana, sorguda aktarılabilen şablon değişkenlerini tanımlamak için bazı seçenekler sunar. Bu, kontrol panelinde birden çok yürütmeden gelen verileri görüntülemek için çok kullanışlıdır. Örneğin, "executorProcessUuid" ve "timeInterval" için değişkenler oluşturabilir ve bunları aşağıda gösterildiği gibi sorguda kullanabiliriz.
Kodu kopyala
Committed olarak "heapMemoryComlied", "metrics" den "heapMemoryTotalUsed" öğesini seçin. "autogen". "CpuAndMemory" burada "processUuid" = ~ / ^ $ executorProcessUuid $ / AND time > now () - $ timeIntervalGitHub, bir JSON örnek dosyası Spark-Metrics-Dashboar sağlar. Bu dosya Grafana sunucusuna aktarılabilir. Tarayıcınızda http: // localhost: 3000 / dashboard / import sayfasını açın ve ".json Dosyası Yükle" yi tıklayın.
Derleyin ve dağıtın
Bu bölüm, bir performans izleme sistemi oluşturma ve dağıtma adımlarını tanıtacaktır. Uygulama kodu GitHub'daki "Influxdb_reporter" dalından klonlanabilir.
"InfluxDBOutputReporter" ile bir JVM Profiler oluşturmak için aşağıdaki komutu kullanın.
mvn temiz paket
Maven tarafından oluşturulan JVM Profiler-0.0.9.jar dosyasını bir dizine kopyalayın (örneğin, / opt / profiler). Influxdb.yaml'yi de bu dizine koyabiliriz.
Profil oluşturma için Apache Spark ile birlikte gelen JavaNetworkWordCount uygulamasını kullanacağız. Kaynak kodu /spark-2.3.1-bin-hadoop2.7/examples/src/main/java/org/apache/spark/examples/streaming içinde bulunur.
JavaNetworkWordCount'u çalıştırmak için aşağıdaki komutu kullanarak Netcat sunucusunu çalıştırmamız gerekiyor.
nc -lk 9999
/Spark-2.3.1-bin-hadoop2.7/sbin dizinine gidin ve Master'ı başlatmak için aşağıdaki komutu kullanın.
./start-master.sh
Ana URL'yi günlük dosyasından alabiliriz. Çalışanı başlatmak için bu URL'yi komuta aktarın.
./start-slave.sh -c 2 spark: //192.168.1.6: 7077
/Spark-2.3.1-bin-hadoop2.7/bin dizinine gidin ve aşağıdaki komutları çalıştırın. Bu komut JavaNetworkWordCount uygulamasını çalıştıracak ve JVM Profiler'ı başlatacaktır. Parametreler hakkında daha fazla bilgi için lütfen Uber JVM Profiler'ın GitHub README sayfasını kontrol edin.
Kodu kopyala
spark-submit --master spark: //192.168.1.6: 7077 --conf "spark.driver.extraJavaOptions = -javaagent: /opt/profiler/jvm-profiler-0.0.9.jar=reporter=com.uber.profiling .reporters.InfluxDBOutputReporter, metricInterval = 5000, sampleInterval = 5000, ioProfiling = true "--conf" spark.executor.extraJavaOptions = -javaagent: /opt/profiler/jvm-profiler-0.0.9.jar=reporter=com.uber .profiling.reporters.InfluxDBOutputReporter, tag = influxdb, configProvider = com.uber.profiling.YamlConfigProvider, configFile = / opt / profiler / influxdb.yaml, metricInterval = 5000, sampleInterval = 5000, ioProfiling. = true "--class orgap .spark.examples.streaming.JavaSqlNetworkWordCount ../examples/jars/spark-examples_2.11-2.3.1.jar localhost 9999Alternatif olarak, uygulamayı çalıştırmak için yaml dosyasını kullanabiliriz. Komutta "configProvider" ve "configFile" parametrelerini aşağıda gösterildiği gibi geçirin.
Kodu kopyala
spark-submit --master spark: //192.168.1.6: 7077 --conf "spark.driver.extraJavaOptions = -javaagent: /opt/profiler/jvm-profiler-0.0.9.jar=reporter=com.uber.profiling .reporters.InfluxDBOutputReporter, configProvider = com.uber.profiling.YamlConfigProvider, configFile = / opt / profiler / influxdb.yaml, metricInterval = 5000, sampleInterval = 5000, ioProfiling = true "--conf "J.executor.extra : /opt/profiler/jvm-profiler-0.0.9.jar=reporter=com.uber.profiling.reporters.InfluxDBOutputReporter,tag=influxdb,configProvider=com.uber.profiling.YamlConfigProvider,configFile=/opt/profiler .yaml, metricInterval = 5000, sampleInterval = 5000, ioProfiling = true "--class org.apache.spark.examples.streaming.JavaSqlNetworkWordCount ../examples/jars/spark-examples_2.11-2.3.1.jar localhost 9999"Giriş" terminaline gidin ve aşağıdaki komutları uygulayın.
ölçümleri kullan
ölçüleri göster
Aşağıda gösterildiği gibi, "metrikler" veritabanında "Ölçümler" adını alacağız.
CpuAndMemory
IO
Işlem bilgisi
Yığın izleme
CpuAndMemory metriğinden tek bir kayıt almak için aşağıdaki komutu kullanın.
CpuAndMemory sınırından * seçin 1
Aşağıda örnek bir gösterge panosu verilmiştir.
Şekil 2. Spark ölçümleri için Grafana kontrol paneli örneği
lehte ve aleyhte olanlar
Bu makalede tartıştığımız performans izleme sistemi, sistem ve uygulama ölçümlerini toplamak ve bunları InfluxDB zaman serisi veritabanında depolamak için Uber JVM Profiler'ı kullanır. Zaman serisi veritabanları, veri tutma stratejileri, sürekli sorgulama, esnek zaman toplama ve milyonlarca kaydın gerçek zamanlı işleme ve toplu işlemesini sağlar. Bu zaman serisi verileri, geçmişte sistemdeki değişiklikleri, sistemin mevcut davranışını analiz etmemize ve sistemin gelecekte nasıl değişeceğini tahmin etmemize yardımcı olur. Göstergeleri ilişkilendirerek arıza modlarını belirleyebiliriz. Farklı gösterge türlerine kolayca erişmemize yardımcı olacak bir gösterge tablosu oluşturmak için Grafana'yı kullandık. DevOps ekipleri, sistem davranışını anlamak ve verilerdeki sıcak noktaları belirlemek için farklı ölçümleri ilişkilendirmek için bu grafikleri ve çizelgeleri kullanabilir. Bu, uyumluluğun korunmasına ve uygulama SLA'larının elde edilmesine yardımcı olur. Genel olarak, performans izleme sistemi, sistemin sürekli izlenmesine yardımcı olur.
Bu performans izleme sistemi, aracı tabanlı Profiler ile sınırlıdır. Aracı tabanlı Profiler belirli miktarda bilgi işlem kaynağı tüketir. Bazen büyük dağıtılmış sistemler için zor olabilecek sorun giderme ve yama gerekebilir. Temsilciyi üretim sistemine kurmadan önce biraz araştırma yapmanız gerekebilir. Performans izleme sisteminin güvenliğini, ölçeklenebilirliğini ve kullanılabilirliğini de göz önünde bulundurmalıyız. Uygulamaları ve sistemleri doğru bir şekilde tasarlayarak ve ayarlayarak çoğu sorun çözülebilir. Üretim sistemine aracılar kurmanıza izin verilmiyorsa, aracısız bir sistem kullanmayı düşünebilirsiniz, ancak bunun daha az ayrıntılı gösterge ve ağ yükü ek yükü gibi kendi sınırlamaları da vardır.
sonuç olarak
Karmaşık Spark uygulamaları için, üretim ortamındaki sorunları belirlemek, hata ayıklamak ve çözmek kolay değildir.Bu sorunları çözmemize yardımcı olacak etkili bir performans izleme sistemine ihtiyacımız var. Uber JVM Profiler iyi bir açık kaynak aracıdır, metrikleri yayınlamak için bir Reporter eklemek üzere genişletebiliriz. Farklı Profilciler tarafından toplanan Spark uygulama performans ölçümleri InfluxDB'de depolanabilir. Bu makalede tartıştığımız "InfluxDBOutputReporter", Spark sürücüsünün ve yürütücülerinin ölçümlerini HTTP API aracılığıyla InfluxDB'ye yazar. Grafana, HTTP API aracılığıyla ölçümleri sorgulayabilen InfluxDB için bir eklenti sağlar. Bu göstergeler için grafikler içeren panolar oluşturabilir ve düzenli aralıklarla otomatik olarak yenileyebiliriz. "InfluxDBOutputReporter" kodu burada sağlanır ve Spark-InfluxDB-Grafana.json dosyası burada sağlanır.
referans
Uber JVM Profiler-https: //eng.uber.com/jvm-profiler/
InfluxDB-https: //docs.influxdata.com/influxdb/v1.6/
Grafana-http: //docs.grafana.org/
Yazar hakkında
Amit Baghel, Java ekosistemini çevreleyen kurumsal uygulamaların ve ürünlerin tasarımı ve geliştirilmesinde 17 yıldan fazla deneyime sahip bir yazılım mimarıdır. Şu anda IoT, bulut bilişim, büyük veri çözümleri, mikro hizmetler, DevOps ve sürekli entegrasyon ve teslimat üzerine odaklanmaktadır. Baghel ile baghel_amit@yahoo.com adresine e-posta göndererek iletişime geçebilirsiniz.
Orijinal İngilizce metni görüntüleyin:
https://www.infoq.com/articles/spark-application-monitoring-influxdb-grafana