我很难让这些组件正确编织在一起。我已经安装了Spark并成功运行,我可以在本地运行作业,独立运行,也可以通过YARN运行。我已遵循建议的步骤(据我所知)here和here
我正在使用Ubuntu以及我拥有的各种组件版本
我在执行各个步骤时遇到了一些困难,例如哪个罐子添加到哪个路径,所以我添加的是
/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
的源代码和抛出错误的行,它说
&#34;与JVM通信时出错。是MongoDB Spark jar吗? Spark的CLASSPATH? :&#34;
所以作为回应,我试图确保正确的罐子通过,但我可能会做错了,见下文
$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,我可以。
我知道这里有很多活动部件,所以如果我能提供更多有用的信息,请告诉我。
答案 0 :(得分:14)
<强>更新强>:
2016年7月4日
自上次更新MongoDB Spark Connector成熟以来。它提供up-to-date binaries和基于数据源的API,但它使用SparkConf
配置,因此它在主观上不如Stratio / Spark-MongoDB灵活。
2016年3月30日
从最初的答案开始,我发现了两种从Spark连接到MongoDB的不同方法:
虽然前者似乎相对不成熟,但后者看起来比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库)。您可以找到complete source on 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 .
或下载我pushed to 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
启动PySpark shell传递--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似乎在第一次操作后关闭连接。因此,在collect之后调用示例rdd.count()
会抛出异常。
根据我在创建此图片时遇到的不同问题,我倾向于认为传递 mongo-hadoop-1.5.0-SNAPSHOT.jar
和mongo-hadoop-spark-1.5.0-SNAPSHOT.jar
两者 { {1}}和--jars
是唯一的硬性要求。
备注:
--driver-class-path
很可能是更好的选择。答案 1 :(得分:3)
您可以尝试在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,需要更多依赖项才能下载,然后再开始工作。
答案 2 :(得分:0)
昨天我遇到了同样的问题。能够通过将MC.Graph <- function(variable){
p <- ggplot(data = newBEPS, aes_string(x=variable)) + geom_bar(aes(y = (..count..)/sum(..count..)), width = .5)+ scale_y_continuous(labels = percent)
p <- p + ggtitle(graphwords$graphtitle[graphwords$gw.varname == variable]) +
theme(plot.title = element_text(size =20, lineheight = .5, face = "bold"))
}
置于mongo-java-driver.jar
和$HADOOP_HOME/lib
以及mongo-hadoop-core.jar
mongo-hadoop-spark.jar
(或$HADOOP_HOME/spark/classpath/emr
中的任何其他文件夹中来解决问题)。
如果有帮助,请告诉我。
答案 3 :(得分:0)
祝你好运!
@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()