所以我将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()