sql >> データベース >  >> NoSQL >> MongoDB

Spark、Python、MongoDBを連携させる

    更新

    2016-07-04

    前回の更新以降、MongoDBSparkConnectorはかなり成熟しました。最新のバイナリとデータソースベースのAPIを提供しますが、SparkConfを使用しています。 構成なので、Stratio/Spark-MongoDBよりも主観的に柔軟性が低くなります。

    2016-03-30

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

    • mongodb / mongo-spark
    • Stratio / Spark-MongoDB

    前者は比較的未成熟のようですが、後者はMongo-Hadoopコネクタよりもはるかに優れた選択肢のように見え、SparkSQLAPIを提供します。

    # 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を渡してPySparkシェルを起動します および--driver-class-path

    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()を呼び出す 収集後、例外がスローされます。

    この画像の作成で遭遇したさまざまな問題に基づいて、私は合格と信じがちです。 mongo-hadoop-1.5.0-SNAPSHOT.jar およびmongo-hadoop-spark-1.5.0-SNAPSHOT.jar 両方に --jars および--driver-class-path 唯一の厳しい要件

    メモ

    • この画像は大まかにjaceklaskowski/docker-sparkに基づいているため、役立つ場合は、必ず@jacek-laskowskiに適切なカルマを送信してください。
    • 新しいAPIを含む開発バージョンが必要ない場合は、--packagesを使用します おそらくより良い選択肢です。


    1. MongoDBは、配列要素でドキュメントを並べ替えます

    2. MongoDBデフォルトのユーザーとパスワードは何ですか?

    3. Redisでいくつかのハッシュを取得する最も効率的な方法は?

    4. _http_server.js:192 throw new RangeError( `Invalid status code:$ {statusCode}`);