6.1 HBase'i kim ve neden icat etti?

Bu derste, son zamanlarda büyük popülerlik kazanan Hbase gibi harika bir araçtan bahsedeceğiz: örneğin, Facebook onu mesajlaşma sisteminin temeli olarak kullanıyor ve bu şimdiden çok şey söylüyor.

Ders, Big Table kavramı ve ücretsiz uygulaması, çalışmanın özellikleri ve hem klasik ilişkisel veritabanlarından (MySQL ve Oracle gibi) hem de Redis, Aerospike ve memcached gibi anahtar/değer depolamalarından farkı hakkında konuşacaktır. Her zamanki gibi, sorunun geçmişiyle başlayalım. Diğer birçok BigData projesi gibi, Hbase de Google tarafından geliştirilen bir konseptten doğdu. Hbase'in arkasındaki ilkeler , Bigtable: Yapılandırılmış Veriler için Dağıtılmış Bir Depolama Sistemi makalesinde açıklanmıştır .

Önceki derslerde tartıştığımız gibi, sıradan dosyalar, MapReduce paradigması kullanılarak toplu veri işleme için oldukça uygundur. Öte yandan, dosyalarda saklanan bilgilerin güncellenmesi oldukça zahmetlidir; Dosyalar ayrıca rastgele erişim olasılığından da mahrumdur. Rastgele erişim ile hızlı ve rahat çalışma için, Aerospike, Redis, Couchbase, Memcached gibi anahtar-değer depolama gibi bir nosql sistemleri sınıfı vardır. Ancak bu sistemlerde toplu işleme genellikle çok zahmetlidir. Hbase, toplu işlemenin rahatlığını güncelleme ve rastgele erişim kolaylığıyla birleştirme girişimidir.

6.2 Veri modeli

HBase, dağıtılmış, sütun yönelimli, çok sürümlü bir anahtar/değer veritabanıdır.

  • Veriler, Hbase'de RowKey adlı bir birincil anahtar tarafından indekslenen tablolar halinde düzenlenir.
  • Her RowKey anahtarı için, sınırsız sayıda öznitelik (veya sütun) saklanabilir.
  • Sütunlar, Sütun Ailesi adı verilen sütun grupları halinde düzenlenir. Kural olarak, aynı kullanım ve depolama modeline sahip sütunlar tek bir Sütun Ailesi'nde birleştirilir.
  • Her özellik için birkaç farklı sürüm saklanabilir. Farklı sürümlerin farklı zaman damgası vardır.

Kayıtlar fiziksel olarak RowKey sıralama düzeninde depolanır. Bu durumda, farklı Sütun Ailesine karşılık gelen veriler ayrı olarak depolanır ve bu, gerekirse yalnızca istenen sütun ailesinden verilerin okunmasına izin verir.

Belirli bir öznitelik silindiğinde, fiziksel olarak hemen silinmez, yalnızca özel bir mezar taşı bayrağıyla işaretlenir. Verilerin fiziksel olarak silinmesi, daha sonra Ana Sıkıştırma işlemi gerçekleştirildiğinde gerçekleşir.

Aynı sütun grubuna ait olan ve aynı anahtara karşılık gelen nitelikler fiziksel olarak sıralanmış bir liste olarak saklanır. Her bir anahtar için herhangi bir öznitelik olmayabilir veya mevcut olabilir ve öznitelik yoksa bu, boş değerleri depolama ek yüküne neden olmaz.

Liste ve sütun grubu adları sabittir ve net bir düzene sahiptir. Sütun grubu düzeyinde, yaşama süresi (TTL) ve maksimum depolanan sürüm sayısı gibi parametreler ayarlanır. Belirli bir sürüm için zaman damgası ile geçerli saat arasındaki fark TTL'den büyükse, giriş silinmek üzere işaretlenir. Belirli bir öznitelik için sürüm sayısı maksimum sürüm sayısını aşarsa, kayıt ayrıca silinmek üzere işaretlenir.

Hbase veri modeli, bir anahtar/değer eşleşmesi olarak hatırlanabilir:

<table, RowKey, Column Family, Column, timestamp> -> Value

6.3 Desteklenen işlemler

hbase'de desteklenen işlemlerin listesi oldukça basittir. 4 ana işlem desteklenir:

  • Put : hbase'e yeni bir giriş ekleyin. Bu girişin zaman damgası elle ayarlanabilir, aksi takdirde otomatik olarak geçerli saate ayarlanır.
  • Get : Belirli bir RowKey için veri alın. Verileri alacağımız Sütun Ailesini ve okumak istediğimiz sürüm sayısını belirtebilirsiniz.
  • Tarama : kayıtları tek tek okuyun. Okumaya başlayacağımız kayıt, okunacak kayıt, okunacak kayıt sayısı, okuma yapılacak Sütun Ailesi ve her kayıt için maksimum sürüm sayısını belirleyebilirsiniz.
  • Sil : Silmek için belirli bir sürümü işaretleyin. Fiziksel silme olmayacak, bir sonraki Büyük Sıkıştırmaya kadar ertelenecek (aşağıya bakın).

6.4 Mimari

HBase, onlarca veya yüzlerce fiziksel sunucu üzerinde çalışabilen, bazıları arızalansa bile kesintisiz çalışmayı sağlayan dağıtık bir veritabanıdır. Bu nedenle HBase mimarisi, klasik ilişkisel veritabanlarına kıyasla oldukça karmaşıktır.

HBase, çalışması için iki ana süreç kullanır:

1. Bölge Sunucusu - Bir veya daha fazla bölgeye hizmet verir. Bir bölge, belirli bir ardışık RowKeys aralığına karşılık gelen bir kayıt aralığıdır. Her bölge şunları içerir:

  • Kalıcı Depolama , HBase'deki ana veri deposudur. Veriler fiziksel olarak HDFS'de özel bir HFile formatında saklanır. HFile'daki veriler RowKey sıralama düzeninde saklanır. Bir çift (bölge, sütun ailesi) en az bir HFIle'ye karşılık gelir.
  • MemStore - yazma arabelleği. Veriler HFile d'de sıralı düzende depolandığından, HFile'ı kayıt başına güncellemek oldukça pahalıdır. Bunun yerine, yazarken veriler, bir süre biriktiği özel bir MemStore bellek alanına girer. MemStore kritik bir değere kadar dolduğunda, veriler yeni bir HFile'a yazılır.
  • BlockCache - okumak için önbellek. Sıkça okunan verilerde zamandan önemli ölçüde tasarruf etmenizi sağlar.
  • İleri Günlüğü Yaz (WAL) . Veriler bellek deposuna yazıldığı için, bir çökme nedeniyle bir miktar veri kaybı riski vardır. Bunun olmasını önlemek için, manipülasyonların fiilen uygulanmasından önceki tüm işlemler özel bir günlük dosyasına kaydedilir. Bu, herhangi bir arızadan sonra verileri kurtarmanıza olanak tanır.

2. Ana Sunucu - HBase kümesindeki ana sunucu. Ana, Bölge Sunucuları arasında bölgelerin dağıtımını yönetir, bölgelerin kaydını tutar, düzenli görevlerin başlatılmasını yönetir ve diğer faydalı işleri yapar.

Hizmetler arasındaki eylemleri koordine etmek için HBase, yapılandırmaları yönetmek ve hizmetleri senkronize etmek için tasarlanmış özel bir hizmet olan Apache ZooKeeper'ı kullanır.

Bölgedeki veri miktarı arttığında ve belirli bir boyuta ulaştığında, Hbase, bölgeyi 2'ye bölen bir işlem olan bölme işlemini başlatır. Bölgelerin sürekli bölünmesini önlemek için, bölgelerin sınırlarını önceden ayarlayabilir ve maksimumlarını artırabilirsiniz. boyut.

Bir bölge için veriler birkaç HFile'da depolanabileceğinden, Hbase işi hızlandırmak için bunları periyodik olarak birleştirir. Bu işleme Hbase'de sıkıştırma denir. Sıkıştırmalar iki tiptir:

  • Küçük sıkıştırma Otomatik olarak başlar, arka planda çalışır. Diğer Hbase işlemlerine kıyasla düşük önceliğe sahiptir.
  • Büyük sıkıştırma Elle veya belirli tetikleyicilerin ortaya çıkması üzerine (örneğin, bir zamanlayıcı tarafından) başlatılır. Yüksek bir önceliğe sahiptir ve kümeyi önemli ölçüde yavaşlatabilir. Büyük Sıkıştırmalar en iyi küme üzerindeki yükün küçük olduğu bir zamanda yapılır. Major Compaction ayrıca önceden kaldırıldı olarak işaretlenmiş verileri fiziksel olarak siler.

6.5 HBase ile çalışmanın yolları

HBase Kabuğu

Hbase'i kullanmaya başlamanın en kolay yolu, hbase kabuk yardımcı programını kullanmaktır. Herhangi bir hbase küme düğümüne hbase yüklendikten hemen sonra kullanılabilir.

Hbase kabuğu, tüm temel Hbase işlemleri için yerleşik desteğe sahip bir jruby konsoludur. Aşağıda, iki sütun ailesinden oluşan bir users tablosu oluşturmaya, üzerinde bazı işlemler yapmaya ve tabloyu hbase kabuğunda en sona bırakmaya bir örnek verilmiştir:

create 'users', {NAME => 'user_profile', VERSIONS => 5}, {NAME => 'user_posts', VERSIONS => 1231231231} 
put 'users', 'id1', 'user_profile:name', 'alexander' 
put 'users', 'id1', 'user_profile:second_name', 'alexander' 
get 'users', 'id1' 
put 'users', 'id1', 'user_profile:second_name', 'kuznetsov' 
get 'users', 'id1' 
get 'users', 'id1', {COLUMN => 'user_profile:second_name', VERSIONS => 5} 
put 'users', 'id2', 'user_profile:name', 'vasiliy' 
put 'users', 'id2', 'user_profile:second_name', 'ivanov' 
scan 'users', {COLUMN => 'user_profile:second_name', VERSIONS => 5} 
delete 'users', 'id1', 'user_profile:second_name' 
get 'users', 'id1' 
disable 'users' 
drop 'users'

Yerel API

Hadoop ile ilgili diğer birçok proje gibi, hbase de java'da uygulanmaktadır, bu nedenle yerel api Java'da mevcuttur. Yerel API, resmi web sitesinde oldukça iyi belgelenmiştir. Buradan alınan Hbase API'sini kullanmanın bir örneğini burada bulabilirsiniz:

import java.io.IOException;

import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class MyLittleHBaseClient {
  public static void main(String[] args) throws IOException {
	Configuration config = HBaseConfiguration.create();
	Connection connection = ConnectionFactory.createConnection(config);
	try {
  	Table table = connection.getTable(TableName.valueOf("myLittleHBaseTable"));
  	try {
    	Put p = new Put(Bytes.toBytes("myLittleRow"));
    	p.add(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"),
    	Bytes.toBytes("Some Value"));
    	table.put(p);

    	Get g = new Get(Bytes.toBytes("myLittleRow"));
    	Result r = table.get(g);
    	byte [] value = r.getValue(Bytes.toBytes("myLittleFamily"),
      	Bytes.toBytes("someQualifier"));

    	String valueStr = Bytes.toString(value);
    	System.out.println("GET: " + valueStr);

    	Scan s = new Scan();
    	s.addColumn(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"));
    	ResultScanner scanner = table.getScanner(s);
    	try {
       	for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
         	System.out.println("Found row: " + rr);
       	}
     	} finally {
       	scanner.close();
     	}
   	} finally {
     	if (table != null) table.close();
   	}
 	} finally {
   	connection.close();
 	}
  }
}

Thrift, REST ve diğer programlama dilleri için destek

Hbase, diğer programlama dillerinden çalışmak için Thrift API ve Rest API sağlar. Bunlara dayanarak, istemciler tüm büyük programlama dilleri için oluşturulmuştur: python, PHP, Java Script, vb.

6.6 HBase ile çalışmanın bazı özellikleri

  1. Hbase, MapReduce ile kutudan çıkar çıkmaz entegre olur ve özel TableInputFormat ve TableOutputFormat kullanılarak girdi ve çıktı olarak kullanılabilir.

  2. Doğru RowKey'i seçmek çok önemlidir. RowKey, bölgeler arasında iyi bir eşit dağılım sağlamalıdır, aksi takdirde sistem kaynaklarının verimsiz kullanımına yol açan diğerlerinden çok daha sık kullanılan bölgeler olan "sıcak bölgeler" riski vardır.

  3. Veriler tek tek değil, hemen büyük gruplar halinde yükleniyorsa, Hbase, verileri tekli Koyma kullanmaktan çok daha hızlı yüklemenizi sağlayan özel bir BulkLoad mekanizmasını destekler. BulkLoad temelde iki adımlı bir işlemdir:

    • Özel bir MapReduce işi kullanarak yerleştirmelerin katılımı olmadan HFile oluşumu
    • Bu dosyaları doğrudan Hbase'e eklemek
  4. Hbase, metriklerinin Ganglia izleme sunucusuna gönderilmesini destekler. Bu, hbase sorunlarının temeline inmek için Hbase'i yönetirken çok yardımcı olabilir.

sıra anahtarı

RowKey, dünya çapında benzersiz olması için özel olarak oluşturulmuş bir dize olan bir GUID olan kullanıcı kimliğidir. GUID'ler eşit olarak dağıtılır, bu da verilerin sunucular arasında iyi bir şekilde dağıtılmasını sağlar.

Sütun Ailesi

Depolamamız iki sütun ailesi kullanır:

  • veri. Bu sütun grubu, bir kullanıcının belirli URL'leri ziyaret etmiş olması gibi artık reklam amaçlı olmayan verileri depolar. Bu Sütun Ailesi için TTL 2 aya ayarlanmıştır, sürüm sayısı sınırı 2000'dir.
  • uzun veri Bu sütun grubu, cinsiyet, doğum tarihi ve diğer "ebedi" kullanıcı özellikleri gibi zamanla alaka düzeyini kaybetmeyen verileri depolar.

hoparlörler

Her tür kullanıcı bilgisi ayrı bir sütunda saklanır. Örneğin, Data:_v sütunu, kullanıcının ziyaret ettiği URL'leri saklar ve LongData:gender sütunu, kullanıcının cinsiyetini saklar.

Bu gerçeğin zaman damgası, bir zaman damgası olarak saklanır. Örneğin, Data:_v sütunundaki zaman damgası, kullanıcının belirli bir URL'yi ziyaret ettiği zamandır.

Bu kullanıcı veri depolama yapısı, kullanım modelimize çok iyi uyuyor ve kullanıcı verilerini hızlı bir şekilde güncellemenize, kullanıcılar hakkında gerekli tüm bilgileri hızlı bir şekilde almanıza ve MapReduce kullanarak tüm kullanıcılar hakkındaki verileri bir kerede hızlı bir şekilde işlemenize olanak tanıyor.

6.7 Alternatifler

HBase'in yönetimi ve kullanımı oldukça karmaşıktır, bu nedenle HBase'i kullanmadan önce alternatiflere bakmak mantıklıdır:

  • İlişkisel Veritabanları . Özellikle verilerin bir makineye sığması durumunda çok iyi bir alternatif. Ayrıca birincil dizin dışındaki dizinlerin işlemlerinin önemli olduğu durumlarda öncelikle ilişkisel veritabanlarını düşünmelisiniz.

  • Anahtar/Değer depolama . Redis ve Aerospike gibi depolamalar, gecikme gerektiğinde ve toplu işlemenin daha az önemli olduğu durumlarda daha uygundur.

  • Dosyalar ve MapReduce ile işlenmesi . Veriler yalnızca eklenirse ve nadiren güncellenir/değiştirilirse, HBase'i kullanmamak, verileri dosyalarda depolamak daha iyidir. Dosyalarla çalışmayı basitleştirmek için Hive, Pig ve Impala gibi araçları kullanabilirsiniz.

HBase kullanımı şu durumlarda haklı çıkar:

  • Çok fazla veri var ve bunlar bir bilgisayara / sunucuya sığmıyor
  • Veriler sık ​​sık güncellenir ve silinir
  • Verilerde, diğer her şeyi bağlamanın uygun olduğu açık bir "anahtar" vardır.
  • Toplu işleme gerek
  • Belirli anahtarlarla verilere rasgele erişim gerekiyor