5-15号笔者参加了2016中国spark技术峰会,各演讲嘉宾分享了很多spark实践经验,本文整理了笔者印象比较深的内容,ppt详见峰会ppt
《spark and yarn :better together》
Hortonworks技术专家邵赛赛分享了spark如何更好地跑在yarn上,主要以下三点:
- Better use the resources
- Better run on cluster
- Easy to debug
Better use the resources
使用资源讲了计算内存和CPU,内存有几个公式,要注意不要 将spark executor的内存总和分配的太接近容器内容,要给堆外内存留一些空间:
- container memory = spark executor memory + overhead memory
- yarn.scheduler.minimum-allocation-mb <= container memory <= yarn.nodemanager.resource.memory-mb
- container memory will be round to yarn.scheduler.increment-allocation-mb
cpu有个公式是container cores <= nodemanger.resource.cpu-vcores,yarn可以用cgroup做物理隔离
Better run on cluster
hadoop 2.6支持给节点打标签label,可以让spark调度到你指定的节点上。
spark支持动态申请或释放executor,对于长期运行的应用很有用。可以通过以下的配置打开动态 资源分配
spark.streaming.dynamicAllocation.enabled true
spark.shuffle.service.enabled true
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
要想保证集群的高可用,应该配置关键节点自动重启,RM应该配置yarn.resourcemanager.ha.enabled,yarn.resourcemanager.recovery.enabled,NM应该配置yarn.nodemanager.recovery.enabled (hadoop 2.6)
Easy to debug
${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/application_${appid}/container_${contid} 该目录底下有详情的运行参数信息,可以用来方便的debug排查问题。
《Spark Streaming在腾讯广点通的应用》
腾讯高级软件工程师林立伟分享了spark streaming的实践,主要是用好spark steaming的特性,以及如何在生产中做优化。
特性
exactly-once
spark streaming支持exactly-once语义,一批数据要么全部成功要么全部失败,不会重复,可以用来做实时准确数据转义,确保最终输出的数目和输入是一致的。还可以应用于反作弊+计费这种不能重复计算的业务。
可靠状态
RDD天然支持中间 结果持久化,失败重试这些面向状态的可靠保证,可以用来做跨batch的聚合,做pv/uv计算,记录去重,微量实时更新的业务。
快速batch调度
spark streaming是由driver/jobscheduler进行调度,跟Mapreduce的调度相比,调度间隔更短,进程/线程常驻无启动时间 ,可以用来做数据指标监控,未成功数据快速重试这种数据量小,调度速度要求快的业务。
优化经验
•(1) 增加 Memory Back Pressure
•(2) 为 Spark Spark 增加新特性(无需编译 Spark Spark Spark 优化)
•(3)SparkSQL API > RDD APIAPI > RDD APIAPI
•(4) async execution within a task
•(5) try-cacth
•(6) concurrentJobs开启
•(7) Spark 远程调试
- 监控executor的内存使用,动态调整receiver接收速率,避免OOM。
- 增加新功能可以u编译spark工程,直接修改源文件**scala,运行参数增加spark.driver/executor.userClassPathFirst=false; spark.driver/executor.extraClassPath=app.jar。
- sqparksql运行更快,因为做了很多逻辑优化,内存占用更少,支持逻辑缓存,codegen执行优化。
spark 1.x用dstream.foreachRDD{rdd => rdd.toDF().select...},spark 2.x用spark. ... . stream. ... . startStream(). - 使用线程池加异步的方式,提高task 处理速度,可以同时批处理多个。
- 有些task的错误,比如could not compute split,在driver端catch,会提高系统健壮性
- 设置spark.streaming.concurrentJobs = n,同时执行n个output,一般1个batch对应1个output提高系统处理能力。
《Dataset in Spark SQL》
范文臣, Databricks 软件工程师。主要讲了DataSet的好处,更快,api更易用。
RDD通用性高,能支持各种特性,但不能检查sql的语法格式,不能做到编译时语法检查。1.6开始支持的DataSet,能够在编译时检查语法和字段错误,可以做到类型安全检查。
spark 2.0统一了DataSet和DataFrame,可以用 Dataset[Row] = DataFrame转换。
DataSet和常见的java,kyro相比序列化快,DataSet和RDD相比,内存占用更小,复杂sql运行更快 。但如果是简单操作,rdd会更快,因为没有优化空间,RDD不需要序列化节省了时间。