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.
- Python listesini filtrelemek
- Apache Spark Dataframe string timestamp tür dönüşümü
- MySQL root şifresini nasıl sıfırlarız?
- Birden fazla linux makine üzerinde aynı komutu nasıl çalıştırırız? distributed shell – dsh
- İki Scala Array farkını nasıl elde ederiz? ( Array diff)
- Spark dataframe join örneği (Scala)
- Spark dinamik kaynak yönetimi modu
- Python TabError: inconsistent use of tabs
- Csv dosyasından hive tablosuna veri yüklemek: hive cli kullanarak
- Hive CLI select sorgusu sonucunda başlıkları görmek
- Hive sorgusu için kullanılacak reducer sayısını nasıl belirleriz?
- Linux vi veya nano editör kullanmadan dosya içine nasıl yeni satır eklenir?
- Postgresql rol oluşturmak ve veri tabanı üzerinde bu role yetki vermek (postgresql rol yetki)
- Jenkins version öğrenmek
- centos version öğrenmek
- Ortam değişkeni var mı? Varsa değeri nedir? Örneğin JAVA_HOME
- Kafka versiyonunu öğrenmek – linux komut satırından
- Jenkins UI dil değiştirme – jenkins change ui language
- Postgresql tablosuna csv dosyasından veri kopyalamak (postgresql csv)
- 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.
- Plugin yğkleme:Plugins bölümünden Locale plugin yükle Jenkins’in yeniden başlamasına izin ver.
- 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.
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.