传递第三方jars

当用spark-submit提交任务时,可以通过--jars选项传递第三方jars包,如果有多个jars,用逗号分开。

本地调试

用sbt打包好后,最好先在本地调试一下。可以把--master指定为local,然后把输入输出改为本地路径即可。

使用scala执行class

这个跟spark关系不大,但是有时可能也用得着。如果你依赖多个jar包,需要通过-cp指定:

scala -cp "lib1.jar:lib2.jar:your_program.jar" -J-Xmx2g com.your.HelloWorld arg arg1 arg2

com.your.HelloWorld就在 your_program.jar里面。注意这里jar是用冒号分开的。不是逗号
-J 可以输入jvm参数,比如指定heap大小为2G,-Xmx2g。

使用jdbc连接oracle等sql数据库

在spark2中,在调用spark-shell或者spark-submit的时候,先通过--jars指定依赖的jdbc jar包,比如oracle就是$ORACLE_HOME/lib/ojdbc6.jar, 然后在代码中,使用函数

val df = spark.read.format("jdbc")
.options(Map(
     "url" -> url,
     "driver" -> "oracle.jdbc.driver.OracleDriver",
     "dbtable" -> "DW_MP_API_NEW_DEVICE")).load()

读取表。

其中url的格式为:
jdbc:oracle:thin:username/passwd@ip_address:port:dbsid
thin之后的内容都是需要你来填写的
driver则指定了驱动类型

map、flatMap、mapValues,mapPartitions的区别

  • map:把RDD的每个元素进行转换,输入、输出数量不变,即一个输入对应一个输出,可能会改变key

  • flatMap:也是对RDD的每个元素进行转换,但是输出必须是TraversableOnce类型,即可遍历的列表,可以输出多个或者0个结果(即None)。这些结果会自动flatten,即拆分成很多单条记录。也会改变key

  • mapValues: 和map类似,但它只是PairRDD的函数,仅仅对value进行变换,不会改变key。和flatMap类似,PairRDD也有flatMapValues函数,也是不会改变key的。

  • mapPartitions: 它是对RDD的一部分元素,即一个partition进行批量转换,可以产生0或者多个结果,map在计算每个元素时都会启动一个任务(setup work),而mapPartitions是给一批元素启动一个任务,显然mapPartitions更加高效一些。
    最终这些结果会添加到新RDD中。它接受的输入输出都必须是Iterator类型。Iterator如果使用过,必须重置到开始位置,否则后面再使用,如map、foreach函数,就会丢失数据!这是我之前踩到的一个坑。

join、leftOuterJoin的区别

跟SQL类似,他们都是PairRDD的函数,假设有A、B两个rdd,有同样类型的key,A.join(B)的结果是A和B的交集,value是pair(valueOfA,valueOfB),即把A、B相同key的结果汇总到一个pair中。A.leftOuterJoin(B)的结果是(valueOfA,Option(valueOfB)),即A中存在的记录都会输出,对于A中存在,B中不存在的记录,pair的第二个元素就是None。A中不存在的记录则不会输出。

spark出现OOM(OutOfMemery)该怎么办

OOM错误或者exit 143都是内存溢出的结果。一般遇到这种情况,通过repartition增加part数,就可以解决。
或者增加spark.executor.memory的大小。注意的是,如果使用了动态内存分配,这个参数可能会无效。

spark出现time out,或者多次失败退出该怎么办

通过调节time out时长和增加重试次数解决,具体如下:

    --conf spark.task.maxFailures=8 \
    --conf spark.akka.timeout=3600 \
    --conf spark.network.timeout=3600 \
    --conf spark.executor.heartbeatInterval=300 \
    --conf spark.yarn.max.executor.failures=50 \
    --conf spark.rpc.retry.wait=60

在提交spark任务时,调整如上几个参数,timeout单位是秒。
增加重试次数,也能提高一定的稳定性。


flybywind
1.1k 声望38 粉丝