簡體   English   中英

無法在 AWS EMR 中使用 Pyspark 或 Python 從 mongoDB 讀取數據

[英]Unable to read data from mongoDB using Pyspark or Python in AWS EMR

我正在嘗試使用 AWS EMR 中的 PySpark 和本機 python 從 3 節點 MongoDB 集群(副本集)讀取數據。 我在 AWS EMR 集群中執行代碼時遇到問題,如下所述,但相同的代碼在我的本地 windows 機器上運行良好。

spark 版本 - 2.4.8 Scala 版本 - 2.11.12 MongoDB 版本 - 4.4.8 mongo-spark-connector 版本 - mongo-spark-connector_2.11:2.4.4 python 版本 - 3.7.10 通過 8833830550088868 -6給出空數據框)

以下是在本地和集群模式下運行 pyspark 作業時的命令。

本地模式:spark-submit --master local[*] --packages org.mongodb.spark:mongo-spark-connector_2.11:2.4.4 test.py

集群模式:spark-submit --master yarn --deploy-mode cluster --packages org.mongodb.spark:mongo-spark-connector_2.11:2.4.4 test.py

對於這兩種模式,我無法從 mongoDB(空數據幀)讀取數據,即使 te.net 正在跨 spark 集群(來自所有節點)的所有節點工作。 從日志中,我可以確認 spark 能夠與 mongoDB 通信,而我的 pyspark 工作給出空 dataframe。請在下面找到相同的屏幕截圖!

mongoDB 連接到 pyspark

pyspark 給空 dataframe

下面是相同的代碼片段:

from pyspark.sql import SparkSession, SQLContext
from pyspark import SparkConf, SparkContext
import sys

import json

sc = SparkContext()
spark = SparkSession(sc).builder.appName("MongoDbToS3").config("spark.mongodb.input.uri", "mongodb://usename:password@host1:port1,host2:port2,host3:port3/db.collection/?replicaSet=ABCD&authSource=admin").getOrCreate()
data = spark.read.format("com.mongodb.spark.sql.DefaultSource").load()
data.show()

請讓我知道我在 pyspark 代碼中做錯或遺漏的任何事情?

通過本機 python 代碼 -(問題 - 如果 batch_size >1 並且如果 batch_size =1 代碼會卡住,它將首先打印 24 個 mongo 文檔,然后 cursor 掛起)

我正在使用 pymongo 驅動程序通過本機 python 代碼連接到 mongoDB。 問題是當我嘗試獲取/打印 batch_size 為 1000 的 mongoDB 文檔時,代碼永遠掛起,然后出現網絡超時錯誤。 但是如果我使 batch_size =1 那么 cursor 能夠再次獲取前 24 個文檔 cursor 掛起。 我們觀察到第 25 個文檔與前 24 個文檔相比非常大(大約 4kb)然后我們嘗試跳過第 25 個文檔,然后 cursor 開始獲取下一個文檔但它再次卡在其他一些 position,所以我們觀察到每當文檔大小是大 cursor 卡住了。

你們能幫我理解這個問題嗎?

從.networking 端或 mongoDB 端是否有任何阻塞? 下面是代碼片段:

from datetime import datetime
import json
#import boto3
from bson import json_util
import pymongo


client = pymongo.MongoClient("mongodb://username@host:port/?authSource=admin&socketTimeoutMS=3600000&maxIdleTimeMS=3600000")

# Database Name
db = client["database_name"]

# Collection Name
quoteinfo__collection= db["collection_name"]

results = quoteinfo__collection.find({}).batch_size(1000)
doc_count = quoteinfo__collection.count_documents({})

print("documents count from collection: ",doc_count)
print(results)
record_increment_no = 1

for record in results:
    print(record)
    print(record_increment_no)
    record_increment_no = record_increment_no + 1
results.close()

下面是 batch_size = 1000 的 output 屏幕截圖(代碼掛起並給出網絡超時錯誤)

pymongo 代碼卡住

網絡超時錯誤

batch_size = 1(只打印文檔到 24 日,然后 cursor 掛起)

打印 24 個文檔並掛起

我們的開發人員和 MongoDB 托管的 AWS 賬戶之間的 AWS 賬戶對等存在一些問題,如下所述

  1. 流量通過其中一條路由的 VPC 對等而不是 Transit Gateway 流動。
  2. MongoDB IP 不屬於路由表的 CIDR 范圍

為 MongoDb IP1 和 MongoDB IP2 添加中轉網關后,我們能夠以任何批量大小正確讀取任何集合的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM