在Spark Worker中访问MongoDB的最佳方法

时间:2018-12-26 20:41:56

标签: python mongodb apache-spark pyspark apache-kafka

所以我将kafka与spark连接,并想在mongo db中搜索该值。我不知道采用哪种方法来处理spark工作者,使用mongdb客户端或通过spark会话访问mongo。

通过使用pyspark,我尝试在foreachrdd函数中处理从kafka(json对象)获取的内容,并尝试在mongo数据库中查找多个值。

如果我使用Spark会话:   -我每次都要创建一个会话。如果我在工作人员外部使用了persist方法,它将在所有工作人员中保持吗?  -它比使用普通的python mongo客户端连接快吗?

这是从kafka接收消息并在spark中处理消息的最佳方法吗?

sc = SparkSession.builder.appName("test_kafka_app") \
    .config("spark.mongodb.input.uri", MONGO_URL) \
    .config("spark.mongodb.output.uri", MONGO_URL) \
    .getOrCreate()
ww = sc.read.format("com.mongodb.spark.sql.DefaultSource").option("uri",
                                                                  MONGO_URL).load()
ww.persist()
def test(value):
    try:
        sc = SparkSession.builder.appName("test_kafka_app") \
            .config("spark.mongodb.input.uri", MONGO_URL) \
            .config("spark.mongodb.output.uri", MONGO_URL) \
            .getOrCreate()
        ww = sc.read.format("com.mongodb.spark.sql.DefaultSource").option("uri",
                                                                        MONGO_URL).load()
        data = json.loads(value[1])
        if "val1" in data:
                print(ww.filter(func.array_contains(
                    ww.data, data["val1"])).collect())
    except Exception as ee:
        print(ee)
ssc = StreamingContext(sc.sparkContext, 2)
brokers = "localhost:9092"  # sys.argv[1:]
topic = "new_topic"
kvs = KafkaUtils.createDirectStream(ssc,
                                    [topic],
                                    {
                                        "metadata.broker.list": brokers
                                    })
lines = kvs.flatMap(lambda x: x[1])
kvs.foreachRDD(lambda line: line.foreach(test))
ssc.start()
ssc.awaitTermination()

0 个答案:

没有答案