当前位置: 首页 > 编程日记 > 正文

系统设计与架构笔记:ETL工具开发和设计的建议

好久没写博客了,不是自己偷懒,的确是没有时间哦。

最近项目组里想做一个ETL数据抽取工具,这是一个研发项目,但是感觉公司并不是特别重视,不重视不是代表它不重要,而是可能不会对这个项目要求太高,能满足我们公司的小需求就行,想从这个项目里衍生出更多的东西估计难。昨天领导让我写写自己的见解,今天写了点,不过说见解还真不敢,所以取了个名字叫建议了,今天把这个文档贴到自己博客里和大伙分享分享。

贴文档之前,我想很多朋友估计并不熟悉ETL,如果接粗过数据挖掘一定对ETL很熟悉了,ETL是数据挖掘里非常重要的一环,具体什么是ETL,大家看下面这段文字:

     ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)作为BI/DW(Business Intelligence)的核心和灵魂,能够按照统一的规则集成并提高数据的价值,是负责完成数据从数据源向目标数据仓库转化的过程,是实施数据仓库的重要步骤。如果说数据仓库的模型设计是一座大厦的设计蓝图,数据是砖瓦的话,那么ETL就是建设大厦的过程。在整个项目中最难部分是用户需求分析和模型设计,而ETL规则设计和实施则是工作量最大的,约占整个项目的60%~80%,这是国内外从众多实践中得到的普遍共识。
ETL是数据抽取(EXTRACT)、转换(TRANSFORM)、清洗(CLEANSING)、装载(LOAD)的过程。是构建 数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。

我们所要做的ETL工具不是针对数据仓库,说白了就是要个安全稳定的数据库数据导出导入工具。下面就是我写的文档,希望童鞋们看了后请多多指教。

1.1.  概述

如图1-1:

ETL工具共分为三大模块:ETL核心模块、日志模块和WEB模块。

1.1.1.   ETL核心模块

ETL核心模块是整个ETL工具的核心,它主要的功能是根据事先定义好的规则将源数据库的数据抽取到目标数据库。其主要工作流程是:

数据抽取-->数据转换-->数据清洗-->数据加载

ETL工具里的配置数据库必须包含两个方面的数据:

  1. 元数据:元数据主要是指源数据、目标数据库以及可以用于抽取的表、字段等等信息,还有一些相关函数的定义等等。
  2. ETL任务信息:ETL任务在我们ETL工具里称作job,job是指一个将数据从源数据库导出,并且按照一定规则导入到目标数据库的过程,ETL任务信息就是指一个job的相关配置信息。

1.1.2.   日志模块

良好的系统最重要的特征之一就是它的差错、容错以及能正确提供系统运行信息的特性。所以日志模块是每个系统必不可少的部分,它设计的优劣直接关系到系统后期维护的成本。

ETL工具里的日志模块,我个人认为应该包含如下的部分:

  1. 程序运行信息。这个主要是用log4j在代码里记录。
  2. ETL任务(即job)运行失败的日志信息。一切因为程序所抛出的异常所引起的失败都要记录在log4j的运行日志里,如果能精确提炼出的常见异常,最好能记录在数据库的日志表,便于快速查找错误信息(这个在有WEB系统时候可以做)。
  3. 审计日志。审计日志是带有一定业务需求的日志,这个是否要记录看实际的需求。
  4. 错误告警。一般而言ETL抽取数据的操作都是一件漫长的事情,ETL开发人员不可能长时间坚守在系统旁边,所以当系统运行出错能在第一时间通知到相关负责人是很有必要。Log4j里有邮件通知的功能,用起来也不太难,可以考虑在日志模块加入告警的功能。

1.1.3.   WEB模块

当我们开发好了ETL工具后我们需要一个入口,告诉我们设计的ETL工具你具体做什么样的任务。WEB模块的作用就是给用户操作的入口,我个人认为WEB模块包含以下功能:

  1. 元数据管理:主要是向配置数据库定义源数据库和目标数据库的相关信息,例如:数据库的url,用户名,密码,相关的表以及表里字段信息等等。这些信息很重要,如果没有这些信息,整个ETL作业就是无源之水,根本无法进行。
  2. ETL任务的配置信息:即job的配置信息,这个就是定义我们ETL的抽取过程,例如ETL需要抽取的源数据库是那个,抽取那张表那些字段,按照什么规则转化数据,清洗数据,最终导入到那个目标数据库等等。
  3. 查看日志信息:这个功能可选,查看日志信息主要是提高系统的友好程度,便利系统运行信息的查看。
  4. 用户管理:这个功能暂时可选,因为我们所开发的ETL工具主要是内部使用,没有太大必要做复杂的权限管理,但是简单的用户信息管理做做应该还是必要的。

整个WEB模块也是可选的,如果人力和时间不够是没必要做一个web系统,ETL入口我们可以手动的配置任务信息。(假如真的做了WEB模块,对ETL后台的设计和开发要求也会更高)。

1.2.  关于技术开发的一点建议

我之前看过大家写的ETL需求文档,大家考虑的非常全面,这里我暂时有两个技术建议, 建议如下:

1.2.1.   Xml技术

Xml技术在企业级系统开发和互联网开发中使用十分广泛,xml使用的场景也是非常的多,其中一个特点非常适合我们在ETL工具开发中使用到,那就是它可以存储复杂的富有变化的数据结构。而我们定义ETL任务信息(job配置信息)就是一个复杂的富有变化的数据。大家看下面的例子:

<?xml version="1.0" encoding="UTF-8"?>
<Job>
<Id>流水号</Id>
<Extract>
<JDBCSource>
<Url></Url>
<Username></UserName>
<Password></Password>
</JDBCSource>
<JDNISource></JNDISource>
<Table></Table>
<Columns>
<Column></Column>
<Column></Column>

</Columns>
<Where></Where>
<Commit></Commit>
<OrderBy></OrderBy>
<FilePath></FilePath>
</Extract>
<Transform>
<Columns>
<Column>
<SrcColumn> <!-- 抽取的原字段-->
</SrcColumn>
<Methods>
<Method id="1"> <!-- 第一次转换-->
<Function>...</Function>
</Method>
<Method id="2"> <!-- 第二次转换-->
<Function>...</Function>
</Method>
</Methods>
<DesColumn> <!-- 加载的目标字段-->
</DesColumn>
</Column>
<Column>...</Column>
</Columns>
<SouceFilePath>...</SourceFilePath>
<TargetFilePath>...</TargetFilePath>
<Commit>...</Commit> <!--每一批次的处理条数 -->
</Transform>
<Load>
<JDBCSource>
<Url></Url>
<Username></UserName>
<Password></Password>
</JDBCSource>
<JDNISource></JNDISource>
<Table></Table>
<Columns>
<Column></Column>
<Column></Column>

</Columns>
<Commit></Commit>
<LoadFilePath></LoadFilePath>
</Load>
</Job>

这是一个job配置信息demo,如果我们把这些数据用数据库来存储解析起来一定是非常复杂,数据库的表结构不适合表现出程序里复杂的数据结构。

在这里我们不应该把XML当做配置文件看待,而是当做一种数据存储的介质,其作用主要是便于我们读写数据。

既然对xml有读写操作,因此使用digester解析xml的技术远远不够,这里我建议使用xmlbeans,xmlbeans对于读写xml更加的简便,关于xmlbeans的学习参考如下:

Xmlbeans的使用:

http://blog.163.com/pqg_iloveyou/blog/static/33351875200761811255619/

xsd的学习资料:

http://www.w3school.com.cn/schema/schema_example.asp

xmlbeans官网:

http://xmlbeans.apache.org/

xsd在eclipse开发起来十分的简便。

使用xmlbeans维护xml的成本也会比较低。

1.2.2.   Spring Batch技术

对于spring batch技术我现在还不是特别熟悉,到底能不能被我们使用还需要考察和研究,但现在我知道的它的几个特点很符合我们ETL工具开发的场景:

  1. spring batch批量处理框架,我们的抽取数据的过程就是一个批量的过程,因此spring batch是适合我们现在应用的场景。
  2. 我们抽取的数据先是存储在临时文件,现在规定的临时文件的格式是csv,而spring batch正好有批量操作csv文件的功能,这个也很符合我们应用的场景。

1.3.  总结

因为本人以前做过和ETL工具类似的项目,因此这里大胆的提出一点自己的建议,仅供参考。

不过我在概述里画的系统结构图希望大家可以好好看看,也许还有很多不合理的地方,这需要大家集体智慧进行改进,我个人觉得系统的整体架构设计十分重要,我在看需求分析时候虽然感觉大家写的很全面,但是很难对系统整体结构有一个清晰认识,究其原因是需求里缺乏对系统的整体架构设计的部分,我个人觉得系统整体设计很重要很有必要,整体架构设计会给我们带来很多好处:

  1. 整体架构设计会给我们需要做哪些功能有一个清晰的认识,这个认识会避免开发的时候遗漏了功能。
  2. 整体架构能清晰表现出各个功能模块的关系,做过开发的人应该都会有这样的体会,模块之间的交互的地方很容易产生问题,而且交互产生的问题也是很难查找定位的,整体架构设计会让我们清晰认识到模块交互关系,利于我们做模块之间交互的开发。
  3. 整体架构能清晰体现出模块之间的边界在哪里,这个很重要,不清晰模块之间的边界,很容易在把A模块的功能写到了B模块中,最终导致系统的不稳定。
  4. 整体架构的设计能给项目开发的分工做参考,更合理的安排工作,提高生产效率。






相关文章:

如何获取主机的IP址址

http://www.aspcn.com 飞刀 &#xff08;如需转载&#xff0c;请注明文章来自http://www.aspcn.com 谢谢合作&#xff09; 这篇文章&#xff0c;我们不准备大规模的讨论技术问题。只是向大家介绍一下我们将如何获得一台主机的IP地址。在Win32 API中我们可以使用NetWork API完成…

炸裂!Google这波操作,预警了什么?

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来&#xff0c;谷歌致力于推动围绕 GoogleCloud 的企业业务&#xff0c;但在这方面一直被亚马逊和微软吊打&#xff0c;这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

百度地图设置div样式宽高为百分比不显示地图

如题&#xff0c;不显示地图只要在样式代码里面加以 position:absolute; 代码就可以了 <style type"text/css">body, html,#allmap {width:100%;height:100%;overflow: hidden;margin:0;font-family:"微软雅黑";position:absolute;}</style> 完…

在DataGrid中显示图片

兼谈 DadaGrid 模板列的创建DadaGrid 是 ASP.NET 编程中一个很重要的控件&#xff0c;其优良的可定制功能为提高它的表现力提供了极大的方便。除了与数据源直接绑定以外&#xff0c;我们还可以通过列绑定模板对 DataGrid 的列进行自定义&#xff0c;来按照我们设定的格式显示数…

程序员注意了!人社部“就业报告”:未来5年,这10个新职业有千万缺口

7月23日&#xff0c;人社部联合阿里钉钉发布了《新职业在线学习平台发展报告》&#xff0c;报告有两个核心思想&#xff1a;83%的80后遇到过职业危机&#xff0c;79%的90后担心失业。未来5年&#xff0c;物联网和人工智能人才缺口巨大&#xff0c;新职业人才需求高达千万 这上千…

编译内核出现make CONFIG_DEBUG_SECTION_MISMATCH=y错误

故障问题&#xff1a; 编译内核时出现“make CONFIG_DEBUG_SECTION_MISMATCHy” 错误提示&#xff1a; [rootserver linux-2.6.35.13]# make modules CHK include/linux/version.h CHK include/generated/utsrelease.h CALL scripts/checksyscalls.sh Build…

IOS UITabBarViewController 修改背景颜色

做iOS的都知道&#xff0c;每个项目都有UITabBarController。有的会自定义&#xff0c;有的采取系统&#xff0c;当时我也是用系统的&#xff0c;那时候还是小白&#xff0c;好多技术不太熟练&#xff0c;都用系统的&#xff0c;那时候还是1倍和2倍图片&#xff0c;那时候适配很…

ASP.NET的实时天气及24小时天气预报(C#)

ASP.NET的实时天气及24小时天气预报(C#) 修改其中的url获得其他城市的天气情况 如广州为&#xff1a; http://weather.yahoo.com/forecast/CHXX0037_c.html 注意仅适用于获得yahoo上的天气预报 GetWeather.aspx ----------------------------------- Weather24小时天气getWeath…

中科大硬核“毕业证”:“一生一芯”计划下,5位本科生带自研芯片毕业

作者 | 包云岗编辑 | 伍杏玲本文经作者授权转载自包云岗知乎【CSDN编者按】近日&#xff0c;中国科学院大学五位本科生的硬核“毕业证”引发IT圈热议&#xff0c;在“一生一芯”培养计划下&#xff0c;由五位2016级本科生主导完成一款64位RISC-V处理器SoC芯片设计并实现流片&am…

美团选择电影票

2019独角兽企业重金招聘Python工程师标准>>> 特点: 1可以放大 (两根手指),可以看到缩略图 2可以左右滑动 3上下滑动 步骤: 1绘制座位 在美团点击 转载于:https://my.oschina.net/yanglingui/blog/776852

邮件发送类,支持HTML格式,支持优先级设置

www.chinacs.net 2002-5-9 中文C#技术站 邮件发送类&#xff0c;支持HTML格式&#xff0c;支持优先级设置。通过SOCKET类实现的using System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets; namespace Blood.Com.ClassLib{ /// <summary&…

手绘10张图,把CSRF跨域攻击、JWT跨域认证说得明明白白的

作者 | 写代码的明哥来源 | Python编程时光这篇文章本应该是属于 HTTP 里的一部分内容&#xff0c;但是我看内容也挺多的&#xff0c;就单独划分一篇文章来讲下。什么是跨域请求要明白什么叫跨域请求&#xff0c;首先得知道什么叫域。域&#xff0c;是指由 协议 域名 端口号 …

WYSE Thin Clinet 常用快捷键

1. 同时按住Ctrl Alt Up&#xff08;向上方向键&#xff09;&#xff0c;即可将远程连接由全屏状态切换到Window状态2. 同时按住Ctrl Alt Down&#xff08;向下方向键&#xff09;&#xff0c;即可在远程连接进程间切换&#xff08;类似于Windows系统的Alt Tab功能&…

CSS3模拟IOS滑动开关

前言 H5站点需要IOS滑动按钮的效果,想了想似乎CSS3能搞起,就折腾出来了...挺简单的..请看注释效果 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>CSS3模拟IOS开关</title> <style t…

PyTorch 1.6、TensorFlow 2.3、Pandas 1.1同日发布!都有哪些新特性?

作者 | 肖智清出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;7月29日&#xff0c;PyTorch 1.6、TenorFlow 2.3、Pandas 1.1恰巧同时发布。这三个库都是定期滚动更新&#xff0c;大约每个季度更新一次小版本。在AI内卷化达到“灰飞烟灭”的今日&#xff0c;仅仅会对P…

ENC28j60以太网芯片驱动程序简介

转载&#xff1a; 本介绍可分为三块内容&#xff1a; 1.以太网数据帧结构 符合IEEE802.3标准的以太网帧的长度是介于64-1516字节之间。主要由目标MAC地址、源MAC地址、类型/长度字段、数据有效负载、可选填充字段和循环冗余校验组成&#xff0c;另外在通过以太网介质发送数据包…

在ASP.NET中获取文件属性

www.chinacs.net 2001-8-13 中文C#技术站 在ASP.NET中获取文件属性&#xff08;Retrieving File Information In ASP.NET&#xff09;By Steven Smith 使用ASP.NET我们可以很容易的得到文件的相关信息&#xff0c;包括&#xff1a;文件名、路径、扩展名、大小和创建以及使用日…

javascript运动系列第九篇——碰撞运动

前面的话 碰撞可以分为碰壁和互碰两种形式&#xff0c;上篇介绍了碰壁运动&#xff0c;本文将从浅入深地介绍碰撞运动的互碰形式 碰撞检测 对于互碰形式的碰撞运动来说&#xff0c;首先要解决的是碰撞检测。对于矩形元素的碰撞检测前面的博文已经详细介绍过&#xff0c;下面主要…

Asp.Net 使用 GDI+ 绘制3D饼图入门篇源码

出处&#xff1a;www.knowsky.com 作者&#xff1a;www.knowsky.com <script languageJavaScript src"/ad/ad.js"></script> topn3dpie.aspx------------------<% Page language"c#" CodeBehind"topn3dpie.aspx.cs" AutoEventW…

【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

本系列文章由zhmxy555编写&#xff0c;转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7405479作者&#xff1a;毛星云 邮箱&#xff1a; happylifemxyqq.com 欢迎邮件交流编程心得上一节我们讲解了键盘消息处理相关的知识。键盘加鼠标作为目前人机交互…

当最懂 5G 的中国移动遇见云,移动云专题赛正式启动!

根据《中国云计算产业发展白皮书》预测&#xff0c;2023年中国云计算产业规模将超过3000亿人民币&#xff0c;其中&#xff0c;中国政府和企业上云率将超过60%。在国家新基建战略的大力推动下&#xff0c;5G和云计算迎来了巨大的发展契机。作为中国移动5G战略的重要组成部分&am…

spring配置文件详解【总结】

知其然&#xff0c;知其所以然 <?xml version"1.0" encoding"UTF-8"?> <beans:beans xmlns"http://www.springframework.org/schema/mvc" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

ucontext实现的用户级多线程框架3(实现echo服务器)

前面一篇文章实现了一个抢先式的用户级多线程框架&#xff0c;现在用那个框架编写一个echo服务&#xff0c; 因为只是个实验&#xff0c;所以代码写得比较杂乱&#xff0c;还有很多可能出错的情况也没有处理&#xff0c;这些在今后的进一 步研究中都会慢慢修改&#xff0c;下面…

asp.net 2.0中用GRIDVIEW插入新记录

出处&#xff1a;www.knowsky.com 作者&#xff1a;www.knowsky.com <script languageJavaScript src"/ad/ad.js"></script> name"mq" marginwidth"0" marginheight"0" src"../../ad.html" frameborder"no…

我在攻克机器学习硕士学位的那些年

编者按&#xff1a;人工智能发展日趋成熟&#xff0c;也成为众多开发者职业生涯的首选方向。然而相较于其他领域&#xff0c;人工智能中的深度学习、机器学习、计算视觉、神经网络等技术更为错综复杂&#xff0c;进修难度也更胜一筹。对此&#xff0c;对于入门和想要进阶的学生…

POJ 3174 暴力枚举

思路&#xff1a; 暴力枚举三个点 判一判 搞定 &#xff08;x1*y1x2*y2&#xff09; x1、y1、x2、y2为他们两两的差 //By SiriusRen #include <cstdio> using namespace std; int n,cnt; struct Point{int x,y;}point[888]; struct ans{int x,y,z;}ans[888]; int main…

TensorFlow、PyTorch夹缝之下:后浪的进击和野望

作者 | Just出品 | AI科技大本营&#xff08;rgznai100&#xff09;“我发现&#xff0c;软件研发总会延期。”一流科技CEO袁进辉说。按照他的预期&#xff0c;深度学习框架OneFlow做两年就能开源给开发者检验&#xff0c;但时间向后延长了近一年半&#xff0c;“确实预计的不准…

在Win 2003中配置ASP.net环境

作者&#xff1a;未知大家知道&#xff0c;Microsoft为了更好地预防恶意用户和攻击者的攻击&#xff0c;在默认情况下&#xff0c;没有将 IIS6.0 安装到 Windows Server 2003 家族的成员上。而且&#xff0c;当我们最初安装 IIS6.0 时&#xff0c;该服务在高度安全和"锁定…

网页中的数学公式

无意中发现一个在网页中显示数学公式的解决方案,MathJax&#xff0c;太崇拜这些人了&#xff01;他们才是真正地IT人&#xff0c;哪像国内我们这些民工&#xff1f; 代码如下&#xff1a; <!DOCTYPE html><html><head><title>MathJax AsciiMath Test P…

php删除目录下的所有文件和目录

<?php /*** 递归实现删除目录下的所有的文件和文件夹* param $dir 要删除的目录* param bool $deleteRootToo 是否删除根目录 默认不删除http://www.manongjc.com/article/1333.html*/ function unlinkRecursive($dir, $deleteRootToo false) {if(!$dh opendir($dir)){re…