spark 列出叶文件失败,文件不存在
spark Listing leaf files fails with File does not exist
在最近升级到 HDP 之后 3.1
现在使用 spark 2.3.x
而不是 2.2.x
查询如下:
spark.sql("SELECT * from mydb.mytable").filter('partition_date between "202001010000" and "202001020000").write.parquet("foo.out")
从 HDFS 支持的配置单元 table(无对象存储)读取时有时会失败。
您必须知道底层数据(Hive 中的 EXTERNAL table)有一个数据保留期,任何早于该日期的数据都将被删除。有时,这种删除可能发生在上述查询的执行过程中。删除每 5 分钟发生一次。
即使:
PartitionFilters: [isnotnull(partition_date#3099), (partition_date#3099 >= 202001010000), (partition_date#3099 <= 202001020000)]
分区过滤(谓词下推)似乎比初始路径遍历期间读取的所需分区更多。
升级到 2.3 后,Spark 在 UI 中显示列出文件目录的进度。有趣的是,我们总是得到两个条目。一个用于最旧的可用目录,一个用于感兴趣的两个边界中较低的一个:
Listing leaf files and directories for 380 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date==202001010000/sub_part=0, ...
Listing leaf files and directories for 7100 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date=201912301300/sub_part=0, ...
通知:
- 记录的文件数(308、7100)似乎都没有反映手动检查的建议
- 递归列出叶文件期间作业(有时)失败
错误信息:
文件不存在:/path/to/files/on/hdfs/mydb.db/mytable/partition_date=201912301300/sub_part=0/file_name_unique_hash_timestamp.par
如何强制 Spark 仅列出所需时间间隔内的目录,而不是在外部列出并可能与最大数据保留持续时间冲突?
看起来这是相关的:
- Spark lists all leaf node even in partitioned data(尽管对于 S3)
您尝试过 this 吗?
spark.sql("MSCK REPAIR TABLE table_name")
它多次救了我的命。
编辑。
在评论中讨论后,请尝试创建视图。除非在删除分区后立即重新运行 "select * from ..."才能解决问题。
创建视图将为您提供这样的解决方法:
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT * FROM mytable;
然后用您的观点替换 table。如果您无权创建此类视图,请让管理员为您创建。他们应该满足这个要求,因为在我看来你正在努力解决他们的问题。
@meniluca 是正确的,因为它必须与 HDFS 可用的不匹配,并且 Hive metastore 报告应该可用。
但是,与其使用看起来有点 spooky/not 易于理解的视图(在读取操作中包含文件路径的上下文中),我更喜欢:
spark.read.option("basePath", "/path/to/mydb.db/mytable").orc("/path/to/mydb.db/mytable/partition_date=202001[1-2]*/*", "/path/to/mydb.db/mytable/partition_date=202001[3-4]*/*")
这会强制 spark 列出正确的(所需路径)
在最近升级到 HDP 之后 3.1
现在使用 spark 2.3.x
而不是 2.2.x
查询如下:
spark.sql("SELECT * from mydb.mytable").filter('partition_date between "202001010000" and "202001020000").write.parquet("foo.out")
从 HDFS 支持的配置单元 table(无对象存储)读取时有时会失败。 您必须知道底层数据(Hive 中的 EXTERNAL table)有一个数据保留期,任何早于该日期的数据都将被删除。有时,这种删除可能发生在上述查询的执行过程中。删除每 5 分钟发生一次。
即使:
PartitionFilters: [isnotnull(partition_date#3099), (partition_date#3099 >= 202001010000), (partition_date#3099 <= 202001020000)]
分区过滤(谓词下推)似乎比初始路径遍历期间读取的所需分区更多。 升级到 2.3 后,Spark 在 UI 中显示列出文件目录的进度。有趣的是,我们总是得到两个条目。一个用于最旧的可用目录,一个用于感兴趣的两个边界中较低的一个:
Listing leaf files and directories for 380 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date==202001010000/sub_part=0, ...
Listing leaf files and directories for 7100 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date=201912301300/sub_part=0, ...
通知:
- 记录的文件数(308、7100)似乎都没有反映手动检查的建议
- 递归列出叶文件期间作业(有时)失败
错误信息:
文件不存在:/path/to/files/on/hdfs/mydb.db/mytable/partition_date=201912301300/sub_part=0/file_name_unique_hash_timestamp.par
如何强制 Spark 仅列出所需时间间隔内的目录,而不是在外部列出并可能与最大数据保留持续时间冲突?
看起来这是相关的:
- Spark lists all leaf node even in partitioned data(尽管对于 S3)
您尝试过 this 吗?
spark.sql("MSCK REPAIR TABLE table_name")
它多次救了我的命。
编辑。
在评论中讨论后,请尝试创建视图。除非在删除分区后立即重新运行 "select * from ..."才能解决问题。
创建视图将为您提供这样的解决方法:
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT * FROM mytable;
然后用您的观点替换 table。如果您无权创建此类视图,请让管理员为您创建。他们应该满足这个要求,因为在我看来你正在努力解决他们的问题。
@meniluca 是正确的,因为它必须与 HDFS 可用的不匹配,并且 Hive metastore 报告应该可用。
但是,与其使用看起来有点 spooky/not 易于理解的视图(在读取操作中包含文件路径的上下文中),我更喜欢:
spark.read.option("basePath", "/path/to/mydb.db/mytable").orc("/path/to/mydb.db/mytable/partition_date=202001[1-2]*/*", "/path/to/mydb.db/mytable/partition_date=202001[3-4]*/*")
这会强制 spark 列出正确的(所需路径)