2013-05-21 5 views
1

Je suis par expérience un programmeur RDBMS. Je travaille sur un problème de recherche scientifique impliquant des données génomiques. J'ai été chargé d'explorer Cassandra car nous avions besoin d'une solution Big Data, évolutive et bon marché (gratuite). Mettre en place Cassandra et le charger avec des données était séduisante trivial et similaire à mon expérience avec les bases de données traditionnelles comme Oracle et MySQL. Mon problème est de trouver une stratégie simple pour interroger les données, car c'est une exigence fondamentale pour tous les référentiels de données. Les données que je travaille sont des ensembles de données de mutation qui contiennent des informations de position ainsi que des mesures numériques calculées concernant les données. Je mis en place une famille de colonne statique initiale qui ressemble à ceci:Interrogation de grands ensembles de données dans Cassandra

CREATE TABLE variant (
chrom text, 
pos int, 
ref text, 
alt text, 
aa text, 
ac int, 
af float, 
afr_af text, 
amr_af text, 
an int, 
asn_af text, 
avgpost text, 
erate text, 
eur_af text, 
ldaf text, 
mutation_id text, 
patient_id int, 
rsq text, 
snpsource text, 
theta text, 
vt text, 
PRIMARY KEY (chrom, pos, ref, alt) 
) WITH 
bloom_filter_fp_chance=0.010000 AND 
caching='KEYS_ONLY' AND 
comment='' AND 
dclocal_read_repair_chance=0.000000 AND 
gc_grace_seconds=864000 AND 
read_repair_chance=0.100000 AND 
replicate_on_write='true' AND 
populate_io_cache_on_flush='false' AND 
compaction={'class': 'SizeTieredCompactionStrategy'} AND 
compression={'sstable_compression': 'SnappyCompressor'}; 

CREATE INDEX af_variant_idx ON variant (af); 

Comme vous pouvez le voir il y a une clé primaire naturelle des données de position (chrome, pos, ref et alt). Ces données ne sont pas significatives du point de vue de l'interrogation. Beaucoup plus intéressant pour mes clients est actuellement d'extraire des données avec une valeur 'AF' en dessous d'une certaine valeur. J'utilise Java reposful services pour interagir avec cette base de données en utilisant le pilote CQL JDBC. Il est rapidement devenu évident que l'interrogation directe de cette table ne fonctionnerait pas en utilisant AF car il semble que l'instruction select doit identifier les clés de ligne que vous voulez regarder. J'ai trouvé des discussions confuses sur ce point, mais ce que j'ai décidé de faire était puisque les valeurs distinctes de AF sont inférieures à 100 valeurs, je construit une table de consultation qui ressemble à ceci:

CREATE TABLE af_lookup (
    af_id float, 
    column1 text, 
    column2 text, 
    value text, 
    PRIMARY KEY (af_id, column1, column2) 
) WITH COMPACT STORAGE AND 
bloom_filter_fp_chance=0.010000 AND 
caching='KEYS_ONLY' AND 
comment='' AND 
dclocal_read_repair_chance=0.000000 AND 
gc_grace_seconds=864000 AND 
read_repair_chance=0.100000 AND 
replicate_on_write='true' AND 
populate_io_cache_on_flush='false' AND 
compaction={'class': 'SizeTieredCompactionStrategy'} AND 
compression={'sstable_compression': 'SnappyCompressor'}; 

C'était censé être une dynamique table avec des rangées très larges. J'ai rempli cette table en fonction de ces données stockées dans ma famille de colonnes statiques. La valeur 'AF' est la clé et la clé composée de l'autre table est concaténée par '-' (i.e.1-129-T-G) et stockée sous forme de chaîne en tant que nom de colonne dynamique. Cela a fonctionné correctement mais je ne comprends toujours pas comment toutes ces choses fonctionnent ensemble. Les familles de colonnes dynamiques semblent fonctionner uniquement comme annoncé en utilisant CQL -2 mais j'ai vraiment besoin d'utiliser la fonction comme>, <,> =, < =. Il semble que cela soit théoriquement possible mais je n'ai pas trouvé de solution au cours des 4 dernières semaines pour essayer un certain nombre d'outils différents (j'ai essayé astyanax ainsi que le pilote JDBC).

J'ai deux problèmes principaux, le premier est la limite de délai d'attente RPC pour interroger ces données qui pourraient produire 10 de milliers à des millions d'enregistrements. Le deuxième problème est de savoir comment présenter ces données en HTML en obtenant les données qui n'ont pas déjà été présentées (liens précédent-suivant). Similaire à la façon dont opscenter affiche les données de la famille de colonnes. Cela ne semble pas possible avec les limitations fonctionnelles de ne pas pouvoir utiliser>, <,> =, < =. Basé sur mon expérience c'est probablement un manque de compréhension de ma part de la façon dont ce produit fonctionne vraiment plutôt qu'un manque de capacité du produit (les bases de données ne seraient pas très utiles si elles étaient seulement capables de bien gérer les écritures).

Y at-il quelqu'un là-bas qui a rencontré ce problème et l'a résolu avant? J'apprécierais vraiment de partager un exemple de la façon de mettre en œuvre une solution C * en utilisant les services web java pour afficher un grand nombre de résultats qui devront être paginés.

Répondre

2

Vous pouvez explorer et utiliser Playorm for Cassandra, car il peut résoudre votre problème de limitation et de pagination du délai. PlayOrm renvoie un curseur lorsque vous interrogez et lorsque votre première page lit dans les 20 premiers résultats et l'affiche, la page suivante peut simplement utiliser le même curseur dans votre session et elle reprend là où elle s'était arrêtée sans rescanner les 20 premières lignes .
Visitez http://buffalosw.com/wiki/An-example-to-begin-with-PlayOrm/ pour voir l'exemple pour curseur et http://buffalosw.com/products/playorm/ pour toutes les fonctionnalités et plus de détails sur playorm

+0

Merci facilité. J'ai téléchargé et construit Playorm. En essayant l'exemple le plus simple, j'obtiens l'exception java: java.lang.NoClassDefFoundError: org/antlr/runtime/RecognitionException J'ai importé ce jar dans mon projet dans eclipse mais il lance toujours cette erreur d'exécution.Savez-vous pourquoi il ne trouve pas cette bibliothèque? –

+0

Vous avez dépassé cette et plusieurs autres dépendances manquantes. Maintenant, je rencontre cette erreur: échec d'analyse de classe (voir l'exception enchaînée) = classe com.alvazan.orm.api.z8spi.meta.DboColumnMeta. Des pensées sur ce que cela pourrait signifier? –

+0

Pouvez-vous s'il vous plaît partager le journal des erreurs complet lié à celui-ci. Assurez-vous également que nosql.Persistence.java se trouve dans votre classpath où vous avez vos classes Model. Voir aussi la FAQ sur http://buffalosw.com/wiki/FAQ/ – Easility

Questions connexes