Spark.read.csv 错误:java.io.IOException:权限被拒绝

Posted

技术标签:

【中文标题】Spark.read.csv 错误:java.io.IOException:权限被拒绝【英文标题】:Spark.read.csv Error: java.io.IOException: Permission Denied 【发布时间】:2017-02-08 11:42:25 【问题描述】:

我正在使用 Spark v2.0 并尝试使用以下方法读取 csv 文件:

spark.read.csv("filepath")

但出现以下错误:

java.lang.RuntimeException: java.lang.RuntimeException: java.io.IOException: Permission denied
  at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
  at org.apache.spark.sql.hive.client.HiveClientImpl.<init>(HiveClientImpl.scala:171)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  at org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:258)
  at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:359)
  at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:263)
  at org.apache.spark.sql.hive.HiveSharedState.metadataHive$lzycompute(HiveSharedState.scala:39)
  at org.apache.spark.sql.hive.HiveSharedState.metadataHive(HiveSharedState.scala:38)
  at org.apache.spark.sql.hive.HiveSharedState.externalCatalog$lzycompute(HiveSharedState.scala:46)
  at org.apache.spark.sql.hive.HiveSharedState.externalCatalog(HiveSharedState.scala:45)
  at org.apache.spark.sql.hive.HiveSessionState.catalog$lzycompute(HiveSessionState.scala:50)
  at org.apache.spark.sql.hive.HiveSessionState.catalog(HiveSessionState.scala:48)
  at org.apache.spark.sql.hive.HiveSessionState$$anon$1.<init>(HiveSessionState.scala:63)
  at org.apache.spark.sql.hive.HiveSessionState.analyzer$lzycompute(HiveSessionState.scala:63)
  at org.apache.spark.sql.hive.HiveSessionState.analyzer(HiveSessionState.scala:62)
  at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49)
  at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64)
  at org.apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:382)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:143)
  at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:401)
  at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:342)
  ... 48 elided
Caused by: java.lang.RuntimeException: java.io.IOException: Permission denied
  at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:515)
  ... 71 more
Caused by: java.io.IOException: Permission denied
  at java.io.UnixFileSystem.createFileExclusively(Native Method)
  at java.io.File.createTempFile(File.java:2024)
  at org.apache.hadoop.hive.ql.session.SessionState.createTempFile(SessionState.java:818)
  at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:513)
  ... 71 more

我也尝试过使用.format("csv").csv("filepath"),但这也给出了相同的结果。

【问题讨论】:

确保你的“文件路径”有适当的权限 嗨 Bhavesh,文件路径具有以下权限:-rwxr-xr-x 3 pratyush04 hdfs 【参考方案1】:

如果您查看异常堆栈跟踪的最后一部分,您会发现此错误与“文件路径”处的文件没有足够的访问权限无关。

我在 Windows 客户端上使用 Spark shell 时遇到了类似的问题。这是我得到的错误

  at java.io.WinNTFileSystem.createFileExclusively(Native Method)
  at java.io.File.createTempFile(File.java:2024)
  at org.apache.hadoop.hive.ql.session.SessionState.createTempFile(SessionState.java:818)
  at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:513)

注意它在堆栈跟踪中是如何表示 WinNTFileSystem 的(当您将它作为 UnixFileSystem 时),这让我更仔细地查看了这个堆栈跟踪。我意识到当前用户无权在本地创建临时文件。更具体地说,org.apache.hadoop.hive.ql.session.SessionState 尝试在 Hive 本地暂存目录中创建一个临时文件。如果当前用户没有足够的权限来执行此操作,则会出现此错误。

对我来说,在 Windows 上,我意识到我必须“以管理员身份运行”用于运行 Spark Shell 的命令提示符。这对我有用。

对你来说,在 Unix 上,我猜是 sudo 或更新 Hive 配置以设置本地暂存目录,或者更新现有 Hive 配置的目录安全设置应该可以解决问题。

【讨论】:

知道进程尝试创建 TempFile 的路径吗?并非总是可以以 sudo/administrator 身份运行? "进程尝试创建 TempFile 的路径?"检查 $HIVE_HOME/conf/hive-site.xml 中 Hive 配置 hive.exec.scratchdir 属性中的本地暂存目录【参考方案2】:

试试这段代码可能会有所帮助

从 Csv 读取数据

Dataset<Row> src = sqlContext.read()
        .format("com.databricks.spark.csv")
        .option("header", "true")
        .load("Source_new.csv");`

将数据写入 Csv

src.write()
        .format("com.databricks.spark.csv")
        .option("header", "true")
        .save("LowerCaseData.csv");

【讨论】:

以上是关于Spark.read.csv 错误:java.io.IOException:权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Spark读取一个文件夹中的所有csv文件

为啥 spark csv 会过滤掉空行?

使用跳过行在 Spark 中读取 csv

读取 CSV 后具有奇怪值的 Spark 数据帧

Spark s3 csv文件读取顺序

改进此pyspark连接的最佳方法