Tips:
并行
集群计算。
并行计算。
硬件方面的概念
并发
并发执行。
线程方面的概念
一. Spark 简介
1.概念
Lightning-fast cluster computing。
快如闪电的集群计算。
大规模快速通用的计算引擎。
速度: 比hadoop 100x,磁盘计算快10x
使用: java / Scala /R /python
提供80+算子(操作符),容易构建并行应用。
通用: 组合SQL ,流计算 + 复杂分析。
DAG: direct acycle graph,有向无环图。
Spark 与 MR 关系: 基于hadoop的mr,扩展MR模型高效使用MR模型,内存型集群计算,提高app处理速度。
2.Spark 模块
Spark core //核心模块 ,通用执行引擎,提供内存计算和对外部数据集的引用。RDD
Spark SQL //SQL ,构建在core之上,引入新的抽象SchemaRDD,提供了结构化和半结构化支持。
Spark Streaming //流计算 DStream
Spark MLlib //机器学习
Spark graph //图计算
3.RDD
是spark的基本数据结构,是不可变数据集。
RDD中的数据集进行逻辑分区,每个分区可以单独在集群节点进行计算。
可以包含任何java,scala,python和自定义类型。
RDD是只读的记录分区集合。RDD具有容错机制。
创建RDD方式: 1)并行化一个现有集合. 2) 由另一个 RDD 转换
hadoop 花费90%时间 read, write。
内存处理计算。在job间进行数据共享。内存的IO速率高于网络和disk的10 ~ 100之间。
4. Spark RDD 内部包含5个主要属性
- 分区列表
- 针对每个split的计算函数。
- 对其他rdd的依赖列表
- 可选,如果是KeyValueRDD的话,可以带分区类。
- 可选,首选块位置列表(hdfs block location);
二. Spark 安装
1. local模式
1 | 1).下载spark-2.1.3-bin-hadoop2.7.tgz |
2. Stand alone 分布式
1 | 1). 配置其他主机的所有环境变量, 发送cs1上的.zshrc 到其它机器 |
3. Stand alone HA 模式
规划:
cs1, cs6 为 master
cs2~cs5 为 worker
1 | 1). 配置 HADOOP_CONF_DIR, 目的是找到 hdfs-site.xml 和 core-site.xml |
4. Spark 历史服务器(可选)
1 | 第一步: |
5. yarn 模式
…
三. Spark 简单体验
1. API
[SparkContext]
- Spark功能的主要入口点。代表到Spark集群的连接,可以创建RDD、累加器和广播变量.
- 每个JVM只能激活一个SparkContext对象,在创建sc之前需要stop掉active的sc。
[RDD]
- resilient distributed dataset,弹性分布式数据集。等价于集合。
[SparkConf]
- spark配置对象,设置Spark应用各种参数,kv形式。
2. Spark 实现 WordCount
2.1 spark-shell
1 | // 登录 shell |
2.2 idea 编程
[pom依赖文件]
1 | <dependencies> |
Scala 版
1 | import org.apache.spark.{SparkConf, SparkContext} |
Java 版
1 | import org.apache.spark.SparkConf; |
提交作业到 Spark 集群运行
1 | ======================================提交到本机 |
3. spark/sbin 下脚本分析
1 | [start-all.sh] |
4. 解决数据倾斜问题 (多次 map-reduce)
解决数据倾斜:
1> 先对每个 word 添加 个数 (word,1)
2> 取出 word, 在 word后随机拼接 _num, 然后再与 v 组成 (newK, v)元祖
3> 对新的 (k,v)进行 reduceByKey, 统计出每个 k 的个数 (newK, count)
4> 对结果继续进行 map, 去掉 _num, 把原本的 k 取出来, 再跟 count 组成新的元祖 (k,count)
5> 继续进行 reduceByKey, 此时并发量最多也只是随机数的个数了, 不会产生严重的数据倾斜, 计算出最终的结果
6> 存到文件中 saveAsTextFile
1 | // 执行防止数据倾斜的 MR, 最后存到 hdfs 上 |
执行的 DAG(有向无环图)
四. RDD 的 transform & action
1. 变换 (transform )
注意: 直到遇到一个不是返回 RDD 对象的方法/函数, 才会开始计算
Spark is lazy, so nothing will be executed unless you call some transformation or action that will trigger job creation and execution. Look at the following snippet of the word-count example.
变换: 返回指向新rdd的指针,在rdd之间创建依赖关系。每个rdd都有计算函数和指向父RDD的指针。
1 | map() //对每个元素进行变换,应用变换函数 |
2. 产生作业 Actions
1 | collect() //收集rdd元素形成数组. |