【Java】Spark项目落地实战以及日常大数据开发注意事项

Spark简介
【Java】Spark项目落地实战以及日常大数据开发注意事项
基于内存的分布式集群计算平台
可适配 Python、Java、Scala、SQL
拓展功能:机器学习、流式计算、图计算

Spark特点
【Java】Spark项目落地实战以及日常大数据开发注意事项
高效

  • 内存计算引擎
  • DAG图
  • 比MapReduce快10~100倍

易用

  • 提供丰富的API,支持Java,Scala, Python
  • 代码量小

与Hadoop集成

  • 读写HDFS、Hbase、Hive
  • 和Yarn集成

与Oracle存过的对比
【Java】Spark项目落地实战以及日常大数据开发注意事项
Spark应用场景
【Java】Spark项目落地实战以及日常大数据开发注意事项

  • 数据仓库
  • 机器学习
  • 海量数据离线分析
  • 实时数据流处理

基本概念
【Java】Spark项目落地实战以及日常大数据开发注意事项
集群架构
【Java】Spark项目落地实战以及日常大数据开发注意事项

  • 集群资源管理器(Cluster Manager)
  • 运行作业任务的工作节点(Worker Node)
  • 每个应用的任务控制节点(Driver)
  • 每个工作节点上负责具体任务的执行进程 (Executor)
  • 资源管理器Mesos或YARN

任务执行流程
【Java】Spark项目落地实战以及日常大数据开发注意事项

  1. 首先为应用构建起基本的运行环境,即由 Driver创建一个SparkContext,进行资源 的申请、任务的分配和监控
  2. 资源管理器为Executor分配资源,并启动 Executor进程
  3. SparkContext根据RDD的依赖关系构建 DAG图,DAG图提交给DAGScheduler解 析成Stage,然后把一个个TaskSet提交给 底层调度器TaskScheduler处理; Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行, 并提供应用程序代码
  4. Task在Executor上运行,把执行结果反馈 给TaskScheduler,然后反馈给 DAGScheduler,运行完毕后写入数据并 释放所有资源。

数据处理过程
【Java】Spark项目落地实战以及日常大数据开发注意事项

  1. 读入外部数据源
  2. 转换算子进行数据处理
  3. 动作算子进行处理流程触发
  4. 处理完成输出结果

常用算子-转换
【Java】Spark项目落地实战以及日常大数据开发注意事项
开发案例--集团电信三码低效资产分析
【Java】Spark项目落地实战以及日常大数据开发注意事项
【Java】Spark项目落地实战以及日常大数据开发注意事项
Spark很香、也很坑
坑1:无法自定义自增序列
坑2:Spark Stage之间的血缘冗长
坑3:直连Oracle读取慢
坑4:时间格式支持不友好
常见问题1-无法自定义自增序列
问题阐述:
在不同的业务逻辑中,由于会存在多种维度的分析,但是他们的结果是写入到同一张表格中的。在oracle中执行的时候是根据oracle中定义的序列来保证ID的唯一性,但是 我们代码实现的时候采用的数据加载模式时无法加载oracle中的序列,并且读取序列也会收到oracle序列缓冲的影响。所以在业务逻辑处理上我们得自己定义一个属于我们 业务的ID序列,并且需要保证唯一性。
【Java】Spark项目落地实战以及日常大数据开发注意事项
【Java】Spark项目落地实战以及日常大数据开发注意事项
常见问题2-血缘关系冗长
问题阐述:
由于SparkSQL在解析成ATS树时会向上追溯血缘并重复解析,且随着血缘关系的增长ATS树会变的越来越复杂,导致任务执行效率会严重降低。具体表象为 Spark任务在执行过程中会卡住不动,程序继续卡顿几个小时之后才会开始继续运行。
【Java】Spark项目落地实战以及日常大数据开发注意事项
方案一:checkpoints方式切割方式
方案二:hdfs落地,使用时二次读取
常见问题3-读Oracle速率慢
问题阐述:
在读取Oracle时,数据表未做分区,程序无法通过指定分区并行加载数据,且为了减小数据库IO压力,采用限制高频、数据读取限制等策略,导致读取Oracle速 率很慢,影响计算效率。
【Java】Spark项目落地实战以及日常大数据开发注意事项
【Java】Spark项目落地实战以及日常大数据开发注意事项
常见问题4-Oracle时间格式支持不友好
问题阐述:
park在读写Oracle时date类型数据容易丢失精度,例如: Oracle中 2019-12-20 05:44:30读取后为2019-12-20, Spark中2019-12-20 05:44:30写入后变成2019-12-20 00:00:00
【Java】Spark项目落地实战以及日常大数据开发注意事项
解决方案:
Oracle方言,即自定义一种数据库解释语言,实际上的实现 为数据的类型转换。OracleDateTypeInit.oracleInit()

以上是 【Java】Spark项目落地实战以及日常大数据开发注意事项 的全部内容, 来源链接: utcz.com/a/88608.html

回到顶部