【问题标题】:Spark: unable to load parquet files from HDFS until "put" them into hdfsSpark:无法从 HDFS 加载镶木地板文件,直到将它们“放入”hdfs
【发布时间】:2019-05-05 22:39:41
【问题描述】:

我有一个 c# 应用程序,可以创建 parquet 文件并将其上传到远程 HDFS。如果我使用 scp 将文件复制到安装了 HDFS 客户端的目标计算机,然后将文件“hdfs put”到 HDFS 中,则 spark 可以正确读取文件。

如果我使用 curl 针对 webhdf 服务将文件从客户端应用程序直接上传到 HDFS,则在尝试读取 parquet 文件时从 Spark 收到以下错误:

df = sqlContext.read.parquet("/tmp/test.parquet") 回溯(最近一次通话最后): 文件“”,第 1 行,在 镶木地板中的文件“/usr/hdp/current/spark2-client/python/pyspark/sql/readwriter.py”,第 303 行 返回self._df(self._jreader.parquet(_to_seq(self._spark._sc,paths))) 调用中的文件“/usr/hdp/current/spark2-client/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,第 1257 行 文件“/usr/hdp/current/spark2-client/python/pyspark/sql/utils.py”,第 69 行,在 deco 引发 AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException:u'无法推断 Parquet 的架构。必须手动指定。;'

如果我将两个文件(scp 上传的一个和通过 curl 上传的文件)提取到本地文件系统并在文件之间进行二进制差异,则差异不会显示任何差异。如果我将文件再次放入 HDFS(使用 curl 和 webhdfs 上传的文件),那么 Spark 可以很好地读取 parquet 文件。

这就像“hdfs put”创造了某种魔法,让 spark 很好地读取 parquet 文件。

会发生什么?谢谢

更新:如果我到本地一个包含多个 parquet 的目录并再次将其放入 HDFS 中,它不起作用,我必须将 parquet 文件一个一个放入以使 spark 读取它们

【问题讨论】:

    标签: scala apache-spark hdfs parquet webhdfs


    【解决方案1】:

    我终于弄清楚了错误的原因。上传文件的名称以“_”字符开头。这就是 spark 无法加载 parquet 文件的原因。

    【讨论】:

      【解决方案2】:

      您是否检查过 webhdfs 服务是否将文件放在同一路径 (/tmp/test.parquet) 下?换句话说,你可以用hdfs客户端(hdfs get)下载文件(通过webhdfs上传的)吗?

      最好的, 没关系

      【讨论】:

      • 是的,事实上我是在做两个文件之间的二进制差异之前做的。
      • 很奇怪。我可以想到两件事:1)一些同步错误。当您尝试运行 spark 程序时,该文件尚不可用。您是否尝试在成功完成 hdfs-client-get 后运行它? 2)权限和可见性搞砸了。您可以通过 Java Hadoop API 从 spark 程序中列出 HFDS 内容。这和 spark 使用的一样。
      • hdfs -get 成功后仍然失败,我会研究是否可能是一些权限问题。谢谢
      猜你喜欢
      • 2017-03-17
      • 2016-10-07
      • 2016-07-07
      • 2018-05-06
      • 2019-04-23
      • 2021-10-19
      • 2019-06-02
      • 2020-08-13
      • 2023-03-27
      相关资源
      最近更新 更多