hbase

2015-01-27 20 views
8

'da nasıl ayrılabilir? 5 bölge sunucusuna sahip olan hbase'de veri saklıyorum. Satır anahtarım olarak md5 karma URL'si kullanıyorum. Şu anda tüm veriler sadece bir bölge sunucusunda depolanıyor. Bu yüzden, bölgeleri önceden bölerek verilerin tüm bölge sunucusunda düzgün bir şekilde hareket etmesini sağlayın, böylece veriler her bir bölge sunucusunda düzgün bir şekilde yer alacaktır. Verileri satırın ilk karakteri olarak bölmek istiyorum.İlk karakter 0'dan f'ye (16 karakter). 0'dan 3'e kadar başlayan satır tuşları gibi, 1. bölge sunucusunda, 2’de 3-6’da, 3’te 6-9’da, 4’te a-d’de, 5’te d-f’de. Nasıl yapabilirim ?hbase

cevap

8

Tabloyu oluştururken SPLITS özelliği sağlayabilirsiniz.

create 'tableName', 'cf1', {SPLITS => ['3','6','9','d']} 

4 bölme noktası 5 bölge oluşturacaktır.

HBase'nin DefaultLoadBalancer'un bölge yöneticileri arasında% 100 eşit dağıtımı garanti etmediğini lütfen unutmayın, bir bölge sunucusunun aynı tablodan birden çok bölgeye sahip olması olabilir. o this bakmak nasıl çalıştığı hakkında daha fazla bilgi için

:

public List<RegionPlan> balanceCluster(Map<ServerName,List<HRegionInfo>> clusterState) 

her sunucunun en yüklü bölgelere sunucu bilgileri belirtilen haritası göre küresel yük dengeleme planı oluşturun. yük dengeleme değişmezi, tüm sunucuların 1 bölgesi içinde olup, sunucu başına ortalama bölge sayısıdır. Ortalama bir tam sayı ise, tüm sunucular ortalamaya göre dengelenecektir. Aksi takdirde, tüm sunucularının taban (ortalama) veya tavan (ortalama) bölgeleri olacaktır. HBASE-3609 Modellenen bölgelerKava'nın her iki ucundan alabildiğimiz Guava'nın MinMaxPriorityQueue değerini kullanarak kullanın. Başlangıçta, , sadece Master tarafından keşfedilen boş bölge sunucusunun olup olmadığını kontrol ediyoruz. Eğer öyleyse, dönüşümlü olarak sırasıyla regionToMove baş/kuyruktan yeni/eski bölgeler seçiyoruz. Bu dönüşüm, yeni keşfedilen bölge sunucusunda genç bölgelerini kümelemekten kaçınıyor. Aksi takdirde, bölgelerDeğiştirme başlığından yeni bölgeler seçiyoruz. HBASE-3609'dan gelen bir başka gelişme de, bölgeler arası bölgelerdeki bölgelerden düşük olan sunucularına bölgeler atamamızdır. Önceden yüklenmiş bir sunucu , bir sonraki yetersiz sunucuya geçmeden önce, genç bölgelerin kümelenmesine yol açan doldurulacaktı. Son olarak, az yüklenen sunucuları rasgele bir şekilde, no'lu boşaltma bölgelerini dengeli bir şekilde, balanceCluster() çağrıları arasında eşit olarak alabilmeleri için karıştırıyoruz. Algoritma şu anda gibi uygulanan geçerli:

  1. her bir sunucu, MİN = kat (ortalama) ve MAX = tavan (ortalama) sahip olmalıdır bölgelerin iki geçerli numaralarını belirleyin.
  2. En çok yüklenen sunucuların sayısını azaltın ve her bir bölgeden bölgeleri ayırın, böylece her sunucu tam olarak MAX bölgelerine ev sahipliği yapar. Zaten < = MAX bölgeye sahip olan bir sunucuya ulaştığınızda durun. En yakın zamanda en fazla arasında hareket etmek için bölgelere sipariş verin.
  3. En az yüklenen sunucuları aşağı doğru ayırın, her sunucunun tam olarak MIN bölgelerine sahip olması için bölgeleri atayın. zaten> = MIN bölgelerine sahip bir sunucuya ulaştığınızda durun. Yüklenmemiş sunucularına atanan bölgeler, önceki adımda dökülen bölgelerdir. mümkün ise, yetersiz yüklenen her bir sunucusunu MIN olarak doldurmak için yeterli alan bulunmadığından emin olabilirsiniz. Eğer öyleyse, yapmak için gereken bir dizi bölgeye ihtiyacımız var. Ayrıca, her 'u az yüklenen ancak aşırı yüklenen sunuculardan atanmamış bölgelerle doldurabildiğimiz, ancak yine de atamamıza sahip olmadığımız da mümkündür. Bu koşulların hiçbiri tutmuyorsa (yetersiz yüklenmiş sunucularını doldurmak için bölge gerekmez, aşırı yüklü sunuculardan hiçbir bölge kalmaz), işimiz biter ve iade edilir. Aksi takdirde bu davaları aşağıda ele alırız.
  4. GerekirseRegions sıfır değil (hala az yüklenmiş sunuculara sahip), en çok yüklenen sunucuları yineliyoruz, tek bir sunucuyu her biri atıyor (bu da MAX bölgelerinin MIN bölgelerine sahip olmasını sağlıyor).
  5. Artık bir önceki adımdan veya aşırı yüklenmiş sunucularından orijinal dökülmeden, atama gerektiren daha fazla bölgeye sahibiz. En az yüklenen sunucuları her bir MIN değerine kadar doldurun. hala atamaya ihtiyaç duyan daha fazla bölgeye sahipse, en az yüklenen sunucuları yineleyin, bu sefer bitene kadar her birini (MAX'a kadar doldurun) verin.
  6. Tüm sunucular artık MIN veya MAX bölgelerini barındıracak. Ayrıca,> = MAX bölgelerini barındıran herhangi bir sunucunun, dengelemenin sonunda MAX bölgeleriyle sonuçlanması garanti edilir. Bu, mümkün olan en az bölgelerinin taşınmasını sağlar.

YAPILACAK: Biz en az-onlar gibi en yüklü rapor kaç olması uzak bir belirli sunucudan bölgelerin sayısını yeniden atama can. biz tüm atamaları hafızaya almalı mıyız? Herhangi bir itiraz? Bu, 'un HMaster üzerinde HeapSize'ye ihtiyaç duyduğumuz anlamına mı geliyor? Ya da sadece dikkatli bir monitör? Eğer tüm veriler kaydedilmiş olduğu varsa, ben sadece elle hbase shell kullanarak başka bölge sunucularına bazı bölgeleri taşımak tavsiye

+0

Ancak tablo oluştururken önceden bölünecekse, her biri farklı bölge sunucusunda 5 bölge oluşturacağı garanti edilir. sağ ? –

+1

5 bölge oluşturacak, ancak LoadBalancer onları her bir bölge sunucusunun yüküne (atanan bölge sayısı) göre atayacaktır, bir bölge sunucusunun iki bölgeyi veya hatta 3 olmasını sağlayabilirsiniz. Her neyse, çok fazla uğraşmayacağım bununla ilgili olarak, gerek duyduğunuz bölgeleri bölgeler arasında manuel olarak taşıyabilirsiniz (ancak gerektiğinde LoadBalancer bunu geçersiz kılabilir) veya özel bir yük dengeleyici uygulayabilir. IMHO, 5 yerine 10 bölge oluşturacağım ve DefaultLoadBalancer'ın her zamanki gibi çalışmasına izin vereceğim. –

4

(şimdiki düşünme biz bellekte tüm atamaları yapacak olan).

hbase> move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’ 

hareket bir bölge. İsteğe bağlı olarak hedef bölge sunucusu belirtin, birini rasgele seçelim. NOT: Kodlanmış bölge adını geçirirsiniz, bölge adını değil, bu komut diğerlerinden biraz farklıdır. Kodlanan bölge adı, bölge adlarına ait karma son ekidir: örn. Bölge adı, TestTable, 0094429456,1289497600452.527db22f95c8a9e0116f0cc13c680396 idi. kodlanmış bölge adı kısmı 527db22f95c8a9e0116f0cc13c680396 Sunucu adı, ana bilgisayar bağlantı noktası artı başlangıç ​​kodudur. Örneğin: host187.example.com, durumda 60020,1289493121758

0

Eğer Hbase tablolar oluşturmak için Apache Phoenix kullanırken, CREATE deyiminde SALT_BUCKETS belirtebilirsiniz. Tablo, söz konusu kova kadar çok bölgeye ayrılacaktır. Phoenix, satır anahtarının Hash değerini (büyük olasılıkla sayısal bir karma% SALT_BUCKETS) hesaplar ve sütun hücresini uygun bölgeye atar.

CREATE TABLE IF NOT EXISTS us_population (
     state CHAR(2) NOT NULL, 
     city VARCHAR NOT NULL, 
     population BIGINT 
     CONSTRAINT my_pk PRIMARY KEY (state, city)) SALT_BUCKETS=3; 

Bu Alternatif 3 bölgelerde

içine tabloyu önceden bölecek, HBase varsayılan UI, buna göre bölgelere bölünmüş sağlar. enter image description here