Impala’da tablonun dosya formatı konusu Hive kadar gelişmiş değildir. En stabil olarak çalışabileceğiniz dosya formatı Parquet formatıdır. Öncelikle dosya formatlarına bir göz atalım. Hive konusunu okuduysanız bunları biliyorsunuzdur; ama direk Impala’yı okumaya başladığınızı düşünerek bir tekrar yapacağım ve ardından bunların Impala üzerindeki kullanımlarından bahsedeceğim.
SequenceFile
Verileri anahtar / değer çiftleri olarak saklar. SequenceFiles içinde saklanan kayıtlar için üç format vardır:
-
- Uncompressed
Çoğunlukla, sıkıştırılmamış SequenceFile, girdi / çıktı (I/O) için daha az verimli olduklarından ve disk üzerinde sıkıştırılmış biçimdeki aynı verilerden daha fazla yer kapladığından, sıkıştırılmış alternatiflerine göre hiçbir avantaj sağlamaz.
-
- RecordCompressed
Bu format dosyaya eklenen her bir kayıt bazında sıkıştırma yapar.
-
- BlockCompressed
Bu format, her kayıt eklendiğinde sıkıştırma yapmaz, verilerin sıkıştırılacak blok boyutuna ulaşmasını bekler. Blok sıkıştırma, Uncompressed SequenceFile ile karşılaştırıldığında daha iyi sıkıştırma oranları sağlar ve genellikle SequenceFile için tercih edilen sıkıştırma seçeneğidir. Ayrıca, burada bloklanacak referansın HDFS veya dosya sistemi bloğu ile ilgisi yoktur. Blok sıkıştırmasındaki bir blok, tek bir HDFS bloğunda birlikte sıkıştırılmış bir kayıt grubunu belirtir.
Biçimden bağımsız olarak, her SequenceFile, kullanılan sıkıştırma kod çözücüsü, anahtar ve değer sınıfı adları, kullanıcı tanımlı meta veriler ve rastgele oluşturulmuş bir işaretleyici gibi, dosya hakkında temel meta veriler içeren ortak bir üstbilgi biçimi kullanır. Bu senkronizasyon işaretçisi, ayrıca dosyada rastgele noktaların aranmasına izin vermek için dosyanın gövdesine yazılır ve ayrılabilirliği kolaylaştırmanın anahtarıdır. Örneğin, blok sıkıştırması durumunda, bu senkronizasyon işaretleyici dosyadaki her bloktan önce yazılacaktır.
SequenceFile, Hadoop ekosisteminde iyi bir şekilde desteklenir, ancak ekosistem dışındaki destekleri sınırlıdır. Onlar da sadece Java’da desteklenir. SequenceFile’ın yaygın kullanımı genelde küçük dosyalara bir kapsayıcı olması içindir. Hadoop’ta çok sayıda küçük dosyayı saklamak birkaç soruna neden olabilir.
Bunlaran biri, NameNode için aşırı bellek kullanımıdır, çünkü HDFS’de depolanan her dosya için meta veriler bellekte tutulur. Bir başka potansiyel sorun da bu dosyalardaki verileri işlemektir, birçok küçük dosya birçok işlem görevine yol açarak işlemlerde aşırı kaynak tüketimine neden olabilir. Hadoop büyük dosyalar için optimize edildiğinden, daha küçük dosyaları bir SequenceFile içinde paketlemek, bu dosyaların depolanmasını ve işlenmesini çok daha verimli hale getirir.
Avro
Avro belki de dört formattan en basitidir, çünkü sütun bazlı değildir ve ilişkisel veritabanlarındaki gibi satır bazlı saklar. Avro’nun ana amacı, verileri sıkıştırmak ve bunu şema esnekliğini kaybetmeden yapabilmektir. Örneğin, Hadoop’u belge deposu olarak kullanmak ve tüm verilerinizi JSON olarak sıkıştırmak için Avro dosyalarında tutmak isteyebilirsiniz. Çalışmak istediğiniz bazı karmaşık şemalara sahip olabilirsiniz ve tümü Avro ile de çalışabilir. Avro’nun esnekliği, istediğiniz sayıda şema çalışmanıza ve hala düzgün bir sıkıştırma elde etmenize olanak sağlar.
Bir başka pozitif yanı ise Avro dosyaları dinamik olarak yazılmıştır. Bu, şema esnekliğine ve RPC desteğine izin verir. Bununla birlikte Avro, veri sıkıştırma için mükemmel bir formattır ve Spark’taki çoğu sıkıştırma tekniği için varsayılan olacaktır.
Olumlu yanlarından sonra olumsuzluklarına bakacak olursak, Avro diğerlerden daha maliyetlidir. Örneğin, bir sütun bazlı formata kıyasla mümkün olan en iyi sıkıştırmayı elde edemezsiniz. Ayrıca, tüm veri formatları, sorgular için satır bazlı geçişe ihtiyaç duyacaktır. Şema esnekliği, diskte daha fazla yer tutmasından daha önemli ise bu durum çok fazla bir sorun olmayabilir elbette.
Parquet
Parquet, Avro’dan farklı bir amaca sahiptir. Maksimum şema esnekliğine izin vermek yerine, sorgu hızlarını artırmak ve disk i/o’sunu azaltmak için kullanabileceğiniz şema türlerini optimize etmeye çalışır. Parquet, sütunlarda iç içe tiplere izin vererek geleneksel sütun bazlı tutmanın bazı zayıflıklarının üstesinden gelmeye çalışır. Böylece teknik olarak bir dizi olan bir sütuna ya da aslında birkaç sütun olan bir sütuna sahip olabilirsiniz.
Parquet, çok sayıda düşük seviye optimizasyona ve belgelerde bulabileceğiniz diskte nasıl depolandığı ile ilgili bir dizi ayrıntıya sahiptir. Parquet belki de Spark ile ilgili birçok projede göreceğiniz en yaygın dosya formatıdır ve ben de kullanma eğilimindeyim.
ORC (Optimized Row Columnar)
ORC, Parquet’nin sütun biçimini paylaşır ancak bazı farklılıklar vardır. Başlıca farklılıklardan biri iç içe geçen veri türlerine izin veren listeler ve haritalar gibi karmaşık türleri destekler. Sıkıştırma söz konusu olduğunda, ORC’nin verileri Parquet’den daha verimli bir şekilde sıkıştırdığı söylenir, ancak bu verilerinizin nasıl yapılandırıldığına bağlıdır.
Sıkıştırma algoritması olarak ZLib ve Snappy desteği vardır. Elbette kullanım zorunluluğu yoktur.
Parquet’de desteklenen özelliklerin yanı sıra, ORC ayrıca ACID işlem garantilerini de destekler. ACID’den yararlanabilecek uygulamaların sayısı düşünüldüğünde çok önemlidir. ACID işlemlerinin sadece veri biçiminde eklenmesi biraz karmaşıktır.
Presto veya Athena kullanıyorsanız, ORC tercih edilen formattır. Presto engine’in de yapılan son değişikliklerle, ORC kullanımının birçok avantajı oluyor. Ek olarak, ORC stream verilerini işleyebilen birkaç sütun formatından biridir. ORC ayrıca client tarafında önbelleğe almayı da destekler ve bu da son derece değerli olabilir.
Her türlü OLAP iş yükü için ORC gerçekten çok iyidir.
RC File
RCFile formatı özellikle MapReduce uygulamaları için performanslı işlem yapabilmeyi desteklemek için geliştirilmiştir, ancak pratikte yalnızca Hive için depolama biçimi olarak kullanıldığı görülür. RCFile formatı hızlı veri yükleme, hızlı sorgu işleme ve yüksek verimli depolama alanı kullanımı sağlamak için geliştirilmiştir. RCFile formatı dosyaları satır bölmelerine böler, sonra her bölmede sütun odaklı depolama kullanır.
Her ne kadar RCFile formatı, SequenceFiles ile karşılaştırıldığında sorgu ve sıkıştırma performansı açısından avantajları olsa da, sorgu süreleri ve sıkıştırma için en uygun performansı önleyen bazı eksikliklere de sahiptir. ORC ve Parquet gibi daha yeni sütun biçimleri bu eksikliklerin çoğunu giderir ve çoğu yeni uygulama için muhtemelen RCFile kullanımının yerini alacaktır. RCFile, Hive depolama alanında kullanılan oldukça yaygın bir formattır.
Dosya Formatlarının Impala Üzerinde Kullanımı
Parquet formatı Impala kullanımında göreceğiniz muhtemelen tek dosya formatı olacaktır. Sıkıştırma kodeklerinde Snappy ve Gzip’i destekler. Tablo oluştururken Parquet formatında oluşturabilir, insert veya load data gibi komutlarla veri yüklemesini yapabilirsiniz.
ORC formatı Impala 2.12 sürümünden beri desteklenmektedir. Sıkıştırma kodeklerinde Snappy, Gzip, LZO ve LZ4’ü destekler. Tablo oluştururken bu formatı kullanabilirsiniz; fakat insert, load data gibi komutlarla veri yükleme imkanınız yok. Eğer bu formatı kullanacaksanız öncelikle Hive üzerinde verileri yükleyip, sonrasında REFRESH komutu ile Impala’nın verileri görmesini sağlayabilirsiniz.
Text formatı kullanılabilir formatlardan bir diğeridir. Sıkıştırma kodeklerinde Snappy, Gzip, LZO ve Bzip2 desteği vardır. Tablo oluştururken bu formatı kullanabilirsiniz; fakat Stored As ifadesi kullanılmaz, özellikle belirtmediyseniz default olarak text formatında yaratılır tablo. Sıkıştırma kodeki olarak LZO kullanmayı planlıyorsanız, Impala üzerinde tabloyu oluşturamazsınız, öncelikle Hive’da tablo oluşturulur ve veriler yüklenir. Sonrasında Impala tarafından kullanılabilir hale gelebilir.
Avro formatı da ORC’ye benzerdir. Tabloyu Impala 1.4 versiyonundan beri desteklemektedir. Fakat veri yükleme gibi işlemleri yine Hive üzerinden yapmanız gerekir. Sıkıştırma kodeklerinden Snappy, Gzip ve Deflate’i desteklemektedir.
RCFile ve Sequence File’da Impala üzerinde tablo create ederken kullanılabilir olmasına rağmen verileri yüklemek için Hive kullanmak zorundayız. . Sıkıştırma kodeklerinden Snappy, Gzip, Bzip2 ve Deflate’i desteklemektedir.
Göreceğiniz gibi Impala üzerinde koşan bir yapı tasarlayacaksanız Parquet dışında pek fazla bir seçeneğiniz yok, ancak Hive ile etkileşimli olarak bunu yapabilirsiniz.