Hadoop 在Windows 7 64位中删除Spark temp dir时出现异常
我正在尝试在Windows7 64位中运行spark作业的单元测试。我有Hadoop 在Windows 7 64位中删除Spark temp dir时出现异常,hadoop,apache-spark,Hadoop,Apache Spark,我正在尝试在Windows7 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.Experiences
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)
我已尝试手动更改权限。每次我都会犯同样的错误
请帮忙 我以与您相同的方式设置HADOOP_HOME变量。(在Windows 10上) 设置权限时尝试使用完整路径,例如 D:>winutils/bin/winutils.exe chmod 777\tmp\hive 这对我有用 另外,请注意这个异常——我通过运行“sys.exit”从cmd退出spark时得到了相同的异常
但是。。。当我使用“:q”或“:quit”时,我可以干净地退出。所以,我不确定这里发生了什么,仍然在试图弄清楚…在尝试使用spark submit命令运行WordCount示例后,我遇到了同样的问题。现在,我忽略它,因为它会在错误发生之前返回结果 我在spark Jira中发现了一些旧问题,但没有找到任何修复方法。(顺便说一句,其中一个处于关闭状态。) 不幸的是,他们似乎根本不关心windows上的spark 一个糟糕的解决方案是将临时文件夹(在您的案例中是*C:\Users\415387\AppData\Local\Temp*)权限授予所有人 所以会是这样的:
winutils chmod -R 777 C:\Users\415387\AppData\Local\Temp\
但是我强烈建议你不要那样做。我也面临着类似的问题。我将权限更改为\tmp文件夹而不是\tmp\hive D:>winutils/bin/winutils.exe chmod 777\tmp
在此之后没有看到任何错误,并且有一个干净的出口在windows中运行Spark时存在此删除Spark temp问题。您可以按如下方式设置它以隐藏它
Logger.getLogger(“org”).setLevel(Level.FATAL)
问题出在试图删除临时文件但失败的关闭钩子中。虽然您无法解决此问题,但只需将以下两行添加到%SPARK\u HOME%\conf
中的log4j.properties
文件中,即可隐藏异常。如果文件不存在,请复制log4j.properties.template
并重命名它
log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF
log4j.logger.org.apache.spark.SparkEnv=ERROR
看不见就是想不起来。我创建了一个目录
d:\spark\temp
我完全控制这个目录上的每个人
我跑
然后我将我的jar提交给spark,并在浏览器上查看目录
创建/删除了许多文件和目录,但其中一个文件和目录存在例外
我认为这不是一个正确的问题
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
这是在尝试删除提交的包时发生的。它可能尚未由所有相关进程发布。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")
结果:我得到了相同的错误,但我的输出是在spark submit中传递的输出路径D:\HDFS\output中生成的
希望这有助于绕过此错误并获得Spark在Windows上本地运行的预期结果。我有一个解决方法,而不是让Spark的
ShutdownHookManager
删除临时目录,您可以发出Windows命令来执行此操作
步骤:
spark defaults.conf
文件中的spark.local.dir
更改临时目录log4j.properties
文件中设置log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF
sparkshell
内部调用sparkshell.cmd
文件。因此,添加rmdir/q/s“您的\u dir\tmp”
这应该管用 在遵循上述建议后,我做了以下更改- 更新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”
del C:\Users\nitin\AppData\Local\Temp\jansi** 通过以上更新,我还可以看到清理退出和临时文件夹清理。对于python: 创建一个空目录tmp\hive
import os
os.system(command=f"path to \\bin\\winutils.exe chmod -R 777 path to \\tmp\\hive")
我更改了临时文件夹的权限以查看它,这就是问题所在,但它不起作用。此外,我还尝试使用--conf spark.local.dir指定一个不同的工作目录,该目录我知道我有权限,但也不起作用。所以这绝对不是权限问题。如果有人有解决方案,请共享。您还可以通过设置“java.io.tmpdir”java系统属性来更改此临时目录的位置,这样您就可以将其放在您可以轻松更改权限的其他地方。什么是“D:>”?这只是Windows cmd上的一个提示,当前位于D:drive中。我知道了,我把我的winutils放在那里了。谢谢我的是“C:\>“忽略这一点的问题是,未删除的临时文件会堆积起来并占用磁盘空间,大多数人不太可能在这个目录中找到它们。正确的“好友-外出”视图是不可能的。这是非常正确的。@UncleLongHair每隔一段时间,通过转到cmd并键入%temp%a来删除临时文件夹一直是一个好习惯删除一切,所以我相信这很好。
import os
os.system(command=f"path to \\bin\\winutils.exe chmod -R 777 path to \\tmp\\hive")