SparkContext 错误 - 找不到文件 /tmp/spark-events 不存在
Posted
技术标签:
【中文标题】SparkContext 错误 - 找不到文件 /tmp/spark-events 不存在【英文标题】:SparkContext Error - File not found /tmp/spark-events does not exist 【发布时间】:2016-11-15 22:57:58 【问题描述】:通过 API 调用运行 Python Spark 应用程序 - 提交申请时 - 响应 - 失败 SSH 进入 Worker
我的python应用存在于
/root/spark/work/driver-id/wordcount.py
错误可以在
中找到/root/spark/work/driver-id/stderr
显示以下错误 -
Traceback (most recent call last):
File "/root/wordcount.py", line 34, in <module>
main()
File "/root/wordcount.py", line 18, in main
sc = SparkContext(conf=conf)
File "/root/spark/python/lib/pyspark.zip/pyspark/context.py", line 115, in __init__
File "/root/spark/python/lib/pyspark.zip/pyspark/context.py", line 172, in _do_init
File "/root/spark/python/lib/pyspark.zip/pyspark/context.py", line 235, in _initialize_context
File "/root/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 1064, in __call__
File "/root/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.io.FileNotFoundException: File file:/tmp/spark-events does not exist.
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:402)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:255)
at org.apache.spark.scheduler.EventLoggingListener.start(EventLoggingListener.scala:100)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:549)
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:59)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:234)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381)
at py4j.Gateway.invoke(Gateway.java:214)
at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:79)
at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:68)
at py4j.GatewayConnection.run(GatewayConnection.java:209)
at java.lang.Thread.run(Thread.java:745)
这表明 - /tmp/spark-events 不存在 - 这是真的 但是,在 wordcount.py 中
from pyspark import SparkContext, SparkConf
... few more lines ...
def main():
conf = SparkConf().setAppName("MyApp").setMaster("spark://ec2-54-209-108-127.compute-1.amazonaws.com:7077")
sc = SparkContext(conf=conf)
sc.stop()
if __name__ == "__main__":
main()
【问题讨论】:
禁用事件记录可能会有所帮助:SparkConf().set("spark.eventLog.enabled","false")...
【参考方案1】:
/tmp/spark-events
是 Spark 存储事件日志的位置。只需在主计算机中创建此目录即可。
$mkdir /tmp/spark-events
$ sudo /root/spark-ec2/copy-dir /tmp/spark-events/
RSYNC'ing /tmp/spark-events to slaves...
ec2-54-175-163-32.compute-1.amazonaws.com
【讨论】:
尝试在主机中创建目录。重试 API 调用。错误仍然存在 哦。所以我不得不在工人身上复制同样的东西。错误已解决。谢谢 “/tmp/spark-events”在哪里设置?我在 $SPARK_HOME/conf/spark-defaults.conf 中输入了以下属性: spark.eventLog.enabled true spark.eventLog.dir hdfs://host:port/user/root/spark-logs spark.history.fs.logDirectory hdfs://host:port/user/root/spark-logs【参考方案2】:尝试在本地计算机上设置我的 spark 历史服务器时,我遇到了相同的“文件文件:/tmp/spark-events 不存在”。错误。我已将日志目录自定义为非默认路径。为了解决这个问题,我需要做两件事。
-
编辑 $SPARK_HOME/conf/spark-defaults.conf
-- 添加这两行
spark.history.fs.logDirectory /mycustomdir
spark.eventLog.enabled true
创建从 /tmp/spark-events 到 /mycustomdir 的链接。ln -fs /tmp/spark-events /mycustomdir
理想情况下,第 1 步可以完全解决我的问题,但我仍然需要创建链接,所以我怀疑我可能错过了另一个设置。无论如何,一旦我这样做了,我就能够运行我的历史服务器并看到我的 webui 中记录了新的作业。
【讨论】:
对我有用,但我必须以相反的顺序创建符号链接。我做了 ln -fs /mycustomdir 。 /tmp/spark-events 我将 spark.eventLog.dir=/mycustomdir 添加到 spark-defaults.conf 中,因此不需要使用 ln 创建的软链接。【参考方案3】:将 spark.eventLog.dir 用于客户端/驱动程序
spark.eventLog.dir=/usr/local/spark/history
并使用 spark.history.fs.logDirectory 作为历史服务器
spark.history.fs.logDirectory=/usr/local/spark/history
如中所述:How to enable spark-history server for standalone cluster non hdfs mode
至少按照 Spark 2.2.1 版
【讨论】:
【参考方案4】:我刚刚在 master 节点上创建了/tmp/spark-events
,然后分发到集群上的其他节点上工作。
mkdir /tmp/spark-events
rsync -a /tmp/spark-events slaves:/tmp/spark-events
我的 spark-default.conf:
spark.history.ui.port=18080
spark.eventLog.enabled=true
spark.history.fs.logDirectory=hdfs:///home/elon/spark/events
【讨论】:
以上是关于SparkContext 错误 - 找不到文件 /tmp/spark-events 不存在的主要内容,如果未能解决你的问题,请参考以下文章
Spark 错误 - 值文本文件不是 org.apache.spark.sparkcontext 的成员
无法启动 Terminal Services 服务。错误 126: 找不到指定的模块。