当前位置: 首页 > news >正文

Spark 集群进行 ETL 的架构介绍

一 什么是ETL

ETL(extract提取、transform转换、load加载)。ETL负责将分散的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后,进行清洗、转换、集成,最后加载到数据仓库或数据集市中,成为联机分析处理、数据挖掘提供决策支持的数据。

二 使用Spark开发ETL系统的优势

  • 由于海量的日志记录、交易记录,单机进行ETL变得越来越困难。搭建一套具备大规模数据处理能力的ETL系统成为大数据分析系统中不可或缺的环节。由于Spark在大数据处理能力上的高效率、及其简单易用的API、同时对各种数据库的访问都实现了良好的支持,使用Spark来开发搭建ETL成为一个不错的选择。
  • 另外Spark DataFrame提供了详细的数据结构信息(即schema),使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。同时SPark DataFrame提供了丰富的操作API且可以直接基于DataFrame进行SQL操作,成为了ETL存储中间数据的首选。
  • 部署简单,只需要使用spark-submit命令提交worker即可。

三 相关架构和功能实现

在此只介绍一些常用且使用spark开发容易实现的功能。

3.1 数据清洗、转换:

  • 数据合并:多表关联合并,字段合并

  • 数据拆分:按一定规则进行数据拆分

  • 数据解析提取:利用Spark的UDF、UDAF、UDTF等特性,自定义数据语义解析函数。

3.2 数据加载

增量ETL:

  1. 使用时间戳作为增量字段,减小每次ETL的数据规模、提高数据ETL的效率。
  2. 使用自增序列值做增量ETL,系统自动记录上次ETL过程的截至序列值作为下一次ETL的增量序列值进行ETL。

全量ETL:

删除目标表数据,将源数据全部插入,同时对原始目标表数据备份。

3.3 异常处理

在ETL的过程中,必不可少的要面临数据异常而导致的ETL过程失败的问题,处理办法:

  1. 对于网络中断等外部原因造成的异常,设定尝试次数,
  2. 日志输出,记录ETL错误过程、执行的错误信息,Web方式查询及邮件通知。

四 相关组件、模块介绍

这里写图片描述

ETL_ON_SPARKEngine作为整个ETL的核心,主要承担一下几方面的职责:
1、负责从Hbase中读取配置库的配置数据,并制定任务调度计划。

2、解析数据获取语句,从数据源读取数据,以Spark DataFrame的形式暂存在Spark集群的内存中。从MySQL、Hive等结构化的数据库中读取数据比较好理解,就是一条Sql语句,最多在使用几个自定义函数。从hbase,MongoDB等半结构化的数据库中获取数据时,由于原始数据的字段具有层次关系、或者以Json等格式存在,需要进行字段的拆分、Json数据展平等过程。

3、对源Spark DataFrame进行字段转换与字段映射,生成一个新的Spark DataFrame。在这一步主要进行字段名称转换、字段类型转换、字段合并重组等操作。

4、将新的Spark DataFrame写入目标数据源中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • appium历史版本地址链接
  • k8s集群部署:建立第一个微服务-注册中心Eureka
  • udp网络通信 socket
  • 简单说说关于shell中zsh和bash的选择
  • Linux之ansible的playbook剧本(yaml文件)
  • VMwareWorkstation安装UOS系统(1070版本)教程
  • 如何识别和防范跨站请求伪造(CSRF)?
  • YOLO改进模块后不出现Glops参数问题
  • 【408 数据结构】第2章 线性表
  • PHP-SER-libs靶场通关(1-9)
  • 数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储
  • 国家新标准引领,油烟净化器为烟火气添清新活力
  • 网络安全(sql注入2,less3)
  • 苹果的“AI茅”之路只走了一半
  • TeamTalk数据库代理服务器
  • 【5+】跨webview多页面 触发事件(二)
  • 07.Android之多媒体问题
  • 2017-08-04 前端日报
  • C++类中的特殊成员函数
  • ERLANG 网工修炼笔记 ---- UDP
  • ES10 特性的完整指南
  • js算法-归并排序(merge_sort)
  • maven工程打包jar以及java jar命令的classpath使用
  • mysql外键的使用
  • Protobuf3语言指南
  • Python 反序列化安全问题(二)
  • Ruby 2.x 源代码分析:扩展 概述
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SpriteKit 技巧之添加背景图片
  • tweak 支持第三方库
  • 计算机常识 - 收藏集 - 掘金
  • 记一次删除Git记录中的大文件的过程
  • 简单基于spring的redis配置(单机和集群模式)
  • 前端临床手札——文件上传
  • 实习面试笔记
  • 译有关态射的一切
  • 用 Swift 编写面向协议的视图
  • RDS-Mysql 物理备份恢复到本地数据库上
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 进程与线程(三)——进程/线程间通信
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $.ajax()参数及用法
  • (10)STL算法之搜索(二) 二分查找
  • (13)Hive调优——动态分区导致的小文件问题
  • (2)空速传感器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (五)c52学习之旅-静态数码管
  • (五)Python 垃圾回收机制
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • .bat批处理(一):@echo off
  • .net 连接达梦数据库开发环境部署