web-dev-qa-db-ja.com

Spark、Python、およびMongoDBを連携させる

これらのコンポーネントを適切に編成するのに苦労しています。 Sparkをインストールして正常に動作しているので、ローカル、スタンドアロン、YARN経由でジョブを実行できます。 (私の知る限り) here および here の手順に従いました。

私はUbuntuに取り組んでおり、私が持っているさまざまなコンポーネントのバージョンは

どのjarをどのパスに追加するかなど、さまざまな手順を実行するのに苦労しました。

  • in /usr/local/share/hadoop-2.6.1/share/hadoop/mapreduce追加しましたmongo-hadoop-core-1.5.0-SNAPSHOT.jar
  • 次の環境変数
    • export HADOOP_HOME="/usr/local/share/hadoop-2.6.1"
    • export PATH=$PATH:$HADOOP_HOME/bin
    • export SPARK_HOME="/usr/local/share/spark-1.5.1-bin-hadoop2.6"
    • export PYTHONPATH="/usr/local/share/mongo-hadoop/spark/src/main/python"
    • export PATH=$PATH:$SPARK_HOME/bin

私のPythonプログラムは基本です

from pyspark import SparkContext, SparkConf
import pymongo_spark
pymongo_spark.activate()

def main():
    conf = SparkConf().setAppName("pyspark test")
    sc = SparkContext(conf=conf)
    rdd = sc.mongoRDD(
        'mongodb://username:password@localhost:27017/mydb.mycollection')

if __name__ == '__main__':
    main()

コマンドを使用して実行しています

$SPARK_HOME/bin/spark-submit --driver-class-path /usr/local/share/mongo-hadoop/spark/build/libs/ --master local[4] ~/sparkPythonExample/SparkPythonExample.py

結果として次の出力が得られます

Traceback (most recent call last):
  File "/home/me/sparkPythonExample/SparkPythonExample.py", line 24, in <module>
    main()
  File "/home/me/sparkPythonExample/SparkPythonExample.py", line 17, in main
    rdd = sc.mongoRDD('mongodb://username:password@localhost:27017/mydb.mycollection')
  File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 161, in mongoRDD
    return self.mongoPairRDD(connection_string, config).values()
  File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 143, in mongoPairRDD
    _ensure_pickles(self)
  File "/usr/local/share/mongo-hadoop/spark/src/main/python/pymongo_spark.py", line 80, in _ensure_pickles
    orig_tb)
py4j.protocol.Py4JError

here に従って

この例外は、Javaクライアントコードで例外が発生したときに発生します。たとえば、空のスタックから要素をポップしようとした場合。スローされたJava例外のインスタンスは、Java_exceptionメンバーに格納されます。

pymongo_spark.pyのソースコードとエラーをスローする行を見ると、

「JVMとの通信中にエラーが発生しました。MongoDBSpark jarはSparkのCLASSPATHにありますか?: "

そのため、適切なjarファイルが渡されることを確認しようとしましたが、これはすべて間違っている可能性があります。以下を参照してください

$SPARK_HOME/bin/spark-submit --jars /usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-hadoop-spark-1.5.0-SNAPSHOT.jar,/usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-Java-driver-3.0.4.jar --driver-class-path /usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-Java-driver-3.0.4.jar,/usr/local/share/spark-1.5.1-bin-hadoop2.6/lib/mongo-hadoop-spark-1.5.0-SNAPSHOT.jar --master local[4] ~/sparkPythonExample/SparkPythonExample.py

pymongoを同じpythonプログラムにインポートして、少なくともそれを使用してMongoDBにアクセスできること、およびできることを確認しました。

ここにはかなりの数の可動部品があることを知っているので、さらに役立つ情報を提供できる場合はお知らせください。

34
Philip O'Brien

更新

2016-07-04

最後の更新以来 MongoDB Spark Connector かなり成熟しました。 最新のバイナリ およびデータソースベースのAPIを提供しますが、 SparkConf構成を使用しているため、Stratio/Spark-MongoDBよりも主観的に柔軟性が低くなっています。

2016-03-30

最初の回答以来、SparkからMongoDBに接続する2つの異なる方法を見つけました。

前者は比較的未熟であるように見えますが、後者はMongo-Hadoopコネクタよりもはるかに良い選択のように見え、Spark SQL APIを提供します。

_# Adjust Scala and package version according to your setup
# although officially 0.11 supports only Spark 1.5
# I haven't encountered any issues on 1.6.1
bin/pyspark --packages com.stratio.datasource:spark-mongodb_2.11:0.11.0
_
_df = (sqlContext.read
  .format("com.stratio.datasource.mongodb")
  .options(Host="mongo:27017", database="foo", collection="bar")
  .load())

df.show()

## +---+----+--------------------+
## |  x|   y|                 _id|
## +---+----+--------------------+
## |1.0|-1.0|56fbe6f6e4120712c...|
## |0.0| 4.0|56fbe701e4120712c...|
## +---+----+--------------------+
_

_mongo-hadoop-spark_よりもはるかに安定しているようで、静的構成なしで述語プッシュダウンをサポートし、単純に機能します。

元の回答

実際、ここにはかなりの数の可動部品があります。説明した構成にほぼ一致する単純なDockerイメージを構築することで、管理しやすくしました(ただし、簡潔にするためにHadoopライブラリは省略しました)。 GitHubの完全なソースDOI 10.5281/zenodo.47882 )を見つけて、ゼロからビルドできます。

_git clone https://github.com/zero323/docker-mongo-spark.git
cd docker-mongo-spark
docker build -t zero323/mongo-spark .
_

または、私が Docker Hubにプッシュした の画像をダウンロードするので、単純に_docker pull zero323/mongo-spark_)できます:

開始画像:

_docker run -d --name mongo mongo:2.6
docker run -i -t --link mongo:mongo zero323/mongo-spark /bin/bash
_

_--jars_および_--driver-class-path_を渡してPySpark Shellを開始します。

_pyspark --jars ${JARS} --driver-class-path ${SPARK_DRIVER_EXTRA_CLASSPATH}
_

そして最後にそれがどのように機能するかを見てください:

_import pymongo
import pymongo_spark

mongo_url = 'mongodb://mongo:27017/'

client = pymongo.MongoClient(mongo_url)
client.foo.bar.insert_many([
    {"x": 1.0, "y": -1.0}, {"x": 0.0, "y": 4.0}])
client.close()

pymongo_spark.activate()
rdd = (sc.mongoRDD('{0}foo.bar'.format(mongo_url))
    .map(lambda doc: (doc.get('x'), doc.get('y'))))
rdd.collect()

## [(1.0, -1.0), (0.0, 4.0)]
_

Mongo-hadoopは、最初のアクションの後に接続を閉じるようです。したがって、収集後にrdd.count()を呼び出すと、例外がスローされます。

このイメージの作成で遭遇したさまざまな問題に基づいて、passing _mongo-hadoop-1.5.0-SNAPSHOT.jar_および_mongo-hadoop-spark-1.5.0-SNAPSHOT.jar_ to both _--jars_と信じる傾向があります。 _--driver-class-path_ 唯一のハード要件

メモ

  • この画像はおおまかに jaceklaskowski/docker-spark に基づいているため、役立つ場合は @ jacek-laskowski に必ず良いカルマを送信してください。
  • 新しいAPI を含む開発バージョンが不要な場合は、_--packages_を使用する方が適切なオプションです。
15
zero323

Spark-submitコマンドで--packageの代わりに--jars ...オプションを使用してみてください:

spark-submit --packages org.mongodb.mongo-hadoop:mongo-hadoop-core:1.3.1,org.mongodb:mongo-Java-driver:3.1.0 [REST OF YOUR OPTIONS]

これらのjarファイルの一部はUber jarファイルではないため、動作させる前にダウンロードするためにさらに依存関係が必要です。

3
asaad

がんばろう!

@see https://github.com/mongodb/mongo-hadoop/wiki/Spark-Usage

from pyspark import SparkContext, SparkConf

import pymongo_spark
# Important: activate pymongo_spark.
pymongo_spark.activate()


def main():
    conf = SparkConf().setAppName("pyspark test")
    sc = SparkContext(conf=conf)

    # Create an RDD backed by the MongoDB collection.
    # This RDD *does not* contain key/value pairs, just documents.
    # If you want key/value pairs, use the mongoPairRDD method instead.
    rdd = sc.mongoRDD('mongodb://localhost:27017/db.collection')

    # Save this RDD back to MongoDB as a different collection.
    rdd.saveToMongoDB('mongodb://localhost:27017/db.other.collection')

    # You can also read and write BSON:
    bson_rdd = sc.BSONFileRDD('/path/to/file.bson')
    bson_rdd.saveToBSON('/path/to/bson/output')

if __name__ == '__main__':
    main()
0
larryhu

昨日も同じ問題を抱えていました。 _mongo-Java-driver.jar_を_$HADOOP_HOME/lib_および_mongo-hadoop-core.jar_に配置し、_mongo-hadoop-spark.jar_に_$HADOOP_HOME/spark/classpath/emr_および(_$SPARK_CLASSPATH_ )。

それが役立つかどうか教えてください。

0