Sqoop Nedir?
Apache Sqoop, ilişkisel veri tabanları ile hadoop arasında büyük verilerin aktarımını sağlayan java tabanlı bir yazılımdır. Her iki yönde aktarım yapabilmektedir. Veriyi ilişkisel veri tabanından okuyup (Oracle, MySQL, SQL Server, Postgres, Teradata vs) hadoop dağıtık dosya sistemine (HDFS, Hive, Hbase …) aktarabildiği gibi hadoop ortamından okuyup ilişkisel veri tabanlarına da yazılabilmesini sağlar.
Sqoop, “SQL’den Hadoop’a ve Hadoop’tan SQL’e” anlamına gelir ve Cloudera tarafından geliştirilmiştir.
Sqoop’un avantajı ise veri aktarım işlemlerini MapReduce görevleri ile paralel olarak yaparak aktarımı çok daha hızlı tamamlamak. Ayrıca MySQL ve PostgreSQL için JDBC kullanmadan (mysqldump gibi) daha düşük seviyeli ve performanslı veri aktarımı da yapılabiliyor.
İmport işlemi sırasında Sqoop basitçe meta verilerden faydalanarak tablonun birincil anahtarını bulup minimum ve maksimum değerlerini alarak eşit olarak Map sayısına uygun olarak bölerek farklı düğümler üzerinde bu verileri paralel olarak aktarır. Bu yüzden sonuç klasör içinde birden fazla dosyaya yazılır. Aktarım sırasında veritabanına yeni kayıt geliyorsa bunlar aktarılmayabilir, veri tutarlılığına dikkat etmek gerekir.
Export işlemi sırasında ise aksi belirtilmediği sürece verileri binerli gruplar halinde veritabanına INSERT ediyor. Bu işlem de paralel olarak yapıldığı için aktarım sırasında veritabanında yük oluşturabilir. Her bir grubun yazılması kendi başına bir transaction olduğu için burada da veri tutarlılığına dikkat etmek gerekir. Eğer kayıtların tamamı aktarıldıktan sonra aktif olması isteniyorsa ara tablo kullanımını sağlayan –staging-table parametresi kullanılabilir. Bu tablonun yaratılması ve temizlenmesi de otomatik yapılmaz, elle yapmak gerekir.
Hadoop geliştiricisi için asıl olay veriler HDFS’ye yüklendikten sonra başlar. HDFS’de depolanan verilerde gizlenmiş çeşitli ön görüler elde etmek için bu veriler etrafında işlemler yapılır.
Bu nedenle, bu analiz için ilişkisel veri tabanı yönetim sistemlerinde bulunan verilerin HDFS’ye aktarılması gerekir. İlişkisel veritabanından HDFS’ye veri almak ve vermek için MapReduce kodunu yazma görevi çok ilgi çekici değildir ve sıkıcıdır. Apache Sqoop’un kurtarmaya geldiği ve acılarını dindirdiği yer burasıdır. Verileri içe ve dışa aktarma sürecini otomatikleştirir.
Sqoop, verileri içe ve dışa aktarmak için CLI sağlayarak geliştiricilerin hayatını kolaylaştırır. Sadece veritabanı kimlik doğrulaması, kaynak, hedef, işlemler vb. gibi temel bilgileri sağlamaları gerekir. Geri kalan kısmı o halleder.
Sqoop, komutu dahili olarak, daha sonra HDFS üzerinden yürütülen MapReduce görevlerine dönüştürür. Paralellik üzerinde hata toleransı sağlayan verileri içe ve dışa aktarmak için YARN çerçevesini kullanır.
Sqoop Özellikleri
- Sağlamlık: Apache Sqoop doğası gereği oldukça sağlamdır. Topluluk desteği ve katkısı vardır ve kolayca kullanılabilir.
- Tam Yük: Sqoop kullanarak, tek bir Sqoop komutuyla tüm tabloyu yükleyebiliriz. Sqoop ayrıca tek bir Sqoop komutu kullanarak veritabanındaki tüm tabloları yüklememizi sağlar.
- Artımlı Yük: Sqoop, artımlı yük işlevselliğini destekler. Sqoop’u kullanarak, güncellendiğinde tablonun bölümlerini yükleyebiliriz.
- Paralel içe/dışa aktarma: Apache Sqoop, verileri içe ve dışa aktarmak için YARN çerçevesini kullanır. Bu, paralelliğin üstünde hata toleransı sağlar.
- SQL sorgusunun sonuçlarını içe aktarın: Sqoop, SQL sorgusundan döndürülen sonucu Hadoop Dağıtılmış Dosya Sistemine içe aktarmamıza da izin verir.
- Sıkıştırma: -compress argümanı ile deflate(gzip) algoritmasını kullanarak veya –compression-codec argümanını belirterek verilerimizi sıkıştırabiliriz. Apache Hive’a sıkıştırılmış bir tablo yükleyebiliriz.
- Tüm önemli RDBMS Veritabanları için konnektörler: Sqoop, çeşitli RDBMS veritabanları için neredeyse tüm ekosistemi kapsayan konnektörler sağlar.
- Kerberos Güvenlik Entegrasyonu: Temel olarak Kerberos, güvenli olmayan ağ üzerinden iletişim kuran düğümlerin kimliklerini birbirlerine kanıtlamalarına izin vermek için ticketlar temelinde çalışan bilgisayar ağı kimlik doğrulama protokolüdür. Apache Sqoop, Kerberos kimlik doğrulamasını destekler.
- Verileri doğrudan HIVE/HBase’e yükleyin: Sqoop’u kullanarak, veri analizi için verileri doğrudan Hive’a yükleyebiliriz. Verilerimizi HBase yani NoSQL veritabanına da dump edebiliriz.
- Accumulo Desteği: Apache Sqoop’a bir tabloyu HDFS’deki bir dizine almak yerine Accumulo’ya alması talimatını verebiliriz.
Sqoop’un Sınırlamaları
- Apache Sqoop’u duraklatamaz ya da devam ettiremeyiz. atomik bir adımdır.
- Sqoop Export’un performansı, RDBMS sunucusunun donanım ya da config yapılandırmasına bağlıdır.
- Sqoop MapReduce paradigmasını kullanır.
- İmport ya da export sırasındaki problemler için özel işlem gerektirir.
- Her rdbms konnektörü aynı değildir , bazı veritabanları için daha bulk işlemler sağlar.
Sqoop Argümanları
Argüman | Açıklama |
---|---|
--append | Import edilen veriyi HDFS’deki mevcut veriye ekler |
--as-avrodatafile | Veriyi Avro Data Files olarak import eder |
--as-sequencefile | Veriyi SequenceFiles olarak import eder |
--as-textfile | Veriyi plain text olarak import eder. Varsayılan format budur. |
--as-parquetfile | Veriyi Parquet Files olarak import eder |
--boundary-query <statement> | Sorguya kullanıcı tarafından konan sınırdır. |
--columns <col,col,col…> | Tablonun hangi sütunlarını seçeceğimizi bildiririz. |
--delete-target-dir | Eğer hedefte böyle bir dizin varsa onu siler. |
--direct | Veri tabanı için varsa doğrudan bağlantı kullanır. |
--fetch-size <n> | Çağrılacak satır sayısına sınır koyulur. 50 satır getir gibi. |
--inline-lob-limit <n> | Bir satırda bulunacak maksimum LOB genişliği. |
-m,--num-mappers <n> | Kaç tane paralel map görevinin paralel çalışacağını belirten rakamdır. |
-e,--query <statement> | Import the results of statement . |
--split-by <column-name> | Tablonun hangi sütun baz alınarak bölüneceğini belirtir. --autoreset-to-one-mapper ile aynı anda kullanılamaz. |
--autoreset-to-one-mapper | Eğer tabloda primary key yok ise ve bölünecek sütun da belirtilmemişse tek bir mapper kullanılır. Aynı anda --split-by <col> seçeneği ile kullanılamaz. |
--table <table-name> | Okunmak istenen hedef tablonun ismi |
--target-dir <dir> | Hedef HDFS dizini |
--warehouse-dir <dir> | HDFS parent for table destination |
--where <where clause> | Eğer import esnasında WHERE koşulu kullanmak istiyorsak. |
-z,--compress | Sıkıştırmayı açmak istiyorsak |
--compression-codec <c> | Hadoop codec kullanımı (varsayılan gzip) |
--null-string <null-string> | Sütun string ise ve null ise bunun yerine yazılacak string. Örneğin null geldininde “Boş” yazılmasını istersek. |
--null-non-string <null-string> | Sütun string değil ise null değerler için alacak değer |
Örnekler;
Mysql sunucusundaki personeller veritabanındaki tabloları listeleyelim.
sqoop list-tables --connect jdbc:mysql://MYSQLDBADRESINIZ:3306/personel --username ayhanarda -P
Enter password:
23/03/15 19:59:31 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
departmanlar
departman_calisanlari
departman_yoneticileri
calisanlar
unvanlar
maaslar
Çalışanlar tablosunu HDFS üzerine aktaralım.
sqoop import --connect jdbc:mysql://MYSQLDBADRESINIZ:3306/personel --username ayhanarda -P --table calisanlar
Personel veritabanını direkt Hive a alalım.
sqoop import-all-tables --connect jdbc:mysql://MYSQLDBADRESINIZ:3306/personel --username ayhanarda -P --direct --hive-import
Bu aktarım işlemini –direct parametresi ile de yapabilirdik.Bu durumda jdbc konnektörü yerine mysql dump kullanırdı ve süre değişirdi.
Sqoop ile tablonun tamamını da aktarmak zorunda değiliz, -query parametresi ile sadece verdiğimiz sorgu sonucunun aktarılmasını sağlayabiliriz. Bunun dışında varsayılan olarak metin dosyası haline aktarılan verilerin alan ve satır ayraçlarını belirleyebiliriz, metin dosyaları dışında Hadoop’un binary formatı olan SequenceFile veya Avro formatında da veriler aktarılabiliriz.
Apache Sqoop Kullanıcı Rehberine erişmek için tıklayınız.
Cloudera Sqoop Rehberine erişmek için tıklayınız.
Ayhan ARDA
Bir yanıt yazın