5

我应该执行 ETL,其中源是一个大型且设计糟糕的 sql 2k 数据库和一个设计更好的 sql 2k5 数据库。我认为SSIS是要走的路。谁能建议一个待办事项清单或清单或需要注意的事情,这样我就不会忘记任何事情?我应该如何处理这个问题,这样它就不会在后面咬我。

4

5 回答 5

29

一些通用的 ETL 技巧

  1. 考虑按目的地组织它(例如,生成客户维度的所有代码都位于同一个模块中,无论来源如何)。这有时被称为面向主题的 ETL。它使查找内容变得更加容易,并将增加代码的可维护性。

  2. 如果 SQL2000 数据库一团糟,您可能会发现 SSIS 数据流是一种笨拙的处理数据的方式。通常,ETL 工具的扩展性很差,而且很复杂。金融公司中的所有数据仓库项目中,有一半是使用存储过程代码作为明确的架构决策来完成的——正是出于这个原因。如果必须将大量代码放入 sprocs 中,请考虑将所有代码放入 sprocs 中。

    对于涉及大量复杂清理或转换的系统,100% 存储过程方法更易于维护,因为它是将所有转换和业务逻辑放在一个地方的唯一可行方法。使用混合 ETL/sproc 系统,您必须查看多个位置以跟踪、排除故障、调试或更改整个转换。

  3. ETL 工具的最佳点是在您拥有大量数据源且转换相对简单的系统上。

  4. 使代码可测试,这样您就可以分离组件并单独测试。只能在 ETL 工具的复杂数据流中间执行的代码更难测试。

  5. 使数据提取哑,没有业务逻辑,并复制到暂存区。如果您的业务逻辑分布在提取和转换层中,您将拥有无法单独测试的转换,并且难以追踪错误。如果转换是从暂存区域运行的,则可以减少对源系统的硬依赖,从而再次增强可测试性。这是基于 sproc 的架构的一个特别胜利,因为它允许几乎完全同质的代码库。

  6. 构建一个通用的缓慢变化的尺寸处理程序或使用现成的(如果有)。这使得对这个功能进行单元测试变得更容易。如果这可以进行单元测试,则系统测试不必测试所有极端情况,只需测试提供给它的数据是否正确。这并不像听起来那么复杂——我写的最后一个是大约 600 或 700 行 T-SQL 代码。任何通用擦洗功能也是如此。

  7. 如果可能,增量加载。

  8. 检测您的代码 - 让它生成日志条目,可能会记录诊断信息,例如检查总数或计数。没有这个,故障排除几乎是不可能的。此外,断言检查是一种考虑错误处理的好方法(在 b 中的行数是否相等,A:B 关系真的是 1:1)。

  9. 使用合成密钥。使用来自源系统的自然键将您的系统与数据源联系起来,并且难以添加额外的源。系统中的键和关系应始终对齐 - 没有空值。对于错误,“未记录”,在维度表中创建特定的“错误”或“未记录”条目并与之匹配。

  10. 如果您构建操作数据存储(许多宗教战争的主题),请不要回收星型模式中的 ODS 密钥。一定要加入 ODS 键来构造维度,但要匹配自然键。这允许您任意删除和重新创建 ODS - 可能会更改其结构 - 而不会干扰星型模式。拥有此功能是真正的维护胜利,因为您可以随时更改 ODS 结构或强力重新部署 ODS。

第 1-2 点和第 4-5 点意味着您可以构建一个系统,其中任何给定子系统(例如单个维度或事实表)的所有代码都位于系统中的一个且仅一个位置。这种类型的架构也更适合大量数据源。

第 3 点与第 2 点相对。基本上,SQL 和 ETL 工具之间的选择是转换复杂性和源系统数量的函数。数据越简单,数据源的数量越多,基于工具的方法就越有说服力。数据越复杂,迁移到基于存储过程的体系结构的理由就越充分。一般来说,最好只使用或几乎完全使用其中之一,但不能同时使用两者。

第 6 点使您的系统更易于测试。测试 SCD 或任何基于更改的功能非常繁琐,因为您必须能够向系统提供多个版本的源数据。如果您将变更管理功能移动到基础架构代码中,您可以使用测试数据集对其进行单独测试。这是测试的胜利,因为它降低了系统测试要求的复杂性。

第 7 点是大数据量时需要观察的一般性能提示。请注意,您可能只需要对系统的某些部分进行增量加载;对于较小的参考表和尺寸,您可能不需要它。

第 8 点与任何无头进程密切相关。如果它在夜间出现问题,您希望有一些战斗机会,看看第二天出了什么问题。如果代码没有正确记录发生的事情并捕获错误,那么您将很难进行故障排除。

第 9 点赋予了数据仓库自己的生命。当仓库拥有自己的密钥时,您可以轻松地添加和删除源系统。仓库键也是实现渐变维度所必需的。

第 10 点是维护和部署的胜利,因为如果您需要添加新系统或更改记录的基数,可以重新构建 ODS。这也意味着可以从 ODS 中的多个位置加载一个维度(想想:添加手动会计调整),而不依赖于 ODS 键。

于 2009-01-13T19:33:38.267 回答
5

我拥有每天、每周、每月和每年将数据从 200 多个分布式数据库中提取到中央数据库的 ETL 流程经验。这是大量的数据,我们遇到了许多针对我们情况的问题。但在我看来,无论情况如何,都需要考虑几项:

  • 确保在源端和目标端都考虑文件锁定。确保其他进程没有锁定文件(并在必要时删除这些锁定并且有意义)很重要。

  • 为自己锁定文件。确保,尤其是在提取数据时锁定文件的源,这样您就不会获得中途更新的数据。

  • 如果可能,请提取增量,而不是所有数据。获取数据的副本,然后只提取已更改的行而不是所有内容。您的数据集越大,这一点就越重要。如果必须,请查看期刊和触发器,但随着在特定基础上拥有这些数据变得越来越重要,这可能是我给你的第一条建议。即使它为项目增加了大量时间。

  • 执行日志。确保你知道它什么时候工作,什么时候没有,并且在这个过程中抛出特定的错误可以真正帮助调试。

  • 文件,文件,文件。如果你建立了这个权利,你将建立它,然后很长一段时间都不会考虑它。但是可以保证,您或其他人将需要在某个时候重新使用它以增强它或进行错误修复。在这些情况下,文档是关键。

HTH,如果我想到别的,我会更新这个。

于 2009-01-13T19:33:33.413 回答
4

好吧,我正在为我所在的公司开发 ETL。

我们正在与 SSIS 合作。使用 api 生成和构建我们自己的 dtsx 包。

SSIS 对管理错误并不友好。有时你会得到一个“OleDb 错误”,它可能有很多不同的含义,具体取决于上下文。

阅读 API 文档(他们没有说太多)。

一些链接可以帮助您从那里开始: http ://technet.microsoft.com/de-de/library/ms135932(SQL.90).aspx

http://msdn.microsoft.com/en-us/library/ms345167.aspx

http://msdn.microsoft.com/en-us/library/ms403356.aspx

http://www.codeproject.com/KB/database/SSISProgramming.aspx?display=PrintAll&fid=382208&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=2551674

http://www.codeproject.com/KB/database/foreachadossis.aspx

http://wiki.sqlis.com/default.aspx/SQLISWiki/ComponentErrorCodes.html

http://www.new.facebook.com/inbox/readmessage.php?t=1041904880323#/home.php?ref=logo

http://technet.microsoft.com/en-us/library/ms187670.aspx

http://msdn.microsoft.com/ja-jp/library/microsoft.sqlserver.dts.runtime.foreachloop.foreachnumerator.aspx

http://www.sqlis.com/post/Handling-different-row-types-in-the-same-file.aspx

http://technet.microsoft.com/en-us/library/ms135967(SQL.90).aspx

http://msdn.microsoft.com/en-us/library/ms137709(SQL.90).aspx

http://msdn.microsoft.com/en-us/library/ms345164(SQL.90).aspx

http://msdn.microsoft.com/en-us/library/ms141232.aspx

http://www.microsoft.com/technet/prodtechnol/sql/2005/ssisperf.mspx

http://www.ivolva.com/ssis_code_generator.html

http://www.ivolva.com/ssis_wizards.html

http://www.codeplex.com/MSFTISProdSamples

http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/Q_23972361.html

http://forums.microsoft.com/MSDN/MigratedForum.aspx?siteid=1&PostID=1404157

http://msdn.microsoft.com/en-us/library/aa719592(VS.71).aspx

http://forums.microsoft.com/MSDN/MigratedForum.aspx?siteid=1&ForumID=80

http://blogs.conchango.com/jamiethomson/archive/2005/06/11/SSIS_3A00_-Custom-Logging-Using-Event-Handlers.aspx

http://blogs.conchango.com/jamiethomson/archive/2007/03/13/SSIS_3A00_-Property-Paths-syntax.aspx

http://search.live.com/results.aspx?q=%s&go=Buscar&form=QBJK&q1=macro%3Ajamiet.ssis

http://toddmcdermid.blogspot.com/2008/09/using-performupgrade.html?showComment=1224715020000

http://msdn.microsoft.com/en-us/library/ms136082.aspx

http://support.microsoft.com/kb/839279/en-us

对不起“垃圾邮件”,但它们对我非常有用。

于 2009-01-13T19:34:32.883 回答
3

我们正在做一个巨大的ETL(将客户端从旧版 AS400 应用程序迁移到 Oracle EBS),实际上我们有一个流程(经过修改)我可以推荐:

  1. 识别关键目标表/字段。
  2. 识别关键源表/字段。
  3. 与业务用户一起将源映射到目标。
  4. 分析质量问题的源数据。
  5. 确定谁对已识别的数据质量问题负责。
  6. 让责任方清理源中的数据。
  7. 根据步骤 1 - 3 中的信息开发实际的 ETL。

根据我的经验,最棘手的步骤是第 2 步和第 3 步——有时很难让业务用户一次性正确识别他们需要的所有位,并且更难正确识别数据的确切来源(尽管这可能与我看到的神秘文件和字段名称有关!)。但是,此过程应该可以帮助您避免重大失误。

于 2009-01-13T19:30:18.337 回答
0

该线程很旧,但我想提请您注意 ConcernedOfTunbridgeWells 的回答。这是非常好的建议,在所有方面。我可以重申一些,但这会减少其余部分,它们都值得仔细研究。

于 2009-06-19T14:40:57.857 回答