web-dev-qa-db-fra.com

Comment connecter HBase et Spark en utilisant Python?

J'ai une tâche parallèle embarrassante pour laquelle j'utilise Spark pour distribuer les calculs. Ces calculs sont en Python, et j'utilise PySpark pour lire et prétraiter les données. Les données d'entrée de ma tâche sont stockées dans HBase. Malheureusement, je n'ai pas encore trouvé de moyen satisfaisant (c'est-à-dire facile à utiliser et évolutif) de lire/écrire des données HBase de/vers Spark en utilisant Python.

Ce que j'ai exploré précédemment:

  • Connexion depuis mes processus Python à l'aide de happybase. Ce package permet de se connecter à HBase à partir de Python en utilisant l'API Thrift de HBase. De cette façon, je saute essentiellement Spark pour la lecture/écriture des données et je passe à côté des optimisations potentielles de HBase-Spark. Les vitesses de lecture semblent relativement rapides, mais les vitesses d'écriture sont lentes. C'est actuellement ma meilleure solution.

  • Utilisation de newAPIHadoopRDD et saveAsNewAPIHadoopDataset de SparkContext qui utilisent l'interface MapReduce de HBase. Des exemples de cela ont déjà été inclus dans la base de code Spark ( voir ici ). Cependant, ceux-ci sont désormais considérés comme obsolètes en faveur des liaisons Spark de HBase ( voir ici ). J'ai également trouvé que cette méthode était lente et lourde (pour la lecture, l'écriture fonctionnait bien), par exemple, car les chaînes renvoyées par newAPIHadoopRDD devaient être analysées et transformées de diverses manières pour aboutir à la Python les objets que je voulais. Il ne prend également en charge qu'une seule colonne à la fois.

Alternatives que je connais:

  • J'utilise actuellement le CDH de Cloudera et la version 5.7.0 propose hbase-spark ( Notes de version CDH et un article de blog détaillé ). Ce module (anciennement SparkOnHBase) fera officiellement partie de HBase 2.0. Malheureusement, cette merveilleuse solution semble fonctionner uniquement avec Scala/Java.

  • Huawei Spark-SQL-on-HBase / Astro (Je ne vois pas de différence entre les deux ...). Il ne semble pas aussi robuste et bien supporté que j'aimerais que ma solution soit.

13
Def_Os

J'ai trouvé ce commentaire par l'un des créateurs de hbase-spark, ce qui semble suggérer qu'il existe un moyen d'utiliser PySpark pour interroger HBase en utilisant Spark SQL.

Et en effet, le modèle décrit ici peut être appliqué pour interroger HBase avec Spark SQL en utilisant PySpark, comme le montre l'exemple suivant:

from pyspark import SparkContext
from pyspark.sql import SQLContext

sc = SparkContext()
sqlc = SQLContext(sc)

data_source_format = 'org.Apache.hadoop.hbase.spark'

df = sc.parallelize([('a', '1.0'), ('b', '2.0')]).toDF(schema=['col0', 'col1'])

# ''.join(string.split()) in order to write a multi-line JSON string here.
catalog = ''.join("""{
    "table":{"namespace":"default", "name":"testtable"},
    "rowkey":"key",
    "columns":{
        "col0":{"cf":"rowkey", "col":"key", "type":"string"},
        "col1":{"cf":"cf", "col":"col1", "type":"string"}
    }
}""".split())


# Writing
df.write\
.options(catalog=catalog)\  # alternatively: .option('catalog', catalog)
.format(data_source_format)\
.save()

# Reading
df = sqlc.read\
.options(catalog=catalog)\
.format(data_source_format)\
.load()

J'ai essayé hbase-spark-1.2.0-cdh5.7.0.jar (tel que distribué par Cloudera) pour cela, mais a rencontré des problèmes (org.Apache.hadoop.hbase.spark.DefaultSource does not allow create table as select lors de l'écriture, Java.util.NoSuchElementException: None.get lors de la lecture). Il s'avère que la version actuelle de CDH n'inclut pas les modifications apportées à hbase-spark qui permettent Spark intégration SQL-HBase.

Ce que fonctionne pour moi est le shc Spark, trouvé ici . Le seul changement que j'ai dû apporter au script ci-dessus est de changer:

data_source_format = 'org.Apache.spark.sql.execution.datasources.hbase'

Voici comment je soumets le script ci-dessus sur mon cluster CDH, en suivant l'exemple du README shc:

spark-submit --packages com.hortonworks:shc:1.0.0-1.6-s_2.10 --repositories http://repo.hortonworks.com/content/groups/public/ --files /opt/cloudera/parcels/CDH/lib/hbase/conf/hbase-site.xml example.py

La plupart des travaux sur shc semblent déjà avoir été fusionnés dans le hbase-spark module de HBase, pour sortie en version 2.0. Avec cela, Spark L'interrogation SQL de HBase est possible en utilisant le modèle mentionné ci-dessus (voir: https://hbase.Apache.org/book.html#_sparksql_dataframes Mon exemple ci-dessus montre à quoi il ressemble pour les utilisateurs de PySpark.

Enfin, une mise en garde: mon exemple de données ci-dessus n'a que des chaînes. Python n'est pas prise en charge par shc, j'ai donc eu des problèmes avec des entiers et des flottants n'apparaissant pas dans HBase ou avec des valeurs étranges.

18
Def_Os