最近在自己电脑上装了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

此文进用于备忘和学习,若有不对,敬请指教!