Anasayfa / Program/Sorgulama Dilleri / Python / Pratik Bilgiler, Pratik Komutlar-3

Pratik Bilgiler, Pratik 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

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?

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

Hakkında Erkan ŞİRİN

2014'ten beri hem akademik alanda hem de sektörde pratik anlamda büyük veri ve veri bilimi ile ilgili çalışmalar yürütmektedir. Halihazırda İmpektra Bilişim A.Ş.'de büyük veri yöneticisi olarak çalışmakta olup aynı zamanda Gazi Üniversitesi Yönetim Bilişim Sistemleri doktora öğrencisidir. Büyük veri ve veri bilimi ile ilgili birçok kurum ve şirkete eğitimler vermekte ve projeler icra etmektedir. Çalışma alanları: büyük veri platformlarının kurulum ve yönetimi, büyük veri üzerinde makine öğrenmesi, olağan dışılık tespiti, sahtecilik tespiti, veri hazırlama sürecidir.

GÖZ ATMAK İSTEYEBİLİRSİNİZ

IntelliJ IDEA ile Apache Spark Projesini Uzak YARN Cluster Üzerinde Çalıştırmak-2/2

Merhaba. Yazı serimizin ikincisine devam ediyoruz. Bir önceki ilk yazımızda konuya giriş yapmıştık. Hatırlayalım, amacımız …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir