最近在自己电脑上装了Spark 单机运行模式,Spark 启动没有任何问题,可是启动spark history时,一直报错,错误信息如下:
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Spark Command: /usr/local/java/jdk1.7.0_67/bin/java -cp ::/usr/local/spark/conf:/usr/local/spark/lib/spark-assembly-1.1.0-hadoop2.4.0.jar:/usr/local/spark/lib/datanucleus-core-3.2.2.jar:/usr/local/spark/lib/datanucleus-api-jdo-3.2.1.jar:/usr/local/spark/lib/datanucleus-rdbms-3.2.1.jar:/usr/local/hadoop/etc/hadoop -XX:MaxPermSize=128m -Dspark.akka.logLifecycleEvents=true -Xms512m -Xmx512m org.apache.spark.deploy.history.HistoryServer
========================================
15/01/07 15:08:55 INFO history.HistoryServer: Registered signal handlers for [TERM, HUP, INT]
15/01/07 15:08:55 INFO spark.SecurityManager: Changing view acls to: root,
15/01/07 15:08:55 INFO spark.SecurityManager: Changing modify acls to: root,
15/01/07 15:08:55 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root, ); users with modify permissions: Set(root, )
Exception in thread "main" java.lang.reflect.InvocationTargetException
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 org.apache.spark.deploy.history.HistoryServer$.main(HistoryServer.scala:187)
at org.apache.spark.deploy.history.HistoryServer.main(HistoryServer.scala)
Caused by: java.lang.IllegalArgumentException: Logging directory must be specified.
at org.apache.spark.deploy.history.FsHistoryProvider$$anonfun$2.apply(FsHistoryProvider.scala:41)
at org.apache.spark.deploy.history.FsHistoryProvider$$anonfun$2.apply(FsHistoryProvider.scala:41)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.deploy.history.FsHistoryProvider.<init>(FsHistoryProvider.scala:41)
... 6 more
/usr/local/spark/sbin/../logs/spark-root-org.apache.spark.deploy.history.HistoryServer-1-macor.out (END)
错误提示是 log directory 没有指定,找了半天也不知道该怎么设置,另外在这篇文章中《 Spark History Server处理流程分析》有相应的源码分析,通过学习,知道了是 spark.history.fs.logDirectory参数未指定,可是我还是不知道怎么设置啊!后来在这篇《 Spark History Server配置使用》文章中,知道可以有如下两种方法解决:
1.在启动 spark history进程时指定 spark.history.fs.logDirectory的值,如下:
start-history-server.sh hdfs://localhost:9000/sparkHistoryLogs
2.在conf/spark-defaults.conf中配置
history server相关的配置参数描述
1) spark.history.updateInterval
默认值:10
以秒为单位,更新日志相关信息的时间间隔
2)spark.history.retainedApplications
默认值:50
在内存中保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,当再次访问已被删除的应用信息时需要重新构建页面。
3)spark.history.ui.port
默认值:18080
HistoryServer的web端口
4)spark.history.kerberos.enabled
默认值:false
是否使用kerberos方式登录访问HistoryServer,对于持久层位于安全集群的HDFS上是有用的,如果设置为true,就要配置下面的两个属性
5)spark.history.kerberos.principal
默认值:用于HistoryServer的kerberos主体名称
6)spark.history.kerberos.keytab
用于HistoryServer的kerberos keytab文件位置
7)spark.history.ui.acls.enable
默认值:false
授权用户查看应用程序信息的时候是否检查acl。如果启用,只有应用程序所有者和spark.ui.view.acls指定的用户可以查看应用程序信息;否则,不做任何检查
8)spark.eventLog.enabled
默认值:false
是否记录Spark事件,用于应用程序在完成后重构webUI
9)spark.eventLog.dir
默认值:file:///tmp/spark-events
保存日志相关信息的路径,可以是hdfs://开头的HDFS路径,也可以是file://开头的本地路径,都需要提前创建
10)spark.eventLog.compress
默认值:false
是否压缩记录Spark事件,前提spark.eventLog.enabled为true,默认使用的是snappy
以spark.history开头的需要配置在spark-env.sh中的SPARK_HISTORY_OPTS,以spark.eventLog开头的配置在spark-defaults.conf
spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://localhost:9000/eventLogs
spark.eventLog.compress true
spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=7777 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://localhost:9000/sparkHistoryLogs"
参数描述:
spark.history.ui.port=7777 调整WEBUI访问的端口号为7777,端口可以根据自己修改
spark.history.fs.logDirectory=hdfs://localhost:9000/sparkHistoryLogs 配置了该属性后,在start-history-server.sh时就无需再显示的指定路径,需要根据实际修改
spark.history.retainedApplications=3 指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除
调整参数后启动start-history-server.sh就不需要加参数了
start-history-server.sh
此文进用于备忘和学习,若有不对,敬请指教!