我在Cloudera VM上运行了一个SPARK项目。在我的项目中,我从镶木地板文件加载数据,然后处理这些数据。一切正常,但问题是我需要在学校集群上运行这个项目,但是我在这部分代码中读取镶木地板文件时遇到了问题:
DataFrame schemaRDF = sqlContext.parquetFile("/var/tmp/graphs/sib200.parquet");
我收到以下错误:
无法读取页脚:java.io.IOException:无法读取页脚 文件 时间filestatus {路径=文件:/var/tmp/graphs/sib200.parquet/_common_metadata; isDirectory = FALSE;长度= 413;复制= 0;块大小= 0; MODIFICATION_TIME = 0; access_time = 0;所有者=;基团=; 权限= RW-RW-RW-; isSymlink = false} at parquet.hadoop.ParquetFileReader.readAllFootersInParallel(ParquetFileReader.java:248) 在 org.apache.spark.sql.execution.datasources.parquet.ParquetRelation $$ anonfun $ 28.apply(ParquetRelation.scala:750)
基于在线搜索,这似乎是一个镶木地板版本问题。
我想要的是告诉我如何在计算机中找到已安装的镶木地板版本,以检查两者是否具有相同的版本。或者另外,如果您知道此错误的确切解决方案也将是完美的!
答案 0 :(得分:1)
尝试从S3读取实木复合地板文件时遇到相同的问题。就我而言,问题在于群集中的所有工作人员都无法使用所需的库。
有2种解决方法:
答案 1 :(得分:0)
如果你打开一个镶木地板文件(文本编辑器),在最底部你会看到类似" parquet-mr"这可以帮助您了解从
创建文件的版本/格式上面的方法虽然简单,但是"创建者"可以是像impala或其他可以创建镶木地板文件的组件,你可以使用镶木地板工具https://github.com/apache/parquet-mr/tree/master/parquet-tools
因为看起来你正在使用spark来读取镶木地板文件,你可以通过将spark.sql.parquet.filterPushdown设置为false来解决它。也许先尝试一下(这里有更多信息 - https://spark.apache.org/docs/latest/sql-programming-guide.html#configuration - 更新你最新版本的火花)。
如果这不起作用,那么可以尝试,如果这是最新版本的spark的问题 - 如果确实如此,那么你可以尝试跟踪哪些提交修复它的历史记录,这可能会让你深入了解可能的解决方法< / p>
或者如果您知道镶木地板版本,您可以使用(切换)木地板的相应分支(为此构建镶木地板工具)并使用该版本的工具来测试元数据文件(_metadata,_common_metadata)或一个镶木地板文件 - 你应该能够从那里重现错误和调试
答案 2 :(得分:0)
检查您的文件夹权限。我们已经在其他环境中看到此错误,这是由于Spark没有访问文件的权限引起的。
答案 3 :(得分:-1)
您可以尝试使用sqlContex.read.load而不是sqlContext.parquetFile。?
请参阅以下链接。 http://spark.apache.org/docs/latest/sql-programming-guide.html#generic-loadsave-functions
如果有效,请尝试让我知道。如果没有,我们可以尝试其他方式。