Pratik Bilgiler ve Komutlar-3

Merhaba “Pratik Bilgiler, Pratik Komutlar” yazı serisinin 3.’süne hoş geldiniz. Bu serinin amacı karşılaştığımız hata ver zorlukları pratik ve hızlı bir şekilde aşmak. Örneğin mysql root şifremi unuttum ya da bilmiyorum ne yapmalıyım? sorusunun cevabı “MySQL root şifresini nasıl sıfırlarız?” sorusunda.

  1. Python listesini filtrelemek
  2. Apache Spark Dataframe string timestamp tür dönüşümü
  3. MySQL root şifresini nasıl sıfırlarız?
  4. Birden fazla linux makine üzerinde aynı komutu nasıl çalıştırırız? distributed shell – dsh
  5. İki Scala Array farkını nasıl elde ederiz? ( Array diff)
  6. Spark dataframe join örneği (Scala)
  7. Spark dinamik kaynak yönetimi modu
  8. Python TabError: inconsistent use of tabs
  9. Csv dosyasından hive tablosuna veri yüklemek: hive cli kullanarak
  10. Hive CLI select sorgusu sonucunda başlıkları görmek
  11. Hive sorgusu için kullanılacak reducer sayısını nasıl belirleriz?
  12. Linux vi veya nano editör kullanmadan dosya içine nasıl yeni satır eklenir?
  13. Postgresql rol oluşturmak ve veri tabanı üzerinde bu role yetki vermek (postgresql rol yetki)
  14. Jenkins version öğrenmek
  15. centos version öğrenmek
  16. Ortam değişkeni var mı? Varsa değeri nedir? Örneğin JAVA_HOME
  17. Kafka versiyonunu öğrenmek – linux komut satırından
  18. Jenkins UI dil değiştirme – jenkins change ui language
  19. Postgresql tablosuna csv dosyasından veri kopyalamak (postgresql csv)
  20. Python ile github’dan zipli dosya indirip açmak

1. Python listesini filtrelemek

Listemiz:

 authors = ['Albert Einstein',
 'J.K. Rowling',
 'Albert Einstein',
 'Jane Austen',
 'Marilyn Monroe',
 'Albert Einstein',
 'André Gide',
 'Thomas A. Edison',
 'Eleanor Roosevelt',
 'Steve Martin']

Şimdi “Ste” olanları filtreleyelim:

 list(filter(lambda x: "Ste" in x, authors))
 ['Steve Martin']

2. Apache Spark Dataframe string timestamp tür dönüşümü

Elimizde TARIH adında şöyle bir sütun var: “2011-04-07 14:15:15” ve bunun türü string. Bunu nasıl timestamp türüne dönüştürürüz?

import org.apache.spark.sql.{functions => F}
df.withColumn("TARIH", F.unix_timestamp($"TARIH", "dd.MM.yyyy HH:mm:ss").cast(TimestampType))

3. MySQL root şifresini nasıl sıfırlarız?

Bu örneği linux üzerinden yapacağım. root kullanıcısı sizin elinizde ise neler yapabileceğinizi göreceksiniz. Aşağıdaki komutları root kullanıcısı ile çalıştırıyoruz.

systemctl stop mysqld
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
systemctl start mysqld
mysql -u root

En son komuttan sonra mysql> shell açılır. Burada aşağıdaki komutları çalıştırıyoruz.

use mysql;
update user set authentication_string=PASSWORD("yeni_password") where User='root';
flush privileges;
quit

Hayırlı olsun mysql root şifresini hack’lediniz.

4. Birden fazla linux makine üzerinde aynı komutu nasıl çalıştırırız? distributed shell – dsh

Sistem yöneticileri çok sayıda makineyi kısa sürede ve olabildiğince az dolaşarak izleyebilmenin ve yönetebilmenin önemini çok iyi biliyorlar. Küçük bir bulut ortamı ya da büyük bir sunucu kümesi (cluster) olsun, bilgisayarları merkezi olarak yönetme yeteneği çok önemlidir. Bunu kısmen yapmak için, kullanıcının birden fazla makine üzerinde komut çalıştırmasına izin veren DSH adında küçük ancak çok faydalı bir aracı nasıl kullanacağınızı göstereceğim.

Uygulama olarak CentOS7 işletim sistemi üzerinde dağıtık shell (DSH ) nasıl çalıştırılır onun örneğini yapacağız. Önce kurulum:

libdshconfig indirip derleyelim.

# wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz
# tar xfz libdshconfig*.tar.gz 
# cd libdshconfig-*
# ./configure ; make
# make install

Şimdi de DSH’i derleyip kuralım.

# wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz
# tar xfz dsh-0.22.0.tar.gz
# cd dsh-*
# ./configure ; make 
# make install

/usr/local/etc/dsh.conf dosyası içinde remoteshell = rsh değerini ssh yapıyoruz.

/usr/local/etc/ dizninde machines.list adında bir dosya yaratıyoruz ve içine sunucu kümesindeki sunucuların adını alt alta yazıyoruz.

 touch /usr/local/etc/machines.list
 nano /usr/local/etc/machines.list
cdh1.impektra.com
cdh2.impektra.com
cdh3.impektra.com
cdh4.impektra.com
cdh5.impektra.com

Her sonucu adını söylesin kontrol edelim:

dsh -aM -c hostname

Çıktı:

cdh5.impektra.com: cdh5.impektra.com
cdh2.impektra.com: cdh2.impektra.com
cdh4.impektra.com: cdh4.impektra.com
cdh1.impektra.com: cdh1.impektra.com
cdh3.impektra.com: cdh3.impektra.com

Başka bir örnekle bitirelim: Tum sunucuları kapat.

dsh -aM -c "init 0"
cdh5.impektra.com: Connection to cdh5.impektra.com closed by remote host.
cdh2.impektra.com: Connection to cdh2.impektra.com closed by remote host.
cdh1.impektra.com: Connection to cdh1.impektra.com closed by remote host.
cdh3.impektra.com: Connection to cdh3.impektra.com closed by remote host.
cdh4.impektra.com: Connection to cdh4.impektra.com closed by remote host.

Hayırlı olsun.

5. İki Scala Array farkını nasıl elde ederiz? ( Array diff)

Spark’ı Scala ile kullananlar veri manipülasyonu esnasında niteliklerle uğraşırlar. Bu nitelikler çoğu zaman elle kontrol eilemeyecek kadar çok olabilir. Örneğin 85 adet nitelik olduğunu düşünelim ve aralarından bazılarını çıkarıp kalanları select ile seçeceksiniz. Bunu elle yapmanız çok zor olurdu. Birazdan Scala array ile iki array arasındaki farkı alacağız. Elde edilen yeni array spark dataframe select içine mkString ile nasıl yazılacak onu göreceğiz.

val arr1 = Array("Domates","Biber","Patlıcan","Ispanak","Kabak")
val arr2 = Array("Ispanak","Kabak")

// İki array farkı. Önce Set'e çevir, diff al, sonucu tekrar array yap.
val diffArr = arr1.toSet.diff(arr2.toSet).toArray

Şimdi elde edilen array’i yazalım.

println

(

diffArr

.mkString(

” “

))

Çıktı:

Biber Patlıcan Domates

Evet gördüğümüz gibi iki array farkını alıp sonucu yazdırdık. Bunu mkString ile yaptık. Peki virgül ile ayrılmış çift tırnak içinde yazdırabilir miyiz? Aşağıdaki gibi mesela.

"Biber","Patlıcan","Domates"

Evet yazdırabiliriz. Yine mkString kullanacağız ancak farklı argümanlarla.

diffArr.mkString("\"", "\",\"", "\"")

Çıktı:
"Biber","Patlıcan","Domates"

6. Spark dataframe join örneği (Scala)

Aşağıda iki dataframe’in (dfLeft, dfRight) columnName isimli sütun üzerinden left join örneği görülmektedir.

val joinedDf = dfLeft.join(dfRight, dfLeft.col("colunmName") === dfRight.col("colunmName"), "left" )

7. Spark dinamik kaynak yönetimi modu

Spark, başta YARN olmak üzere bir çok kaynak yöneticisi ile çalışabilir. Kaynak yöneticileri kaynakları (bellek ve cpu), uygulama ve kullanıcılara dağıtırlar. Spark uygulaması önceden belirlenen sabit bir kaynağı alabileceği gibi cluster kaynakları müsait oldukça daha fazla kaynak alıp-bırakabilir. Bunu mümkün kılmak için SparkConf’a aşağıdaki ayarları ekleyerek SparkSession oluşturmak yeterlidir.

.set("spark.dynamicAllocation.enabled", "true")
.set("spark.shuffle.service.enabled","true")
.set("spark.dynamicAllocation.initialExecutors","0")
.set("spark.dynamicAllocation.minExecutors","1")
.set("spark.dynamicAllocation.maxExecutors","12")

8. Python TabError: inconsistent use of tabs

Python kodlarını bazen bir yerden alır yapıştırır ve kullanırız. Ancak python söz dizimi girintilere (indentation) duyarlı olduğu için zaman zaman hata alırız. Bazen elinizle girintiyi kontrol edip ayarlasanız bile hata verebilir. Bunun bir çok çözümü var ancak aşağıda paylaşacağım pratik ve çabuk olanı.

Hata örnek:

 File "deneme.py", line 100
    if sayac == 4:
                 ^
TabError: inconsistent use of tabs and spaces in indentation

Çözüm komut satırından:

autopep8 -i deneme.py

komutunu çalıştırıp devam etmek.

9. Csv dosyasından hive tablosuna veri yüklemek: hive cli kullanarak

Zaman zaman bir çok veri tabanında bulunan tabloya csv dosyasından veri yüklemek gerekebilir. Burada, başlık satırı bulunan bir csv dosyasını hive cli ile hive tablosuna yükleme örneği yapacağız. Kullanılacak csv dosyasına buradan erişebilirsiniz. Bu dosyanın linux lokal diskinde bulunduğunu varsayıyorum.

Hive shell’i açma

maria_dev@sandbox-hdp$ hive

Oluşturulacak tablonun csv dosyasına uyumlu olması gerekir. Dolayısıyla CREATE TABLE … demeden önce mutlaka dosyayı incelemelisiniz. Yani verinin yapısına uygun bir şema oluşturmalısınız. Burada yapacağınız hata size NULL olarak geri dönecektir. Ayrıca csv dosyasında başlık bilgisi varsa onu da mutlaka tblproperties kısmında belirtmelisiniz.

create table if not exists simple_data (sirano int, isim string, yas int, meslek string, sehir string, aylik_gelir float) row format delimited fields terminated by ',' tblproperties('skip.header.line.count'='1');

Dosyayı yükleme:

load data local inpath '/home/maria_dev/simple_data.csv' overwrite into table simple_data;

Kontrol:

select * from simple_data;

Sonuç:

OK
1       Cemal   35      Isci    Ankara  3500.0
2       Ceyda   42      Memur   Kayseri 4200.0
3       Timur   30      Müzisyen        Istanbul        9000.0
4       Burcu   29      Pazarlamaci     Ankara  4200.0
5       Yasemin 23              Bursa   4800.0
6       Ali     33      Memur   Ankara  4250.0
7       Dilek   29      Pazarlamaci     Istanbul        7300.0
8       Murat   31      Müzisyen        Istanbul        12000.0
9       Ahmet   33      Doktor  Ankara  18000.0
10      Muhittin        46      Berber  Istanbul        12000.0
11      Hicaziye        47      Tuhafiyeci      Ankara  4800.0
12      Harun   43      Tornacı Ankara  4200.0
13      Hakkı   33      Memur   Çorum   3750.0
14      Gülizar 37      Doktor  İzmir   14250.0
15      Şehmuz  41              Ankara  8700.0
16      Gençay  46      Berber  Ankara  8800.0
16      Gençay  46      Berber  Ankara  8800.0
Time taken: 0.157 seconds, Fetched: 17 row(s)

10. Hive CLI select sorgusu sonucunda başlıkları görmek

Varsayılan konfigürasyon değeri gereği hive cli ile yapılan sorgulamalarda sütun isimleri yer almaz (Yukarıdaki örnekte görülmektedir). Bunu açmak için hive cli üzerinden aşağıdaki komutu girmek yeterli olacaktır.

set hive.cli.print.header = true;

11. Hive sorgusu için kullanılacak reducer sayısını nasıl belirleriz?

Hive execution engine olarak geri planda Apache Tez veya MapReduce kullanabilir. Bunu kullanıcı olarak biz seçebiliriz. MapReduce kullanıldığı durumlarda reducer sayısını elle bielirlemek istersek hive cli üzerinden aşağıdaki komutu yazmamız yeterli olacaktır.

set mapreduce.job.reduces=2;

12. Linux vi veya nano editör kullanmadan dosya içine nasıl yeni satır eklenir?

Önce eklenecek satırı echo ile yazdırırız sonra bu sonucu >> ile hedef dosyaya göndeririz. Bu kadar basit.

 echo "cdhedge.impektra.com" >> /usr/local/etc/machines.list

13. Postgresql rol oluşturmak ve veri tabanı üzerinde bu role yetki vermek (postgresql rol yetki)

CREATE ROLE metastore LOGIN PASSWORD 'Şifrem';
CREATE DATABASE metastore OWNER metastore ENCODING 'UTF8';

14. Jenkins version öğrenmek

sudo cat /var/lib/jenkins/config.xml | grep version

<?xml version='1.1' encoding='UTF-8'?>
  <version>2.235.2</version>

15. centos version öğrenmek

sudo rpm -q centos-release

Çıktı
centos-release-7-8.2003.0.el7.centos.x86_64

16. Ortam değişkeni var mı? Varsa değeri nedir? Örneğin JAVA_HOME

 env | grep JAVA_HOME

Çıktı:
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

17. Kafka versiyonunu öğrenmek – linux komut satırından

Komut:
 kafka-topics.sh --version

Çıktı
2.5.0 (Commit:66563e712b0b9f84)

18. Jenkins UI dil değiştirme – jenkins change ui language

Bunu iki adımda yapabiliriz.

  1. Plugin yğkleme:Plugins bölümünden Locale plugin yükle Jenkins’in yeniden başlamasına izin ver.
  2. Ayar değiştirme: Jenkins’i Yönet -> Sistem konfigürasyounu Değiştir -> LOCAL kısmındaki kutucuğa ENGLISH yaz ve altındaki Ignore browser preference and force this language to all users kutucuğunu işaretle.

19. Postgresql tablosuna csv dosyasından veri kopyalamak (postgresql csv)

 psql -h localhost -U murat -d azhadoop -c "\copy churn FROM '/home/murat/Churn_Modelling.csv' DELIMITERS ',' CSV HEADER;"

20. Python ile github’dan zipli dosya indirip açmak

import requests, zipfile
from io import BytesIO
import os
zip_file_url = 'https://github.com/erkansirin78/datasets/raw/master/IOT-temp.csv.zip'

r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(BytesIO(r.content))
z.extractall("/home/train/datasets")

print(os.listdir("/home/train/datasets"))

Yukarıdaki kod github’dan zipli bir dosyayı indirip onu açacak ve içini /home/train/datasets dizinie yazacaktır. Her çalıştığında mevcut doosyanın üzerine yazar.

Yazar Hakkında
Toplam 180 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (1 Yorum)
Rasmiya
Rasmiya Yanıtla
- 12:56

Sizə minnətdaram Erkan bəy. Mən elmi işimdə Python-dan tətbiq fikirləşirəm. Elmi işim “Kompüter riyaziyyatında informasiya təhlükəsizliyidir”.İnformasiya təhlükəsizliyinə aid digər məqalələləriniz varmı?
Təşəkkür edirəm.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara