Graphite aracılığı ile Grafana'da Apache SPARK ve Hadoop Monitoring
Tags: grafana, graphite, spark, hadoop
Published: 2023-06-21 12:07:03

Bu yazının amacı,Apache Spark ve Hadoop metriklerini kaynak kabul edip, bu verilerin Grafana ortamında görselleştirilmesini sağlamaktır.Bu nedenle ismi geçen uygulamalar ile ilgili kısa bilgi verip, yapmak istediğimiz ana konuya odaklanmak istiyorum.Tüm adımlar standart(monolitik) mimari ile kurgulanmıştır.

**Grafana:** Desteklenen veri kaynaklarından metrik verileri girdi olarak sağladığımızda analitik ve etkileşimli görseller oluşturabileceğimiz açık kaynak kodlu bir uygulamadır.

**Graphite:** Metrik verilerin toplanması, depolanması, görselleştirilmesi ve analiz edilmesi için kullanılan bir açık kaynaklı yazılım platformudur. Genellikle sistem performansı, ağ izleme, uygulama izleme ve zaman serisi verilerinin analizi gibi alanlarda kullanılır. Graphite, metrik verilerini çeşitli kaynaklardan alabilir, ölçeklenebilirlik sağlayabilir ve esnek bir şekilde özelleştirilebilir. Aynı zamanda Grafana, Kibana gibi diğer araçlarla da entegre edilebilir. Bu sayede, sistemlerinizi izlemek, performansı analiz etmek ve trendleri görselleştirmek için kullanabileceğiniz güçlü bir araçtır.

**Apache SPARK:** Büyük veri işleme ve analizi için hızlı ve genel amaçlı bir açık kaynak kodlu veri işleme motorudur. Spark, yüksek hızda paralel veri işleme yapabilen dağıtık sistemler üzerinde çalışır. Yoğun veriye sahip uygulamarda veriyi hızlı bir şekilde işleyebilir.

**Hadoop:** Büyük miktardaki verilerin depolanması ve işlenmesi için kullanılan bir açık kaynaklı yazılım çerçevesidir. Hadoop, ölçeklenebilir, dağıtık bir sistem üzerinde çalışır ve birçok düşük maliyetli bilgisayar düğümünden oluşan bir küme üzerinde veri işleme işlerini gerçekleştirir.

**Kurulumlar Ubuntu 22.04 ortamlarında yapılmıştır. Ayrıca kullanılan sunucunun(sunucuların) üzerindeki firewall servisi kapalı konumda olmalıdır. Aksi halde firewall kurallarını yazmanız gerekebilir.**

## GRAFANA KURULUMU

Öncelikle Ubuntu sistemimizin güncel olduğundan emin oluyoruz.
```
sudo apt update && sudo apt upgrade
```

İmzalı paketleri kurmak amacıyla Grafana gpg anahtarını ekliyoruz.
```
sudo apt install -y gnupg2 curl software-properties-common
curl -fsSL https://packages.grafana.com/gpg.key|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/grafana.gpg
```

Grafana APT repository'sini depo tanımlarımız arasına ekliyoruz.
```
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
```

APT repository'sini ekledikten sonra kullanılan paket veritabanları güncelleyip ve Grafana kurulumu yapıyoruz.
```
sudo apt update 
sudo apt -y install grafana
```

Grafana servisini başlangıçta otomatik olarak başlatılacak şekilde yapılandırmak ve başlatmak için aşağıdaki komutu çalıştırıyoruz.
```
sudo systemctl enable --now grafana-server
```
Bu şekilde Grafana kurulumunu tamamlamış oluyoruz. Grafanaya erişim için arayüzlü bir istemcinin Web Browser'una Grafana kurulumu yaptığımız Ubuntu 22.04 sunucunun IP adresini yazarak sonuna port bilgisi olarak :3000 ekliyoruz.

```
UBUNTU_SERVER_IP_ADRES:3000
```

Kurduğumuz Grafana sunucusunun default kullanıcı adı:admin, parola:admin şeklindedir. İlk girişte sizden yeni bir parola oluşturmanız beklenmektedir. Bu adımı atlama seçeneği de mevcuttur.


Grafanayı kurduktan sonra ortamınızın değişkenleri doğrultusunda isterseniz aynı sunucu üzerinde isterseniz farklı bir sunucuda Graphite kurulumlarına başlayabilirsiniz. Ben aynı sunucu üzerinde devam edeceğim.

## GRAPHITE KURULUM VE KONFIGURASYONU

Farklı bir zamanda kuruluma devam edilebileceği veya farklı bir sunucu üzerinden devam edilebileceği için yine ilk olarak Ubuntu sistemimizin güncel olduğundan emin oluyoruz.

```
 sudo apt-get update && sudo apt-get upgrade
```

Paketlerin depoda olduğunu ve sürüm bilgilerini görüntülemek amacıyla aşağıdaki komutlar çalıştırılabilir.Bu komutların kuruluma doğrudan bir etkisi yoktur.
```
sudo apt-cache search graphite | grep "graphite-"
sudo apt-cache madison graphite-carbon graphite-web
```

Paket kurulumları yapıyoruz.
```
sudo apt-get install graphite-carbon graphite-web
```

Bu aşamadan sonra Graphite uygulamasının konfigurasyonlarını yapmaya başlıyoruz.Graphite Carbon uygulamasına ait yapılandırma dosyasının ve diğer yapılandırma ayarlarını görüntülemek için aşağıdaki komutu çalıştırıyoruz.

```
cat /etc/carbon/carbon.conf | egrep -v '#' | sed '/^$/d'
```
Sunucun veya servislerin yeniden başlaması durumunda carbon-cache.py servisinin yeniden başlaması için aşağıdaki düzenlemeyi yapıyoruz.Bu adım kurulumun devamı açısından zorunlu değildir.
```
sudo vim /etc/default/graphite-carbon
# Change to true, to enable carbon-cache on boot
CARBON_CACHE_ENABLED=true  ## Ihtiyac duyulmasi haline "true" yapilabilir.
```

Dosyayı kaydetip kapattıktan sonra servis yeniden başlatılır.
```
sudo systemctl start carbon-cache
sudo systemctl status carbon-cache
```
Paket kurulumu sırasında bağımlılıklardan bir tanesi SQLite Veritabanıdır. Graphite uygulaması bir veritabanına ihtiyaç duyar.Uygulama geniş bir altyapıda cluster kullanılacaksa PostgreSQL veya MySQL kullanılabilir. Biz default yapı üzerinden yani SQLite üzerinden kuruluma devam edeceğiz. Bu aşamada Graphite uygulamasının veritabanı oluşturma ve SQL ayarlarını yapıyoruz.
```
sudo django-admin migrate --settings=graphite.settings
```
SQLite veritabanı dosyasının sahipliğini, veritabanı işlemlerini çalıştırmak için kullanılacak olan _graphite kullanıcısına yeniden atıyoruz.
```
sudo chown _graphite:_graphite /var/lib/graphite/graphite.db
```
Graphite uygulamasının Web konfigurasyonlarını düzenliyoruz. Default olarak oluşturulmuş anahtarı kendi belirlediğimiz bir anahtar ile değiştiriyoruz.
```
sudo vim /etc/graphite/local_settings.py
...
SECRET_KEY = 'MY_SECRET' # kendi anahtarimizi giriyoruz.
```
Graphite Web kurulum dizinini düzenlemek için sembolik link oluşturuyoruz.
```
sudo ln -s /etc/graphite/local_settings.py /usr/lib/python3/dist-packages/graphite/local_settings.py
```

Graphite uygulamasının arayüzünün görüntülenmesi için bir web sunucusuna ihtiyaç duyar. Bu birkaç farklı şekilde yapılabilir. Biz bu kılavuz için “Apache + mod_wsgi” yığınını kullanacağız.
Apache kurulumu ve konfigurasyonu için şu adımlar takip edilmelidir.

```
sudo apt-get install apache2 libapache2-mod-wsgi-py3

sudo cp /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available

sudo a2dissite 000-default

sudo a2ensite apache2-graphite

sudo systemctl reload apache2 

sudo chown _graphite:_graphite /var/log/graphite/info.log

sudo chown _graphite:_graphite /var/log/graphite/exception.log

sudo systemctl reload apache2 
```
Bu adımdan sonra Web Browser'dan Graphite sunucusunun bulunduğu sununun IP'sine istek attığımız zaman arayüze erişimin açık olması gerekmekte. Fakat Apache'nin loglarını incelediğimiz zaman bir hata göreceğiz. 
```
tail -f  /var/log/apache2/graphite-web_error.log
```
Bu hatanın çözümü için aşağıdaki adım uygulanabilir.
```
sudo vi /etc/apache2/sites-available/apache2-graphite.conf
...
        WSGIProcessGroup _graphite
        WSGIApplicationGroup %{GLOBAL}     ## Bu satır eklenecek. 
        WSGIImportScript /usr/share/graphite-web/graphite.wsgi process-group=_graphite application-group=%{GLOBAL}
...

sudo systemctl reload apache2
```
Bu adımdan sonra loga tekrar baktığımızda hata olmadığını göreceğiz.

```
tail -f  /var/log/apache2/graphite-web_error.log -c 0
```
Bu adımla birlikte Web Sunucusu kurulumunu tamamlamış olduk.Şimdiye kadar Graphite'i metrikleri görüntülemek için yapılandırmıştık, ancak grafikleri kaydetmek veya panolar oluşturmak için kullanacak yapıyı oluşturmadık. Sıradan kullanıcıları ekleyebilmemiz ve daha gelişmiş işlemler yapabilmemiz için önce bir Graphite admin kullanıcısı oluşturmamız gerekiyor.

```
sudo django-admin createsuperuser --settings=graphite.settings
```
Default yapıda admin sayfası Grapite Web sunucu ayarlarından farklı olarak Django Admin Dashboard'undan erişilmektedir.Bu sebeple bir sembolik link oluşturarak bu sorunu da çözüyoruz.

```
sudo ln -s /usr/lib/python3/dist-packages/django/contrib/admin/static/admin/ /usr/share/graphite-web/static/admin
```
##  Apache SPARK Metriklerini Graphite'ye Yönlendirme

Apache SPARK metriklerini  Graphite'ye yönlendirmek için SPARK'ın konfigurasyon dosyalarından bazılarında düzenlemeler yapacağız.

Öncelikle SPARK metric.properties dosyasını düzenleyelim. Bu dosya SPARK'ın kurulu olduğu dizinde conf dizinin altında bulunmaktadır.Eğer bu metric.properties dosyası yoksa metric.properties.template'den kopyalayarak üretebilir veya elle oluşturabilirsiniz. metric.properties dosyasının içeriği aşağıdaki gibi olmalıdır.Diğer satırlar silinebilir veya yorum olarak kalabilir.

```
driver.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
executor.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
worker.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
master.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
# Example configuration for Graphite sink
*.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
*.sink.graphite.host=<HOSTNAME VEYA IP>
*.sink.graphite.port=2003
*.sink.graphite.period=10
*.sink.graphite.unit=seconds
*.sink.graphite.prefix=<KEY>
```
Yine aynı dizinde bulunan spark-default.conf dosyasına aşağıdaki satırları ekliyoruz.Benim ortamımda SPARK, /opt/spark dizininde kurulu olduğu için bu şekilde düzenledim. İkinci satırı kendi ortamınıza göre düzenlemelisiniz.
```
spark.metrics.namespace spark
spark.metrics.conf /opt/spark/conf/metrics.properties
```
SPARK'ı yeniden başlattıktan sonra Graphite arayüzünden SPARK'ın metriklerini görüntüleyebiliyor olmalıyız.

##  Hadoop Metriklerini Graphite'ye Yönlendirme

Hadoop metriklerini  Graphite'ye yönlendirmek için Hadoop'un konfigurasyon dosyalarından bazılarında düzenlemeler yapacağız.

Öncelikle Hadoop hadoop.metric2.properties dosyasını düzenleyelim. Bu dosya Hadoop'un kurulu olduğu dizinde ./etc/hadoop dizinin altında bulunmaktadır.Eğer bu hadoop.metric2.properties dosyası yoksa hadoop.metric2.properties.template'den kopyalayarak üretebilir veya elle oluşturabilirsiniz. hadoop.metric2.properties dosyasının içeriği aşağıdaki gibi olmalıdır.Diğer satırlar silinebilir veya yorum olarak kalabilir.
```
# GraphiteReporter ayarları
*.sink.graphite.class=org.apache.hadoop.metrics2.sink.GraphiteSink
*.sink.graphite.host=<HOSTNAME VEYA IP>
*.sink.graphite.port=2003
*.sink.graphite.period=10
*.sink.graphite.prefix=HADOOP
```
Yine aynı dizinde bulunan core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml dosylarına aşağıdaki satırların eklenmesi durumunda ilgili metrikler Graphite'ye aktarılmış olacaktır..Benim ortamımda Hadoop, /opt/hadoop dizininde kurulu olduğu için bu şekilde düzenledim. <value> değerini kendi ortamınıza göre düzenlemelisiniz.

```
<property>
  <name>hadoop.metrics2.file.filename</name>
  <value>/opt/hadoop/etc/hadoop/hadoop-metrics2.properties</value>
</property>
```


## GRAFANA ARAYUZUNDEN METRIKLERIN GORUNTULENMESI

Şimdi sırada Grafana arayüzünden bu metrikleri kullanabilmeye geldi. Bu kısımda çok çeşitli kombinasyonlar yapılabileceği için kısa bir örnek göstereceğim.

Öncelikle daha önce kurduğumuz Grafana arayüzüne bağlanarak giriş yapmalıyız. 
Ardından sol tarafta açılabilir menü de bulunan **Administration** sekmesine tıklıyoruz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bui9xocunt4er4lx50in.PNG)

Açılan pencere DataSource'a tıklayıp Arama çubuğuna Graphite yazarak buluyoruz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n91cdjyva9zdnaamb9b1.PNG)

Açılan formda URL kısmına başında "http://" olacak şekilde Graphite sunusunun ip adresini yazarak bağlantıyı kaydediyoruz.İsterseniz Name kısmını da değiştirebilirsiniz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p5wkazfixivgae0umaff.PNG)

Son olarak Grafana'da Dashboard hazırlayarak metriklerimizi izleyebiliriz. Bunun için Grafana arayüzünde, sağ üstte bulunan "+" işaretine tıklıyoruz ve New Dashboard'u seçiyoruz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ii4efxxad997qk6dwja4.PNG)

Açılan pencerede "+Add Visualization" u seçerek devam ediyoruz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wl89h854d3p7ztokj30l.PNG)

Burada karşımıza DataSource seçim ekranı geliyor. DataSource olarak Graphite'yi seçerek devam ediyoruz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ituv7wiwwjkilvxnoehq.PNG)

Açılan sayfada Graphite anahtarımızı , hangi metriği izleyeceğimizi ve hangi formatta görüntüleyeceğimizi seçerek tamamlıyoruz. Birden fazla metrik aynı yöntem takip edilerek farklı şekillerde düzenlenebilir.

Bu şekilde Apache SPARK veya Hadoop metriklerini Grafana üzerinden görüntüleyebilmek için adımları tamamlamış olduk.