Manipuler riak depuis python

Aperçu

Travaillez avec riak 2.0.x à partir de python 3.4. La documentation du client python est disponible à l'adresse http://basho.github.io/riak-python-client/index.html.

Préparation

Installer riak

Vous pouvez installer riak 2.0.4 avec la commande brew. La commande brew semble être en retard sur la dernière, donc si vous souhaitez la mettre à jour, veuillez le faire vous-même.

% brew install riak

Définissez les paramètres pour modifier le descripteur de fichier. Il semble que cela ne démarrera que si ceux-ci sont mis en œuvre.

/Library/LaunchDaemons/limit.maxfiles.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>65536</string>
          <string>65536</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

/Library/LaunchDaemons/limit.maxproc.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Redémarrez le système d'exploitation ici.

Vérifiez les paramètres après le démarrage.

% launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     2048           2048           
maxfiles    65536          65536   

riak commencer

Si vous affichez pong, c'est OK.

% riak start
% riak ping
pong

Modifier les paramètres

Définissez allow_mult sur true. Tout d'abord, vérifiez l'emplacement du fichier de paramètres qui a été généré automatiquement au démarrage.

$ riak config effective | grep allow_mult
buckets.default.allow_mult = false

Les informations de sortie ci-dessus étaient fausses, alors changez-les en true.

$ sudo echo "buckets.default.allow_mult = true" >> /usr/local/Cellar/riak/2.0.4/libexec/etc/riak.conf

Redémarrez riak et assurez-vous que c'est vrai.

$ riak restart
$ riak config effective | grep allow_mult
buckets.default.allow_mult = true

Installer le client riak

Installez le client riak-python officiel.

% pip install riak

Riak comme KVS

Exemple simple

% ipython
import riak
client = riak.RiakClient()
bucket = client.bucket('manifestations')
obj = bucket.new('4873113938', data={
  'title': 'Première 3e édition de Python',
  'creator': 'Mark Lutz',
  'isbn': '4873113938'
}).store() # -> <riak.riak_object.RiakObject at 0x10a663898>

obj = bucket.new('4797372273', data={
  'title': 'Fun Ruby 4e édition',
  'creator': 'Masayoshi Takahashi',
  'isbn': '4797372273'
}).store() # -> <riak.riak_object.RiakObject at 0x10a6b4470>

print(bucket.get('4873113938').data) # -> {'creator': 'Mark Lutz', 'title': 'Première 3e édition de Python', 'isbn': '4873113938'}

bucket.get_keys() # -> ['4873113938', '4797372273']

print(bucket.multiget(['4873113938','4873113938'])) # -> [<riak.riak_object.RiakObject object at 0x10a6b45f8>, <riak.riak_object.RiakObject object at 0x10a787a90>]

bucket.delete('4873113938')
print(bucket.get('4873113938').data) # -> None

bucket.get_keys() # -> ['4797372273']

Utilisez le compteur

Une fonction qui vous permet d'augmenter ou de diminuer la valeur numérique. Cela aide à être standard. C'est un mystère que vous devez stocker () après avoir incrémenté ...

$ riak-admin bucket-type create counters '{"props":{"datatype":"counter"}}'
$ riak-admin bucket-type activate counters
$ ipython
import riak
from riak.datatypes import Counter
client = riak.RiakClient()
bucket = client.bucket_type('counters').bucket('manifestations')
counter = Counter(bucket, 'manifestations')
counter.value # -> 0
counter.increment()
counter.store()
counter.value # -> 1

Utilisez la fonction de recherche en texte intégral (Yokozuna)

Préparation

Dans l'état initial, la fonction de recherche (recherche) devrait être désactivée, mais vérifions-la pour le moment. Si elle est désactivée, modifiez le paramètre et redémarrez riak.

$ riak config effective | grep "search ="
search = off
$ sudo sed -e 's/search = off/search = on/' -i.back /usr/local/Cellar/riak/2.0.4/libexec/etc/riak.conf
$ riak restart
ok
$ riak ping
pong
$ riak config effective | grep "search ="
search = on

Réglage

C'est un problème, mais je vais le régler.

% wget https://raw.githubusercontent.com/basho/yokozuna/develop/priv/default_schema.xml
% ipython
import riak
client = riak.RiakClient()
f = open('default_schema.xml')
content = f.read()
f.close()
schema_name = '_yz_default'
client.create_search_schema(schema_name, content)
client.create_search_index('manifestation_index','_yz_default')

Créez un type de compartiment.

$ riak-admin bucket-type create manifestation_index '{"props":{"search_index":"manifestation_index"}}'
manifestation_index created
$ riak-admin bucket-type activate manifestation_index
manifestations has been activated

J'essaierai l'enregistrement et la recherche de données.

$ ipython
import riak
client = riak.RiakClient()
bucket = client.bucket_type('manifestation_index').bucket('books')

book = bucket.new('4621088629', {'title_s': 'Histoire de l'astronomie orientale', 'isbn_s': '4621088629', 'price_i': 1080, 'creator_s': 'Nakamura', 'date_of_publication_dts': '2014-10-25T00:00:00Z'})
book.store()

book = bucket.new('4864102538', {'title_s': 'Sonde spatiale', 'isbn_s': '4864102538', 'price_i': 4320, 'creator_s': 'Philip Segera', 'date_of_publication_dts': '2013-08-06T00:00:00Z'})
book.store()

book = bucket.new('4422420046', {'title_s': 'Le plus beau livre d'images d'éléments au monde', 'isbn_s': '4422420046', 'price_i': 4104, 'creator_s': 'Théodore Gray', 'date_of_publication_dts': '2010-10-22T00:00:00Z'})
book.store()

book = bucket.new('4087472221', {'title_s': 'Crête de montagne des dieux <ci-dessus>', 'isbn_s': '4087472221', 'price_i': 788, 'creator_s': 'Oreiller Yume 獏', 'date_of_publication_dts': '2000-08-01T00:00:00Z'})
book.store()

book = bucket.new('408747223X', {'title_s': 'Crête de montagne des dieux <ci-dessous>', 'isbn_s': '408747223X', 'price_i': 864, 'creator_s': 'Oreiller Yume 獏', 'date_of_publication_dts': '2000-08-01T00:00:00Z'})
book.store()

book = bucket.new('4163537406', {'title_s': 'Eaux hostiles', 'isbn_s': '4163537406', 'price_i': 119, 'creator_s': 'Peter Haksozen', 'date_of_publication_dts': '1998-01-01T00:00:00Z'})
book.store()

bucket.get_keys() # -> ['4422420046',
 '4163537406',
 '4087472221',
 '408747223X',
 '4621088629',
 '4864102538']

results = client.fulltext_search('manifestation_index', 'title_s:Dieu*')
for doc in results['docs']:
  bucket = client.bucket_type(doc['_yz_rt']).bucket(doc['_yz_rb']) 
  b = bucket.get(doc['_yz_rk']) 
  print(b.data)
  
# -> {'creator_s': 'Oreiller Yume 獏', 'title_s': 'La crête de la montagne des dieux', 'price_i': 788, 'date_of_publication_dts': '2000-08-01T00:00:00Z', 'isbn_s': '4087472221'}
{'creator_s': 'Oreiller Yume 獏', 'title_s': 'Crête de montagne des dieux <ci-dessous>', 'price_i': 864, 'date_of_publication_dts': '2000-08-01T00:00:00Z', 'isbn_s': '408747223X'}

results = client.fulltext_search('manifestation_index', 'price_i:[* TO 1000]')
for doc in results['docs']:
  bucket = client.bucket_type(doc['_yz_rt']).bucket(doc['_yz_rb']) 
  b = bucket.get(doc['_yz_rk']) 
  print(b.data)
  
# -> {'creator_s': 'Oreiller Yume 獏', 'title_s': 'Crête de montagne des dieux <ci-dessus>', 'price_i': 788, 'date_of_publication_dts': '2000-08-01T00:00:00Z', 'isbn_s': '4087472221'}
{'creator_s': 'Oreiller Yume 獏', 'title_s': 'Crête de montagne des dieux <ci-dessous>', 'price_i': 864, 'date_of_publication_dts': '2000-08-01T00:00:00Z', 'isbn_s': '408747223X'}
{'creator_s': 'Peter Haksozen', 'title_s': 'Eaux hostiles', 'price_i': 119, 'date_of_publication_dts': '1998-01-01T00:00:00Z', 'isbn_s': '4163537406'}  

finalement

Erreur ConflictError

Si vous utilisez la propriété siblings de la variable d'instance riak.riak_object.RiakObject, vous obtiendrez plusieurs éléments dans la liste. Dans ce cas, il est préférable de le supprimer avec la méthode de suppression, puis de le réenregistrer. J'aimerais qu'il y ait un moyen de tout supprimer en même temps ...

Recommended Posts

Manipuler riak depuis python
sql à sql
Manipuler des tables BigQuery à partir d'un client Python
Utilisez Thingsspeak de Python
Touchez MySQL depuis Python 3
Exploitez Filemaker depuis Python
Utiliser fluentd de python
Accéder à bitcoind depuis python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Python depuis ou import
Utilisez MySQL depuis Python
Exécutez Python à partir d'Excel
Installer Python à partir de la source
Faites fonctionner le neutron de Python!
Faire fonctionner LXC depuis Python
Forcer Python depuis Fortran
Utilisez BigQuery depuis Python.
Exécuter la commande depuis Python
[Python] Lire depuis Stdin
Utilisez mecab-ipadic-neologd de Python
Manipuler des fichiers Excel à partir de python avec xlrd (mémo personnel)
Aplatir à l'aide du rendement Python de
Appeler CPLEX depuis Python (DO cplex)
Deep Python appris de DEAP
Publier de Python vers Slack
Fonctionnalités de grammaire ajoutées à partir de Python3.6
Flirter de PHP à Python
Rendre MeCab disponible à partir de Python 3
Informations obtenues à partir de tweet_id (Python)
OCR à partir de PDF en Python
Exécutez le script illustrator à partir de python
Utiliser MySQL depuis Anaconda (python)
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Étude de Python Hour4: orientée objet ②
Interroger Athena depuis Lambda Python
Accéder à Oracle DB depuis Python
Étude de Python Hour3: Fonctions
Manipulez les feuilles de calcul localement à l'aide de Python
Arrêtez Omxplayer à partir du code Python
Manipulez diverses bases de données avec Python
Passer de python2.7 à python3.6 (centos7)
Connectez-vous à sqlite depuis python
Installez pyenv depuis Homebrew, installez Python depuis pyenv
Étude de Python Hour4: orientée objet ①
Convention de dénomination Python (à partir de PEP8)
Avec skype, notifiez avec skype de python!
Utilisez l'API e-Stat de Python
Enregistrer le problème Redmine de Python
Appelez Matlab depuis Python pour optimiser
Exécuter le script Python à partir du fichier de commandes
Python: exclure les balises des données html
Utiliser la PNL Stanford Core à partir de Python
Toucher les objets Python d'Elixir
Python
Frappez les données du trésor de Python Pandas
Utilisation de Rstan de Python avec PypeR
Obtenir des données de Quandl en Python
Installez Python à partir des sources avec Ansible