在Windows 7 64位中删除Spark临时目录时出现异常

时间:2017-01-24 10:33:17

标签: hadoop apache-spark

我正在尝试在Windows 7 64位中运行spark作业的单元测试。我有

HADOOP_HOME=D:/winutils

winutils path= D:/winutils/bin/winutils.exe

我跑了下面的命令:

winutils ls \tmp\hive
winutils chmod -R 777  \tmp\hive

但是当我运行测试时,我得到以下错误。

Running com.dnb.trade.ui.ingest.spark.utils.ExperiencesUtilTest
Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.132 sec
17/01/24 15:37:53 INFO Remoting: Remoting shut down
17/01/24 15:37:53 ERROR ShutdownHookManager: Exception while deleting Spark temp dir: C:\Users\415387\AppData\Local\Temp\spark-b1672cf6-989f-4890-93a0-c945ff147554
java.io.IOException: Failed to delete: C:\Users\415387\AppData\Local\Temp\spark-b1672cf6-989f-4890-93a0-c945ff147554
        at org.apache.spark.util.Utils$.deleteRecursively(Utils.scala:929)
        at org.apache.spark.util.ShutdownHookManager$$anonfun$1$$anonfun$apply$mcV$sp$3.apply(ShutdownHookManager.scala:65)
        at .....

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=786m; support was removed in 8.0

Caused by: java.lang.RuntimeException: java.io.IOException: Access is denied
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:525)
        ... 28 more
Caused by: java.io.IOException: Access is denied
        at java.io.WinNTFileSystem.createFileExclusively(Native Method)

我试图手动改变permition ..每次我都得到同样的错误。

请帮忙

10 个答案:

答案 0 :(得分:3)

我以与你相同的方式设置了HADOOP_HOME变量。 (在Windows 10上)

设置权限时尝试使用完整路径,即

d产品:> winutils / bin / winutils.exe chmod 777 \ tmp \ hive

这对我有用。

另外,只是关于异常的注释 - 我通过运行“sys.exit”从cmd退出spark时遇到相同的异常。

但是......当我使用“:q”或“:quit”时,我可以干净利落地退出。所以,不确定这里发生了什么,仍然试图找出......

答案 1 :(得分:2)

尝试使用 spark-submit 命令运行WordCount示例后,我遇到了同样的问题。现在,我忽略了它,因为它在错误发生之前返回结果。

我在Spark Jira中发现了一些旧问题,但没有找到任何修复。 (顺便说一下,其中一个是关闭状态。)

https://issues.apache.org/jira/browse/SPARK-8333

https://issues.apache.org/jira/browse/SPARK-12216

不幸的是,似乎他们根本不关心窗户上的火花。

一个不好的解决方案是给所有人提供Temp文件夹(在大多数情况下为* C:\ Users \ 415387 \ AppData \ Local \ Temp *)。

所以它会是这样的:

winutils chmod -R 777 C:\Users\415387\AppData\Local\Temp\

但我强烈建议您这样做。

答案 2 :(得分:2)

问题出在ShutdownHook中,它试图删除临时文件但失败了。虽然您无法解决问题,但您可以通过在log4j.properties中的%SPARK_HOME%\conf文件中添加以下两行来隐藏例外情况。如果该文件不存在,请复制log4j.properties.template并重命名。

log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF
log4j.logger.org.apache.spark.SparkEnv=ERROR

看不见了。

答案 3 :(得分:2)

我对此有一种解决方法,您可以发出Windows命令来执行此操作,而不是让spark的ShutdownHookManager删除临时目录,

步骤:

  1. 使用spark.local.dir文件中的spark-defaults.conf更改临时目录

  2. log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF文件中设置log4j.properties

  3. spark-shell内部调用spark-shell.cmd文件。因此,添加rmdir /q /s "your_dir\tmp"

这应该有效!

答案 4 :(得分:1)

我遇到了类似的问题。我将权限更改为\ tmp文件夹而不是\ tmp \ hive

D:> winutils / bin / winutils.exe chmod 777 \ tmp

此后没有看到任何错误,并且有一个干净的退出

答案 5 :(得分:1)

在Windows中运行Spark会删除Spark temp问题。您可以按如下方式设置它以隐藏它。

Logger.getLogger("org").setLevel(Level.FATAL)

答案 6 :(得分:0)

我创建目录Sub StartButton() For Each ws In ActiveWorkbook.Worksheets ws.Visible = xlSheetVisible Next ws starttime = Timer Call ExtractTotals("Current", "Prov") Call ExtractTotals("Previous", "Prov") Call ExtractTotals("Current", "CCG") Call ExtractTotals("Previous", "CCG") Call ExtractWaitTimes("Current", "Prov") Call ExtractWaitTimes("Previous", "Prov") Call ExtractWaitTimes("Current", "CCG") Call ExtractWaitTimes("Previous", "CCG") 'Sheets("Current Year Main").Visible = xlSheetHidden 'Sheets("Previous Year Main").Visible = xlSheetHidden MsgBox ("finished in " & CStr(Timer - starttime)) End Sub Sub ExtractTotals(year As String, level As String) Application.ScreenUpdating = False Sheets(year & " Year Main").Select Cells(1, 1).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Sheets(year & " Year " & level & " Totals").Select Cells(1, 1).Select ActiveSheet.Paste i = 2 j = 2 Do Until Len(Sheets(year & " Year Main").Cells(i, 1)) = 0 Sheets(year & " Year Main").Select If level = "Prov" Then strlevel = "Provider" ElseIf level = "CCG" Then strlevel = "CCG" End If If Cells(i, 1) = strlevel And Cells(i, 4) = "Total" Then Cells(i, 1).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Sheets(year & " Year " & level & " Totals").Select Cells(j, 1).Select ActiveSheet.Paste j = j + 1 i = i + 1 Else i = i + 1 End If Loop Sheets(year & " year " & level & " Totals").Visible = xlSheetHidden Application.ScreenUpdating = True End Sub Sub ExtractWaitTimes(year As String, level As String) Application.ScreenUpdating = False Sheets(year & " Year " & level & " W Times").Cells.Clear Sheets(year & " Year Main").Select Cells(1, 1).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Sheets(year & " Year " & level & " W Times").Select Cells(1, 1).Select ActiveSheet.Paste i = 2 j = 2 Do Until Len(Sheets(year & " Year Main").Cells(i, 1)) = 0 Sheets(year & " Year Main").Select If level = "Prov" Then strlevel = "Provider" ElseIf level = "CCG" Then strlevel = "CCG" End If If Cells(i, 1) = strlevel And Cells(i, 4) = "Waiting Time" Then Cells(i, 1).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Sheets(year & " Year " & level & " W Times").Select Cells(j, 1).Select ActiveSheet.Paste j = j + 1 i = i + 1 Else i = i + 1 End If Loop Sheets(year & " year " & level & " W Times").Visible = xlSheetHidden Application.ScreenUpdating = True End Sub

我完全控制此目录下的所有人

我跑步

d:\spark\temp

然后我提交我的jar来火花并在浏览器中观看目录。

创建/删除了许多文件和目录,但是其中一个例外。

天哪,这不是正确的问题。

  

java.io.IOException:无法删除:D:\ data \ temp \ spark \ spark-9cc5a3ad-7d79-4317-8990-f278e63cb40b \ userFiles-4c442ed7-83ba-4724-a533-5f171d830913 \ simple-app_2。 11-1.0.jar

这是在尝试删除已提交的软件包时。可能不是所有相关进程都已发布它。

答案 7 :(得分:0)

我在Windows 10上的Hadoop环境:

HADOOP_HOME=C:\hadoop

Spark和Scala版本:

Spark-2.3.1 and Scala-2.11.8

下面是我的spark-submit命令:

spark-submit --class SparkScalaTest --master local[*] D:\spark-projects\SparkScalaTest\target\scala-2.11\sparkscalatest_2.11-0.1.jar D:\HDFS\output

基于Windows 10上的Hadoop环境,我在Scala主类中定义了以下系统属性:

System.setProperty("hadoop.home.dir", "C:\\hadoop\\")
System.setProperty("hadoop.tmp.dir", "C:\\hadoop\\tmp")

结果:我遇到了同样的错误,但是我的输出在输出路径D:\ HDFS \ spark-submit中传递的输出中生成了

希望这有助于绕过此错误,并获得在Windows本地运行的Spark的预期结果。

答案 8 :(得分:0)

在遵循了上述建议之后,我进行了以下更改-

更新 spark-defaults.conf 或创建spark-defaults.conf.template
的副本,并将其重命名为spark-defaults.conf

添加以下行- spark.local.dir = E:\ spark2.4.6 \ tempDir 通过上面的行,我们设置了临时文件夹供Spark使用。

类似地在您的spark设置中更新 log4j.properties ,与下面的代码一样-

log4j.logger.org.apache.spark.util.ShutdownHookManager = OFF log4j.logger.org.apache.spark.SparkEnv =错误

现在ShutdownHookManager将不会在退出过程中使用,从而导致控制台上出现这些错误行。

现在如何清洁临时文件夹呢?
因此,为此在 bin / spark-shell.cmd 文件中添加以下行-

rmdir / q / s“ E:/spark2.4.6/tempDir”
C:\ Users \ nitin \ AppData \ Local \ Temp \ jansi *。*

通过上述更新,我还可以看到临时文件夹清理也很干净。

答案 9 :(得分:0)

对于python:

创建一个空目录tmp \ hive

import os
os.system(command=f"path to \\bin\\winutils.exe chmod -R 777 path to \\tmp\\hive")