我有一个在cloudera虚拟机上运行的spark项目。在我的项目中,我从Parquet文件加载数据,然后处理这些数据。一切正常,但问题是,我需要在一个学校集群上运行此项目,但在读取代码的这一部分的Parquet文件时遇到了问题:
DataFrame schemaRDF = sqlContext.parquetFile("/var/tmp/graphs/sib200.parquet");
我得到以下错误:
无法读取页脚:java.io.ioexception:无法读取文件filestatus的页脚{path=file:/var/tmp/graphs/sib200.parquet/\u common\u metadata;isdirectory=false;长度=413;复制=0;块大小=0;修改时间=0;访问时间=0;所有者=;组=;权限=rw rw rw-;issymlink=false}位于parquet.hadoop.parquetfilereader.readallfootersinparallel(parquetfilereader)。java:248)在org.apache.spark.sql.execution.datasources.parquet.parquetrelation$$anonfun$28.apply(parquetrelation。scala:750)
根据网上的搜索,这似乎是Parquet地板版本的问题。
我想从您那里得到的是告诉我如何在计算机中找到安装的Parquet地板版本,以便检查两者是否具有相同的版本。或者另外,如果你知道这个错误的精确解也是完美的!
4条答案
按热度按时间3z6pesqy1#
检查文件夹权限。我们在其他环境中也看到过这个错误,它是由spark没有访问该文件的权限造成的。
35g0bw712#
如果你打开一个Parquet文件(文本编辑器),在最下面你会看到类似“parquet mr”的东西,这可以帮助你知道创建文件的版本/格式
上面的方法虽然简单,但“创建者”可以是像impala或其他可以创建Parquet文件的组件,您可以使用Parquet工具https://github.com/apache/parquet-mr/tree/master/parquet-tools
因为看起来您正在使用spark读取Parquet文件,所以您可以通过将spark.sql.parquet.filterpushdown设置为false来解决这个问题。也许先试试吧(更多信息请点击这里-https://spark.apache.org/docs/latest/sql-programming-guide.html#configuration -更改spark的最新版本)。
如果这不起作用,那么也许可以尝试,如果这是一个最新版本的Spark问题-如果它这样做,那么你可以尝试跟踪的历史提交修复它,这可能会给你一个关于可能的解决办法的见解
或者,如果您知道Parquet地板的版本,您可以使用(切换)Parquet地板mr的相应分支(为此构建Parquet地板工具),并使用该版本的工具来测试元数据文件(\u metadata,\u common\u metadata)或其中一个Parquet地板文件-您应该能够再现错误并从中进行调试
vhmi4jdf3#
你能试试sqlcontex.read.load而不是sqlcontext.parquetfile吗。?
请参考下面的链接。http://spark.apache.org/docs/latest/sql-programming-guide.html#generic-loadsave函数
如果行得通,请告诉我。如果不行,我们可以试试别的办法。
hxzsmxv24#
我在尝试从s3读取Parquet文件时遇到了同样的问题。在我的例子中,问题是集群中的所有工作人员都无法使用所需的库。
有两种方法可以解决这个问题:
确保在spark submit命令上添加了依赖项,以便将其分发到整个集群
为集群中的每个worker在spark\u home上的/jars目录中添加依赖项。