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를 제공하지만 사용 중입니다.SparkConf
Stratio/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
'programing' 카테고리의 다른 글
WordPress다른 언어로 클릭할 때 로고 이미지 변경 (0) | 2023.07.06 |
---|---|
SSIS - 잠재적인 데이터 손실로 인해 값을 변환할 수 없습니다. (0) | 2023.07.06 |
iOS에서 Phonegap을 사용하여 방향 변경을 올바르게 감지하려면 어떻게 해야 합니까? (0) | 2023.07.06 |
Django REST Framework에서 CORS를 활성화하려면 어떻게 해야 합니까? (0) | 2023.07.06 |
Oracle에서 삭제 및 삭제 간의 차이 (0) | 2023.07.06 |