【发布时间】:2021-05-22 22:56:50
【问题描述】:
我必须将数据作为单个 JPG 文件(约数百万)从 PySpark 写入 S3 存储桶。
我尝试了多种选择:
设置:AWS EMR 集群和 Jupyter 笔记本。
- 在 'foreach' 方法中创建一个 boto3 客户端并写入 S3 ==> 太慢且效率低下,因为我们为每个任务打开客户端。
def get_image(y):
res = requests.get(img_url, stream=True)
file_name = "./" +str(cid) + ".jpg"
client = boto3.client('s3')
file_name = str(cid) + ".jpg"
client.put_object(Body=res.content, Bucket='test', Key='out_images/'+file_name)
myRdd.foreach(get_image)
- 写入本地文件系统并运行“aws S3 复制”到 S3 => 如果将这些数据写入每个单独的工作节点的卷,则不清楚如何访问这些数据。在作业运行时登录到工作节点,但无法准确找到 JPG 的写入位置。
def get_image(y):
res = requests.get(img_url, stream=True)
file_name = "./" +str(cid) + ".jpg"
with open(file_name, 'wb') as f:
f.write(res.content)
myRdd.foreach(get_image)
- 写入 HDFS 并稍后运行 s3-dist-cp。可能是最有效的,但尚未在代码方面取得成功。
I get path cannot be found exceptions
def get_image(y):
res = requests.get(img_url, stream=True)
file_name = "hdfs://" +str(cid) + ".jpg"
with open(file_name, 'wb') as f:
f.write(res.content)
myRdd.foreach(get_image)
有人可以提出一个实现这一目标的好方法吗?
【问题讨论】:
-
如果按行数分区然后以这种方式写入 S3 会怎样?我想您可以使用使用 boto3 的脚本来更改每个文件的格式。
rows = df.count(),df.repartition(rows).write.avro('save-dir') -
我有 5 亿张图片要写。我不认为重新分区是一个理想的解决方案。
标签: apache-spark pyspark amazon-emr