学习《腾讯在Spark上的应用与实践优化》

《腾讯在Spark上的应用与实践优化》原文参见:http://download.csdn.net/detail/happytofly/8637461

TDW: Tencent Distributed Data Warehouse,腾讯分布式数据仓库;
GAIA:腾讯自研的基于YARN定制化和优化的资源管理系统;
Lhoste:腾讯自研的作业的工作流调度系统,类似于Oozie;

TDW集群规模:

1. Gaia集群节点数:8000+;
2. HDFS的存储空间:150PB+;
3. 每天新增数据:1PB+;
4. 每天任务数:1M+;
5. 每天计算量:10PB+;

Spark集群:

1. Spark部署在Gaia之上,即是Spark on YARN模式,每个节点是 24 cores 和 60G 内存;
2. 底层存储包括:HDFS、HBase、Hive、MySQL;
3. 作业类型,包括:ETL、SparkSQL、Machine Learning、Graph Compute、Streaming;
4. 每天任务数,10K+;
5. 腾讯从2013年开始引入Spark 0.6,已经使用2年了;

Spark的典型应用:

1. 预测用户的广告点击概率;
2. 计算两个好友间的共同好友数;
3. 用于ETL的SparkSQL和DAG任务;

Case 1: 预测用户的广告点击概率

1. 数据是通过DCT(Data Collect Tool)推送到HDFS上,然后Spark直接将HDFS数据导入到 RDD&Cache;
2. 60次迭代计算的时间为1015分钟,即每次迭代1015秒;

Case 2: 计算两个好友间的共同好友数

1. 根据shuffle数量来确定partition数量;
2. 尽量使用sort-based shuffle,减少reduce的内存使用;
3. 当连接超时后选择重试来减少executor丢失的概率;
4. 避免executor被YARN给kill掉,设置 spark.yarn.executor.memoryoverhead
5. 执行语句 INSERT TABLE test_result SELECT t3.d, COUNT(*) FROM( SELECT DISTINCT a, b FROM join_1 ) t1 JOINSELECT DISTINCT b, c FROM join_2 ) t2 ON (t1.a = t2.c) JOIN (SELECT DISTINCT c, d FROM c, d FROM join_3 ) t3 ON (t2.b = t3.d) GROUP BY t3.d 使用Hive需要30分钟,使用SparkSQL需要5分钟;
6. 当有小表时使用broadcase join代替Common join7. 尽量使用ReduceByKey代替GroupByKey;
8. 设置spark.serializer = org.apache.spark.serializer.KryoSerializer;
9. 使用YARN时,设置spark.shuffle.service.enabled = true10. 在早期版本中Spark通过启动参数固定executor的数量,当前支持动态资源扩缩容特性

    * spark.dynamicAllocation.enabled = true
    * spark.dynamicAllocation.executorIdleTimeout = 120
    * spark.dynamicAllocation.schedulerBacklogTimeout = 10
    * spark.dynamicAllocation.minExecutors/maxExecutors

11. 当申请固定的executors时且task数大于executor数时,存在着资源的空闲状态。


<完>