programing

Spark, Python 및 MongoDB가 함께 작동하도록 하기

lastmoon 2023. 7. 6. 22:31
반응형

Spark, Python 및 MongoDB가 함께 작동하도록 하기

이 부품들을 제대로 조립하는 데 어려움을 겪고 있습니다.스파크를 설치하여 성공적으로 작업하고 있으며, 로컬, 독립 실행형 및 YARN을 통해 작업을 수행할 수 있습니다.여기와 여기에서 (가 아는 ) 조언한 단계를 따랐습니다.

나는 우분투에서 일하고 있고 내가 가지고 있는 다양한 컴포넌트 버전들은

  • 스파크 스파크-1.5.1-빈-하둡 2.6
  • Hadoop Hadoop-2.1
  • Mongo 2.6.10
  • https://github.com/mongodb/mongo-hadoop.git 에서 Mongo-Hadoop 커넥터 복제
  • 파이썬 2.7.10

어떤 병을 어떤 경로에 추가할지 등 여러 단계를 따라가는 데 어려움이 있어서 추가한 내용은

  • /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

내 파이썬 프로그램은 기본입니다.

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

여기에 따르면

이 예외는 Java 클라이언트 코드에서 예외가 발생할 때 발생합니다.예를 들어 빈 스택에서 요소를 팝업하려고 하는 경우입니다.느려진 Java 예외의 인스턴스는 java_exception 멤버에 저장됩니다.

다음에 대한 소스 코드를 확인하는 중pymongo_spark.py그리고 오류를 던지는 선이라고 쓰여 있습니다.

"JVM과 통신하는 동안 오류가 발생했습니다.스파크의 CLASSPATH에 MongoDB 스파크 항아리가 있습니까? :"

따라서 올바른 병이 전달되고 있는지 확인하려고 노력했지만, 잘못 전달되었을 수도 있습니다. 아래를 참조하십시오.

$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적어도 그것을 사용하여 MongoDB에 액세스할 수 있는지 확인하기 위해 동일한 파이썬 프로그램에 접근할 수 있습니다.

여기에 움직이는 부품이 꽤 많은 것으로 알고 있으니 더 유용한 정보를 제공할 수 있으면 알려주시기 바랍니다.

업데이트:

2016-07-04

지난번 업데이트 이후로 MongoDB Spark Connector는 상당히 성숙했습니다.최신 바이너리 및 데이터 소스 기반 API를 제공하지만 사용 중입니다.SparkConfStratio/Spark-MongoDB보다 주관적으로 덜 유연한 구성입니다.

2016-03-30

원래 답변 이후 스파크에서 MongoDB에 연결하는 두 가지 다른 방법을 찾았습니다.

전자는 상대적으로 미숙한 것처럼 보이지만 후자는 Mongo-Hadoop 커넥터보다 훨씬 나은 선택으로 보이며 스파크 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 라이브러리는 생략했습니다).완전한 소스는 (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 pull zero323/mongo-spark):

이미지 시작:

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

PySpark를 셸 하기 셸달--jars그리고.--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더 나은 선택일 가능성이 높습니다.

?를 사용해 볼 수 ?--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가 아니므로 작동하기 전에 더 많은 종속성을 다운로드해야 합니다.

저는 어제도 같은 문제를 겪고 있었습니다.배치하여 고칠 수 있었습니다.mongo-java-driver.jar$HADOOP_HOME/lib그리고.mongo-hadoop-core.jar그리고.mongo-hadoop-spark.jar$HADOOP_HOME/spark/classpath/emr 에 다른 )$SPARK_CLASSPATH).

그게 도움이 된다면 제게 알려주세요.

행운을 빕니다!

@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()

언급URL : https://stackoverflow.com/questions/33391840/getting-spark-python-and-mongodb-to-work-together

반응형