传递第三方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,即拆分成很多单条记录。也会改变keymapValues: 和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单位是秒。
增加重试次数,也能提高一定的稳定性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。