提交spark任务
使用spark-submit提交并运行spark任务。例:
spark-submit --master local[2] \
--name appName \
--class 主类的全路径 \
/home/hadoop/lib/mySpark-1.0.jar \
hdfs://hadoop001:9000/input/ hdfs://hadoop001:9000/output/
加入依赖
一般使用spark任务打包都是瘦包,即只包含代码,不包含spark和hadoop的相关包,因为我们提交代码的服务器运行都自带有这些环境包,无需额外上传。但是,很多时候需要加入第三方依赖包,如mysql包、fashjson包等,这些外部jar包则需要手动传人。常用的有以下两种方式:
- 采用assembly方式(需安装maven插件),对于不需要的spark和hadoop包,在pom中写provided属性,表示不打进jar包。形如:<scope>provided</scope>
- 采用–jars(推荐)
加载配置文件
运行spark-submit时会加载配置文件,默认加载conf/spark-defaults.conf文件
需要传入外部文件时,可使用 --files 参数,手动传入配置文件。
spark web UI
可以t展示已完成的和正在进行的任务,展示每个任务的stage、tasks、sizes、storage、environmental、executors信息。
默认端口:4040(4041,4042,etc)
默认情况,以上信息只在 spark application 运行期间有效。为了查看历史任务运行情况,可以启动任务前设置参数:spark.eventLog.enabled设置为true,并启动 spark history server。
注意: 一定要sc.stop(),已完成任务的页面才会有显示。
另:UI是从cache里加载50个history(默认),超过50个的部分从磁盘读取。
spark history server
在源码 org.apache.spark.deploy.history.HistoryServer 的 271 行注释如下:
/**
* The recommended way of starting and stopping a HistoryServer is through the scripts
* start-history-server.sh and stop-history-server.sh. The path to a base log directory,
* as well as any other relevant history server configuration, should be specified via
* the $SPARK_HISTORY_OPTS environment variable. For example:
*
* export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=/tmp/spark-events"
* ./sbin/start-history-server.sh
*
* This launches the HistoryServer as a Spark daemon.
*/
启动:./sbin/start-history-server.sh
启动前修改配置文件spark-env.sh:
- 默认spark_daemon_memory:1G,一般不够,灵活增加。
- spark_history_opts:配置项,通过-D设置。
默认页面刷新周期:10s
默认端口:18080
指定展示日志时的读取目录:
export spark_history_opts="-Dspark.history.fs.logDirectory=hdfs://namenode/spark-logs" - 可以指定日志目录(spark-defaults.conf):
打开开关:spark.eventLog.enabled true
指定位置:spark.eventLog.dir hdfs://namenode/spark-logs - web UI上支持排序,可以方便看出慢任务和数据倾斜的情况。(重点!!)
共享变量
共享变量有两种:广播变量和累加器
广播变量
允许程序员在每台计算机上缓存一个只读变量,而不是将其副本与任务一起发送,以降低通信成本。
例:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
累加器
可用于计数器和数值类型求和,也可自定义其他类型求和。
例:
scala> val accum = sc.longAccumulator("My Accumulator")
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum.add(x))
scala> accum.value
res1: Long = 10
可在web UI上查看到Accumulators的值。
注意:累加器必须写在action算子后,以下代码是错误的。
scala> val accum = sc.longAccumulator
scala> data.map { x => accum.add(x); x }
// Here, accum is still 0 because no actions have caused the map operation to be computed.
REST API
参考 spark 官网:http://spark.apache.org/docs/latest/monitoring.html
对于历史任务,使用 http://<server-url>:18080/api/v1,对于运行中的任务,使用 http://localhost:4040/api/v1,返回 json 数据格式。可以在后面拼接各种 Endpoint,返回想要的结果。