# 毕业项目 **Repository Path**: wolfcub.com/graduation-project ## Basic Information - **Project Name**: 毕业项目 - **Description**: 大数据训练营毕业项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-14 - **Last Updated**: 2021-11-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 大数据训练营毕业项目 #### 分析一条TPCDS SQL(请基于Spark 3.1.1版本解答) https://github.com/apache/spark/tree/master/sql/core/src/test/resources/tpcds 1. 运行该[SQL](https://github.com/apache/spark/blob/master/sql/core/src/test/resources/tpcds/q73.sql),q73,并截图该SQL的SQL执行图 ` ./spark-3.1.1-bin-hadoop2.7/bin/spark-submit \ --conf spark.sql.planChangeLog.level=WARN \ --class org.apache.spark.sql.execution.benchmark.TPCDSQueryBenchmark \ --jars spark-core_2.12-3.1.1-tests.jar,spark-catalyst_2.12-3.1.1-tests.jar \ spark-sql_2.12-3.1.1-tests.jar \ --data-location tpcds-data-1g --query-filter "q73" >running.log 2>&1 &` [运行结果](https://gitee.com/wolfcub.com/graduation-project/blob/master/running.log) ![输入图片说明](https://images.gitee.com/uploads/images/2021/1114/154508_918c827a_330140.png "屏幕截图.png") 2. 该SQL用到了哪些优化规则(optimizer rules) - 常量折叠ConstantFolding - 列裁剪 ColumnPruning - 谓词下推 PushDownPredicates 3. 这里是列表文本 请各用不少于200字描述其中的两条优化规则 - 常量折叠,AND date_dim.d_year IN (1999, 1999 + 1, 1999 + 2),通过常量折叠优化为 AND date_dim.d_year IN (1999, 2000, 2001),上述语句中有一个纯常量运算表达式,即1999 + 1=2000,1999 + 2=2001。如果行数很多的话,每行都要计算一次该表达式的值,积少成多就浪费了很多时间(因为该表达式可以更加复杂)。所以通过常量折叠可以将它预先转化为1.0,消除了很多不必要的重复计算。 - 谓词下推, Filter isnotnull(c_customer_sk#154),最外层join关联判定出c_customer_sk不能为null。如果能够将SQL语句中的谓词逻辑(where条件、join on中的谓词条件)都尽量提前执行,下游处理已经过滤完毕的数据,能够减少工作量。 #### 架构设计题 > 你是某互联网公司的大数据平台架构师,请设计一套基于Lambda架构的数据平台架构,要求尽可能多的把课程中涉及的组件添加到该架构图中。并描述Lambda架构的优缺点,要求不少于300字。 ##### 架构图 ![架构图](https://images.gitee.com/uploads/images/2021/1114/180357_d2c4e8d3_330140.png "屏幕截图.png") ##### Lamba架构优缺点 优点: Lambda是比较经典的一款架构,以前实时的场景不是很多,以离线为主,当附加了实时场景后,由于离线和实时的时效性不同,导致技术生态是不一样的。而Lambda架构相当于附加了一条实时生产链路,在应用层面进行一个整合,双路生产,各自独立。在业务应用中,顺理成章成为了一种被采用的方式。 缺点: 架构复杂:两路架构,各自独立,落地完全不同,对齐困难。需要采用两路不同架构进行设计,架构设计需要考虑两路设计才可以统一数据。 计算资源:双路计算,双路生产会存在一些问题,比如加工逻辑Double,开发运维也会Double,资源同样会变成两个资源链路。并且会出现数据不一致的现象,监控也需要两路监控,如果有一路发生异常,会导致整体数据异常。 数据治理:数据散布在各个系统中,互相访问困难,存储整合资源困难,在数据治理过程中不容易达成数据指标统一,数据血缘关系,包括数据安全的统一治理。 #### 题目三:简答题(三选一) > B:简述Spark Shuffle的工作原理,要求不少于300字 ![Stage](https://images.gitee.com/uploads/images/2021/1114/170122_ce73b18d_330140.png "c88d4538-76ee-4144-8136-7830ca4225d4.png") Spark为分布式程序,分而治之,将数据分不到不同的Map进行分发,数据按照一定hash shuffle在磁盘中落地,最后进行汇总。shuffle分为write和read,write阶段会使用SortShuffle运行机制将状态及shuffel文件的位置等信息封装到MapStatue对象中,然后发送给Driver,readj阶段会从Dirver拉取MapStatue,解析后开始执行Reduce操作。 shuffle 是划分 DAG 中 stage 的标识,同时影响 Spark 执行速度的关键步骤,shuffle只发生在两个Stage之间。RDD 的 Transformation 函数中,又分为窄依赖(narrow dependency)和宽依赖(wide dependency)的操作.窄依赖跟宽依赖的区别是是否发生 shuffle(洗牌) 操作.宽依赖会发生 shuffle 操作. 窄依赖是子 RDD的各个分片(partition)不依赖于其他分片,能够独立计算得到结果,宽依赖指子 RDD 的各个分片会依赖于父RDD 的多个分片,所以会造成父 RDD 的各个分片在集群中重新分片。