2013-08-29 15 views
6

Cassandra 1.2.8'e 50.000 sütun içeren tek bir satır eklemek istiyorum. takmadan önce, (bellekte) gitmek için tüm satırın tüm veriler hazır:Cassandra ve CQL3'ü kullanarak, bir geniş satırı tek bir istekte nasıl eklersiniz?

+---------+------+------+------+------+-------+ 
|   | 0 | 1 | 2 | ... | 49999 | 
| row_id +------+------+------+------+-------+ 
|   | text | text | text | ... | text | 
+---------+------+------+------|------+-------+ 

sütun adları tam sayılardır, sayfalandırmada dilimleme sağlıyor. Sütun değerleri, söz konusu dizindeki bir değerdir.

CQL3 tablo tanımı: Zaten ROW_ID bellekte tüm 50,000 ad/değer çiftlerini var gibi, ben sadece bu yüzden/operasyon tek bir istekle Cassandra içine tek bir satır eklemek istediğiniz

create table results (
    row_id text, 
    index int, 
    value text, 
    primary key (row_id, index) 
) 
with compact storage; 

mümkün olduğunca hızlı.

INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?); 

ilk ? olan bir dizin sayacı (i) ve ikinci ? olan en saklamak için metin değeri olan:

ı bulmak gibi tek şey aşağıdaki 50.000 kez yürütmek yapmaktır konum i.

Bu çok zaman alıyor. Yukarıdaki INSERT'leri bir partiye koyduğumuzda bile çok zaman alır.

İhtiyacımız olan tüm verileri (tüm satır) eksiksiz olarak ele alalım, sadece "burada, Cassandra, bu verileri tek bir istek olarak tek bir satırda saklayın" demek çok kolay olurdu. :

//EXAMPLE-BUT-INVALID CQL3 SYNTAX: 
insert into results (row_id, (index,value)) values 
    ((0,text0), (1,text1), (2,text2), ..., (N,textN)); 

Bu örnek geçerli CQL3 sözdizimi yoluyla mümkün değildir, ama istenen etkiyi göstermektedir umut: her şey tek sorgu olarak takılmış olacaktır.

Bunu CQL3 ve DataStax Java Sürücüsü'nde yapmak mümkün müdür? Aksi takdirde, bunun yerine Hector veya Astyanax sürücüsünü ve Thrift batch_insert işlemini kullanmaya mecbur kalacağımı mı düşünüyorsunuz?

+0

Eğer listeleri/setleri/haritaları kullanarak denediniz mi daha kolay ve daha hızlı olacak. Bu durumda hile yapmalı ama Alex'in dediği gibi, CQL3'e ilginç bir ekleme yapacaktı. – jorgebg

+0

Evet, denedik ve oldukça hızlıydı, ancak istenen veri modelini tamamen kırdı: CQL3 koleksiyonlarında dilim sorguları yapamazsınız. –

cevap

3

Düzenleme: Cassandra'yı 1.2.9 ilişkin bu soru haberi sadece 4 gün sonra, nihai Cassandra 2.0 serbest bırakıldı. 2.0, 'un'un C * < 2.0 için kullanılması gereken, kümelenmemiş CQL3'ten çok daha hızlı olması gereken toplu hazırlanmış ifadeleri destekler.Emin olmak için henüz test etmedik.

Bu soru, 30 Ağustos 2013 tarihinde 4 gün önce yayınlandığında, C * 3'ün C * sürümlerinde 2.0'dan küçük olması mümkün olmadı. Sadece bir Thrift istemcisi aracılığıyla, ör. Astyanax'in MutationBatch.

Alex'in önerisi uyarınca, bir özellik isteği olarak CASSANDRA-5959'u oluşturdum, ancak C * 2.0 için sorunu çözdüğü varsayılan bir CASSANDRA-4693 kopyası olarak işaretlendi.

+3

teşekkürler Les. Bu noktada, java sürücüsünün bir sınırlama olarak kabul edilebileceğini kabul ederken, aslında daha çok bir CQL sınırlaması olduğunu düşünüyorum. Umarım Cassandra adamlar kabul eder ve ekleyecektir. –

+0

Buna ek olarak #cassandra kanalında thobbs ile sohbet ettim. Bir bölüme gönderilen tıkanmamış grupların tek bir işlem olarak gerçekleştirildiğini, bu şekilde oldukça verimli sorgular elde edilebileceğini söyledi. Öneri, bir düğüm üzerinde çok fazla yığın baskısı yapmaktan kaçınmak için ~ 1k'lik boyutlarda toplu işlem yapmaktı. –

2
  1. CQL3 INSERT bildirimi, çoklu değer tuples'ını desteklemez. Ama bunun CQL'ye ilginç bir ekleme yapabildiğini düşünüyorum, bu yüzden lütfen submit a feature request.

  2. DataStax Java sürücüsü CQL'ye dayanmaktadır, bu nedenle ifade desteklenmezse yapabileceği bir şey vardır. Bu en iyi seçenek bir Thrift tabanlı kitaplığı ( nb kullanmak olacaktır gerekiyorsa an için

  3. : Ben mümkün olacağını bu insert onaylamak için Thrift tabanlı bir API ile çok aşina değilim ama Ben

+0

Sadece bir güncelleme - bu Thrift ile kesinlikle mümkündür. Yerel bir makine üzerindeki Datastax Java Sürücüsü ve bir CQL3 grubu (gerçek "Batch" API'sini kullanarak) 1.5 dakika sürdü. Astyanax ile aynı işlem (bir [MutationBatch] aracılığıyla (http://netflix.github.io/astyanax/javadoc/com/netflix/astyanax/MutationBatch.html) aka “batch_mutate”) 235 _milliseconds_ aldı. Bu, projemizdeki Datastax Java Sürücüsü için iyi bir şey değil. Açıkça ifade edilen bir vatandaş olduğum söyleniyor, bu yüzden bir özellik isteğini açacağım. –

+0

@Les Hazlewood, gerçek Banyo API'sı ile o kadar kötüdür, çünkü düz metin sorgusudur (böylelikle metin ayrıştırıcıdır). Hazırlanan deyimi kullanarak toplu API'yi test etme fırsatınız varsa, sonuçlara sahip olmakla ilgilenirim. CQL3 perf ve Thrift – doanduyhai

+0

hakkında büyük bir tartışma vardı Test ettiğimizde sonuçları yayınlamayı hatırlarım, kesinlikle yapacağım! –

3

Çoklu insert/update mutasyon çoklu haritaların yararlanarak, Thrift apı'lerindeki batch_mutate yöntemi kullanılarak yapılabilir) olması gerektiği düşünüyorum.

Map<byte[], Map<String, List<Mutation>>> mutationMap = new HashMap<byte[], Map<String, List<Mutation>>>(); 

List<Mutation> mutationList = new ArrayList<Mutation>(); 

mutationList.add(mutation); 
Map<String, List<Mutation>> m = new HashMap<String, List<Mutation>>(); 

m.put(columnFamily, mutationList); 

mutationMap.put(key, m); 
client.batch_mutate(mutationMap, ConsistencyLevel.ALL); 
+0

soru nasıl CQL 3 thrift – Adrian

0

Birden çok insert yapmak istiyorsanız CQL3'te Batch deyimini kullanın. Onlar toplu hazırlanmış deyimi sağlamadan beri C * 2.0 ile

, bu

+0

Orijinal yazımda,

+0

Tamamen size katılıyorum Les Hazlewood. Neyse ki C * 2.0 şimdi piyasaya sürüldü, böylece onunla devam edebilirsiniz :) – doanduyhai

+0

Cassandra 2.0 ile hazırlanmış toplu ifadeleri denedim ve hala acı verici bir şekilde yavaş. http://stackoverflow.com/questions/21778671/how-to-insert-a-wide-row-with-good-performance-using-cql –

İlgili konular