Spark 技 术 研 究 与 实 践 分 享
About Me 田 毅 tianyi.asiainfo@gmail.com @ 亚 信 科 技 - 田 毅 Spark 社 区 Contributor 北 京 SparkMeetup 的 发 起 人 主 要 关 注 SparkSQL 与 Spark Streaming
提 纲 为 什 么 选 择 Spark Spark 实 践 分 享 使 用 Spark 的 建 议
为 什 么 选 择 Spark 多 种 计 算 场 景 的 结 合 多 数 据 源 的 计 算 中 心 活 跃 的 社 区 支 持
多 种 计 算 场 景 的 结 合 User Application 用 户 应 用 SQL 批 处 理 Streaming 流 处 理 MLlib 机 器 学 习 GraphX 图 计 算 Spark Core (SparkContext+RDD+DAG) 随 着 信 息 技 术 的 发 展, 越 来 越 多 的 企 业 面 临 着 复 杂 计 算 场 景 的 考 验 1 机 器 学 习 的 不 断 发 展 和 应 用 2 信 息 时 效 性 决 定 了 流 处 理 技 术 的 重 要 性 3 传 统 业 务 人 员 操 作 熟 练 的 SQL 编 写 能 力
多 种 计 算 场 景 的 结 合 假 设 场 景 : 与 新 浪 微 博 合 作, 通 过 一 个 消 息 队 列 实 时 接 收 微 博 信 息, 根 据 指 定 关 键 字 过 滤 消 息 消 消 微 息 息 Storm 博 队 队 列 列 传 统 方 案 : 使 用 Storm 读 取 消 息 队 列 内 容, 设 定 Bolt 进 行 关 键 字 过 滤
多 种 计 算 场 景 的 结 合 假 设 场 景 : 与 新 浪 微 博 合 作, 通 过 一 个 消 息 队 列 实 时 接 收 微 博 信 息, 根 据 指 定 关 键 字 过 滤 消 息, 再 通 过 实 时 配 置 SQL 对 微 博 进 行 统 计 分 析, 生 成 实 时 报 表 微 博 消 息 队 列 Storm 传 统 方 案 : 使 用 Storm 读 取 消 息 队 列 内 容, 设 定 Bolt 进 行 关 键 字 过 滤, 将 结 果 写 入 HDFS 使 用 Hive 或 者 Impala 实 现 SQL 统 计 分 析 H D F S Hive/ Impala
多 种 计 算 场 景 的 结 合 假 设 场 景 : 与 新 浪 微 博 合 作, 通 过 一 个 消 息 队 列 实 时 接 收 微 博 信 息, 根 据 指 定 关 键 字 过 滤 消 息, 通 过 机 器 学 习, 对 关 键 字 不 断 进 行 调 整, 再 通 过 实 时 配 置 SQL 对 微 博 进 行 统 计 分 析, 生 成 实 时 报 表 ; 微 博 消 息 队 列 Storm 传 统 方 案 : 使 用 Storm 读 取 消 息 队 列 内 容, 设 定 Bolt 进 行 关 键 字 过 滤, 将 结 果 写 入 HDFS 使 用 Hive 或 者 Impala 实 现 SQL 统 计 分 析 使 用 Mahout 实 现 机 器 学 习 算 法, 将 训 练 后 的 算 法 模 型 回 传 给 Storm H D F S Hive/ Impala Mahout
多 种 计 算 场 景 的 结 合 Spark 方 案 : 微 博 消 息 队 列 Spark Streaming + MLlib 消 息 队 列 优 势 : 1 同 一 套 架 构, 学 习 成 本 较 低 2 资 源 可 统 一 规 划 3 流 计 算 与 Machine Learning 数 据 交 互 简 单 商 业 产 品 :Databricks Cloud 开 源 产 品 :zeppelin https://github.com/nflabs/ zeppelin
多 数 据 源 的 计 算 中 心 对 于 大 多 数 公 司 来 说, 数 据 会 根 据 应 用 场 景 被 存 储 到 多 种 数 据 源 以 我 们 熟 悉 的 电 信 行 业 举 例 : 数 据 类 型 举 例 应 用 场 景 存 储 方 式 单 据 类 数 据 通 信 详 单, 账 单 随 机 查 询 HBase, Cassandra 日 志 类 数 据 关 系 类 数 据 信 令 数 据, 应 用 日 志 用 户 资 料, 订 购 关 系 汇 总 分 析 实 时 更 新, 关 联 查 询 HDFS RDBMS 但 是, 这 些 数 据 单 独 应 用 只 能 满 足 企 业 内 部 若 干 独 立 的 应 用 场 景 想 要 真 正 的 从 数 据 中 获 得 最 大 的 价 值, 必 须 让 所 有 数 据 关 联 到 一 起 进 行 计 算 分 析
多 数 据 源 的 计 算 中 心 计 算 引 擎 RDBMS ETL HDFS MR HBASE 复 杂 的 数 据 同 步 流 程 极 大 消 耗 网 络 带 宽 和 存 储 资 源
多 数 据 源 的 计 算 中 心 Spark 1.1.0 通 过 扩 展 RDD 实 现 外 部 数 据 访 问 Spark HadoopFileRDD RDBMS HDFS HBASE 使 用RDD 扩 展 存 在 的 问 题 : 只 能 全 量 获 取, 网 络 压 力 大, 无 用 传 输 太 多 引 用Cheng Lian@Databricks 在 Meetup 上 的 slide
多 数 据 源 的 计 算 中 心 Spark 1.2.0 External Datasource API BaseRelation 尽 可 能 将 列 过 滤 与 行 过 滤 在 Server 端 进 行, 降 低 传 输 大 小 可 以 更 好 的 利 用 数 据 源 的 特 性 TableScan 全 量 扫 描 PrunedScan 指 定 列 扫 描 PrunedFilteredScan 根 据 Filter 指 定 列 扫 描 (Parquet and ORC) 引 用Cheng Lian@Databricks 在 Meetup 上 的 slide
多 数 据 源 的 计 算 中 心 查 询 所 有 开 通 GPRS 用 户 中, 各 项 增 值 业 务 的 用 户 数, 平 均 年 龄, 总 花 费 select t2.businame, count(t2.user), avg(age), sum(t2.fee) from ( select businame, user, sum(fee) as fee from user_bill where busitype in ('sms','gprs') group by businame, user ) t1 left outer join ( select user, age from user_info where user_usegprs=1 ) t2 on t1.user = t2.user where t2.user is not null group by t2.businame requiredcolumns=(user,age) filter=( user_usegprs=1 ) SQL RDD DB2Relation ResultSet DB2 user_info SPARK RDD HBaseRelation RowSet requiredcolumns filter Hbase user_bill Filter
多 数 据 源 的 计 算 中 心 企 业 级 数 据 计 算 中 心 SPARK HBase RMDBS HDFS Cassandra Json Parquet
活 跃 的 社 区 支 持 2013 年 6 月 2014 年 6 月 2014 年 12 月 Contributor 数 量 参 与 贡 献 的 公 司 68 255 368 17 50 未 统 计 代 码 行 数 63000 175000 239000
活 跃 的 社 区 支 持 活 跃 的 邮 件 列 表 : user@spark.apache.org dev@spark.apache.org 日 均 70+ 的 邮 件 JIRA 问 题 收 集 : 日 平 均 报 告 / 解 决 issue 15 个 Github Pull Request: 日 平 均 merge pull request 10 个
活 跃 的 社 区 支 持 11 月 刚 刚 推 出 的 模 块 维 护 人 制 度, 确 保 每 个 模 块 都 有 至 少 2 个 committer 专 门 跟 踪 维 护 - Spark core public API: Matei, Patrick, Reynold - Job scheduler: Matei, Kay, Patrick - Shuffle and network: Reynold, Aaron, Matei - Block manager: Reynold, Aaron - YARN: Tom, Andrew Or - Python: Josh, Matei - MLlib: Xiangrui, Matei - SQL: Michael, Reynold - Streaming: TD, Matei - GraphX: Ankur, Joey, Reynold
Spark 实 践 分 享 使 用 Spark 实 现 信 令 数 据 的 实 时 营 销 使 用 Spark 实 现 广 告 竞 价 效 果 实 时 反 馈 平 台
使 用 Spark 实 现 信 令 数 据 的 实 时 营 销 场 景 描 述 : 输 入 数 据 用 户 信 令 数 据 : 每 秒 钟 5w 条 业 务 需 求 沉 淀 : 形 成 用 户 实 时 位 置 信 息 和 行 为 轨 迹 匹 配 : 合 适 的 业 务, 对 用 户 进 行 主 动 营 销 需 要 支 持 多 业 务 的 扩 展 输 出 数 据 用 户 实 时 位 置 信 息 用 户 历 史 行 为 轨 迹 需 要 进 行 业 务 营 销 的 用 户 信 息 难 点 大 量 的 数 据 查 询 更 新
业 务 架 构 主 流 程 业 务 流 程 1 数 据 筛 选 业 务 判 断 数 据 清 洗 消 息 队 列 数 据 增 强 消 息 队 列 业 务 流 程 2 数 据 筛 选 业 务 判 断 数 据 沉 淀 业 务 流 程 3 数 据 筛 选 业 务 判 断
技 术 架 构 1.0 消 息 队 列 增 量 数 据 Spark Streaming 预 处 理 业 务 流 程 消 息 队 列 输 出 数 据 增 量 数 据 业 务 流 程 外 围 系 统 增 量 数 据 HBase 输 出 数 据 增 量 数 据 HDFS 输 出 数 据 关 联 数 据 1 关 联 数 据 2 关 联 数 据 关 联 数 据 n
技 术 架 构 1.0 实 践 优 化 : Spark 优 化 Kafka 接 收 数 据 优 化 : 多 Topic, 多 Dstream,Repatition Task 并 行 数 量 优 化 Hbase 优 化 预 建 多 分 区 balance 表 现 : 集 群 处 理 吞 吐 能 力 无 法 满 足 要 求 分 析 : 集 群 规 模 较 小,Spark 最 大 并 发 任 务 数 不 到 300, 同 时 Hbase 操 作 平 均 不 到 150 Hbase 单 次 request 处 理 时 间 1-2ms, 每 秒 处 理 700( 单 线 程 ) 总 计 处 理 100000 每 秒 实 际 需 求 :5w*4 =200000 每 秒 结 论 : 机 器 数 量 有 限 时, 有 限 的 任 务 并 行 度 会 限 制 Hbase 的 吞 吐 能 力
技 术 架 构 2.0 消 息 队 列 增 量 数 据 Spark Streaming 预 处 理 业 务 流 程 消 息 队 列 输 出 数 据 增 量 数 据 业 务 流 程 外 围 系 统 增 量 数 据 增 量 数 据 RDD File HDFS 广 播 变 量 输 出 数 据 输 出 数 据 动 态 数 据 只 读 数 据
实 现 信 令 数 据 的 实 时 处 理 预 处 理 流 程 业 务 : 沉 淀 用 户 实 时 位 置 信 息 和 行 为 轨 迹 在 流 数 据 上 增 加 用 户 历 史 位 置 信 息 实 现 方 式 : val cogroup = leftrdd.cogroup(rightrdd).map { (lout, rout) } cogroup.cache() cogroup.flatmap(_._1) cogroup.flatmap(_._2) 流 入 数 据 输 出 数 据 COGroup 用 户 历 史 用 户 历 史 更 新
实 现 信 令 数 据 的 实 时 处 理 子 流 程 业 务 ( 举 例 ): 判 断 是 否 校 园 用 户 ( 根 据 校 园 基 站 列 表 ) 判 断 是 否 营 销 对 象 ( 根 据 用 户 资 料 表 与 营 销 规 则 表 ) 对 比 更 新 营 销 结 果 表 ( 避 免 重 复 营 销 ) 数 据 通 过 Kafka 发 给 营 销 系 统 实 现 方 法 : inputdstream.foreachrdd(rdd=>{ rdd.. registerastable( inputtable") val temprs = sql( xxxxx ) temprs.. registerastable( temptable") val result = sql( xxxxx ) }) 流 入 数 据 关 联 表 1 SQL 临 时 数 据 SQL 关 联 表 2 输 出 数 据
使 用 Spark 实 现 广 告 竞 价 效 果 实 时 反 馈 平 台 浏 览 网 页 竞 价 请 求 点 击 广 告 广 告 位 XX 网 站 广 告 交 易 平 台 出 价 竞 价 成 功 DSP 平 台 报 表 系 统 跳 转 浏 览 记 录 目 标 网 站 购 买 记 录
使 用 Spark 实 现 广 告 竞 价 效 果 实 时 反 馈 平 台 业 务 需 求 1: 1 实 时 收 集 所 有 出 价 记 录, 竞 价 成 功 记 录, 浏 览 记 录 和 购 买 记 录 2 按 广 告 位 统 计 : 最 近 2000 次 的 竞 价 成 功 次 数 最 近 2000 次 的 平 均 成 功 价 格 最 近 2000 次 的 点 击 比 率 3 将 实 时 统 计 结 果 反 馈 到 竞 价 模 块 对 竞 价 策 略 进 行 调 整 业 务 需 求 2: 1 按 广 告 主 统 计 : 出 价 次 数 花 费 金 额 转 化 率 等 等 指 标 2 将 实 时 统 计 结 果 更 新 到 报 表 模 块 展 示 技 术 难 点 : 1 数 据 量 较 大, 每 秒 消 息 数 量 在 3-5 万 2 不 按 照 常 用 的 时 间 窗 口 统 计, 而 按 照 竞 价 次 数 统 计
技 术 架 构 HDFS Spark Streaming 消 息 队 列 Spark Streaming 日 志 1 日 志 1 预 处 理 竞 价 统 计 反 馈 DSP 平 台 日 志 2 日 志 3 日 志 2 预 处 理 日 志 3 预 处 理 Spark Streaming 日 志 4 日 志 4 预 处 理 报 表 统 计
技 术 架 构 HDFS Spark Streaming 日 志 1 日 志 1 预 处 理 竞 价 统 计 反 馈 DSP 平 台 日 志 2 日 志 3 日 志 2 预 处 理 日 志 3 预 处 理 UNION &CACHE 报 表 统 计 日 志 4 日 志 4 预 处 理
预 处 理 数 据 获 取 数 据 清 洗 数 据 聚 合 格 式 转 换 数 据 清 洗 : DStream.filter: 清 洗 非 法 格 式 数 据 DStream.map: 清 洗 不 使 用 的 数 据 字 段 数 据 聚 合 : DStream.reduceByKey: 对 数 据 进 行 统 计 聚 合 维 度 : 广 告 位 广 告 主 格 式 转 换 : DStream.map: 将 数 据 转 换 格 式 为 统 一 格 式
竞 价 统 计 反 馈 数 据 获 取 数 据 聚 合 数 据 输 出 数 据 获 取 : DStream.filter: 按 需 获 取 需 要 的 数 据 数 据 聚 合 : DStream.updateStateByKey: 对 每 个 广 告 位 的 状 态 ( 统 计 信 息 ) 进 行 更 新 其 中 State 可 以 是 自 定 义 的 class 数 据 输 出 : DStream.mapPartition: 将 数 据 输 出 到 指 定 的 接 口 (http 或 者 JDBC)
SparkStreaming 实 施 中 的 问 题 Hdfs 文 件 正 在 生 成 时 文 件 后 缀 问 题 java.io.filenotfoundexception: File does not exist: / user/streaming/tmp/test/bidinput/2bid.gz._copying_ 产 生 原 因 : SparkStreaming 读 取 目 录 时 没 有 过 滤 正 在 拷 贝 的 文 件 Patch: [SPARK- 4314]
SparkStreaming 实 施 中 的 问 题 FileInputDStream 只 能 读 取 单 级 目 录 对 于 这 样 的 目 录 层 级, 无 法 使 用 SparkStreaming 读 取 --data --20141201 --20141202 --20141203 --20141204 Patch: [SPARK-3586]
SparkSQL 相 关 Patch HashOuterJoin 优 化 [SPARK-4483] 通 过 单 表 遍 历 的 方 式, 替 换 原 有 两 边 HashMap 的 Join 方 式 100 万 join 1 万 性 能 对 比, 性 能 提 升 16%, 内 存 消 耗 减 少 70% master: 耗 时 : 12671 ms 耗 时 : 9021 ms 耗 时 : 9200 ms Current Mem Usage:787788984 after patch: 耗 时 : 10382 ms 耗 时 : 7543 ms 耗 时 : 7469 ms Current Mem Usage:208145728
SparkSQL 相 关 Patch BroadcastHashOuterJoin 优 化 [SPARK-4485] 通 过 Broadcast 实 现 小 表 在 Map 端 实 现 OuterJoin 性 能 对 比, 性 能 提 升 7 倍 Original: left outer join : 15439 ms right outer join : 9707 ms Optimized: left outer join : 1992 ms right outer join : 1288 ms
SparkSQL 相 关 Patch 重 要 Feature: 动 态 分 区 功 能 [SPARK-3007] Window 函 数 功 能 [SPARK-1442]
使 用 Spark 的 建 议 如 何 与 社 区 互 动 参 加 meetup 活 动
如 何 与 社 区 互 动 最 简 单 的 方 法 : 加 入 spark-user 邮 件 组 发 送 邮 件 到 :user-subscribe@spark.apache.org ( 引 用 @ 连 城 404 在 beijingmeetup 上 的 分 享 Spark 社 区 协 作 指 南 ) 更 多 人 关 注, 可 以 及 时 得 到 丰 富 翔 实 的 答 案 更 易 于 积 累, 供 自 己 和 他 人 日 后 检 索 篇 幅 不 受 限 的 富 文 本 支 持, 可 以 清 晰 详 尽 地 描 述 问 题 英 语? 不 是 问 题 ( 惧 怕 英 语 才 是 问 题 )
参 加 meetup 活 动 2014 年 8 月 开 始, 在 北 京 组 织 了 中 国 首 个 Spark Meetup 小 组, 活 动 的 宗 旨 是 : 更 好 的 推 广 Spark 技 术, 推 进 中 国 Spark 使 用 者 的 技 术 交 流 12 月 13 日 刚 刚 举 行 了 第 4 次 meetup(sparksql 专 题 ) 活 动 活 动 得 到 Databricks 公 司 的 多 名 技 术 人 员 支 持, 并 且 汇 集 了 多 名 国 内 Spark 技 术 专 家 国 内 Spark Meetup 人 数 最 多 且 最 活 跃 的 小 组, 全 世 界 Spark Meetup 人 数 排 名 第 7 全 国 范 围 目 前 还 有 上 海, 杭 州, 深 圳 组 织 了 各 种 活 动 http://www.meetup.com/ 搜 索 beijing spark
按照惯例 加入我们的团队 Email to : tianyi@asiainfo.com 我们有 大量的大数据项目实践机 会 50+的Spark Patch提交记 录 请和我们一起把Spark做的 更好
谢 谢