使用 spark 读取 minio bucket 中的多个文件
Reading multiple files in a minio bucket with spark
我正在尝试使用 Spark 读取多个文件
这些文件是 avro 文件,存储在名为 datalake
的 Minio 存储桶中
我正在使用:
没有 hadoop 编译的 Spark 2.2.1
Minio(最新minio/miniodocker)
2 个包:com.databricks:spark-avro_2.11:4.0.0 和 org.apache.hadoop:hadoop-aws:2.8.3
我目前正在使用 pyspark 进行测试:
PYSPARK_PYTHON=python3 /usr/local/spark/pyspark --packages com.databricks:spark-avro_2.11:4.0.0,org.apache.hadoop:hadoop-aws:2.8.3
初始化与 Minio 的连接:
AWS_ID='localKey'
AWS_KEY='localSecret'
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", AWS_ID)
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_KEY)
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "http://127.0.0.1:9000")
当文件直接存储在存储桶根目录时,我可以像这样使用通配符:
DF_RANDOM = spark.read.format("com.databricks.spark.avro").load("s3a://datalake/random-random_table+0+000000001*.avro")
结果还可以:
DF_RANDOM.show()
+-----+-------------------+---+-------------+
|index| A| B| timestamp|
+-----+-------------------+---+-------------+
| 12| 0.5680445610939323| 1|1530017325000|
| 13| 0.925596638292661| 5|1530017325000|
| 14|0.07103605819788694| 4|1530017325000|
| 15|0.08712929970154071| 7|1530017325000|
+-----+-------------------+---+-------------+
但是,如果文件存储在子文件夹中:
DF_RANDOM = spark.read.format("com.databricks.spark.avro").load("s3a://datalake/random/random-random_table+0+000000001*.avro")
发生错误:
Py4JJavaError: An error occurred while calling o111.load. : java.nio.file.AccessDeniedException: s3a://datalake/random: getFileStatus on s3a://datalake/random: com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: null), S3 Extended Request ID: null
我不明白为什么?
子文件夹由 kafka 连接器创建
请注意,如果我不使用通配符,我可以访问存储在这些子文件夹中的文件,如下所示:
DF_RANDOM = spark.read.format("com.databricks.spark.avro").load("s3a://datalake/random/random-random_table+0+0000000012.avro")
是否有任何策略或权限可以设置?
spark.read 指令似乎像文件一样读取 s3://datalake/random,但它是一个要浏览的文件夹
有什么想法吗?
谢谢大家
这是一个 Minio 问题
已在 2018-06-26T17:56:31Z 版本中修复
我正在尝试使用 Spark 读取多个文件 这些文件是 avro 文件,存储在名为 datalake
的 Minio 存储桶中我正在使用: 没有 hadoop 编译的 Spark 2.2.1
Minio(最新minio/miniodocker)
2 个包:com.databricks:spark-avro_2.11:4.0.0 和 org.apache.hadoop:hadoop-aws:2.8.3
我目前正在使用 pyspark 进行测试:
PYSPARK_PYTHON=python3 /usr/local/spark/pyspark --packages com.databricks:spark-avro_2.11:4.0.0,org.apache.hadoop:hadoop-aws:2.8.3
初始化与 Minio 的连接:
AWS_ID='localKey'
AWS_KEY='localSecret'
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", AWS_ID)
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_KEY)
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "http://127.0.0.1:9000")
当文件直接存储在存储桶根目录时,我可以像这样使用通配符:
DF_RANDOM = spark.read.format("com.databricks.spark.avro").load("s3a://datalake/random-random_table+0+000000001*.avro")
结果还可以:
DF_RANDOM.show()
+-----+-------------------+---+-------------+
|index| A| B| timestamp|
+-----+-------------------+---+-------------+
| 12| 0.5680445610939323| 1|1530017325000|
| 13| 0.925596638292661| 5|1530017325000|
| 14|0.07103605819788694| 4|1530017325000|
| 15|0.08712929970154071| 7|1530017325000|
+-----+-------------------+---+-------------+
但是,如果文件存储在子文件夹中:
DF_RANDOM = spark.read.format("com.databricks.spark.avro").load("s3a://datalake/random/random-random_table+0+000000001*.avro")
发生错误:
Py4JJavaError: An error occurred while calling o111.load. : java.nio.file.AccessDeniedException: s3a://datalake/random: getFileStatus on s3a://datalake/random: com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: null), S3 Extended Request ID: null
我不明白为什么? 子文件夹由 kafka 连接器创建
请注意,如果我不使用通配符,我可以访问存储在这些子文件夹中的文件,如下所示:
DF_RANDOM = spark.read.format("com.databricks.spark.avro").load("s3a://datalake/random/random-random_table+0+0000000012.avro")
是否有任何策略或权限可以设置? spark.read 指令似乎像文件一样读取 s3://datalake/random,但它是一个要浏览的文件夹
有什么想法吗?
谢谢大家
这是一个 Minio 问题
已在 2018-06-26T17:56:31Z 版本中修复