标签: etl

PostgreSQL到数据仓库:近实时ETL /数据提取的最佳方法

背景:

我有一个PostgreSQL(v8.3)数据库,它针对OLTP进行了大量优化.

我需要半实时地从中提取数据(有些人必然要问半实时意味着什么,答案是我合理的频率但是我会务实,因为基准可以说我们希望每15分钟一次并将其送入数据仓库.

多少数据?在高峰时段,我们正在谈论每分钟大约80-100k行击中OLTP侧,非高峰时这将大幅下降到15-20k.最频繁更新的行每个约64个字节,但有各种表等,因此数据非常多样化,每行最多可达4000个字节.OLTP处于活动状态24x5.5.

最佳方案?

从我可以拼凑起来的最实用的解决方案如下:

  • 创建TRIGGER以将所有DML活动写入旋转的CSV日志文件
  • 执行所需的任何转换
  • 使用本机DW数据泵工具将转换后的CSV高效泵入DW

为什么这种做法?

  • TRIGGERS允许选择性表格成为目标,而不是系统范围+输出可配置(即成为CSV),并且相对容易编写和部署.SLONY使用类似的方法,开销是可以接受的
  • CSV易于快速转换
  • 易于将CSV泵入DW

考虑的替代方案......

  • 使用本机日志记录(http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html).问题是它相对于我需要的看起来非常冗长,并且解析和转换有点棘手.然而,它可能更快,因为我认为与TRIGGER相比,开销更少.当然它会使管理员更容易,因为它是系统范围的,但同样,我不需要一些表(一些用于持久存储我不想记录的JMS消息)
  • 直接通过ETL工具(如Talend)查询数据并将其泵入DW ...问题是OLTP模式需要调整以支持这一点并且有许多负面的副作用
  • 使用经过调整/攻击的SLONY - SLONY可以很好地记录日志并将更改迁移到从站,因此概念框架就在那里,但建议的解决方案似乎更简单,更清洁
  • 使用WAL

有没有人这样做过?想分享你的想法?

postgresql etl near-real-time data-warehouse data-extraction

14
推荐指数
1
解决办法
8594
查看次数

在Oracle 11g partiitioned表上收集并发统计信息

我正在开发Oracle 11g上的DWH.我们有一些大表(2.5亿行),按值划分.每个分区都分配给不同的馈送源,每个分区独立于其他分区,因此可以同时加载和处理它们.

数据分布非常不均匀,我们有数百万行的分区,并且分区不超过一百行,但我没有选择分区方案,顺便说一下我无法改变它.

考虑到数据量,我们必须确保每个分区始终具有最新的统计信息,因为如果后续的详细说明没有对数据的最佳访问权限,它们将永远持续下去.

所以对于每个并发的ETL线程,我们

  1. 截断分区
  2. 从暂存区域加载数据

SELECT /*+ APPEND */ INTO big_table PARTITION(part1) FROM temp_table WHERE partition_colum = PART1

(这种方式我们有直接路径,我们不锁定整个表)

  1. 我们收集修改分区的统计信息.

在项目的第一阶段,我们使用了这个APPROX_GLOBAL_AND_PARTITION策略并且像魅力一样工作

 dbms_stats.gather_table_stats(ownname=>myschema,
                              tabname=>big_table,
                              partname=>part1,
                              estimate_percent=>1,
                              granularity=>'APPROX_GLOBAL_AND_PARTITION',
                              CASCADE=>dbms_stats.auto_cascade,
                              degree=>dbms_stats.auto_degree) 
Run Code Online (Sandbox Code Playgroud)

但是,我们有一个缺点,当我们加载一个小分区时,APPROX_GLOBAL部分占主导地位(仍然比GLOBAL快很多),对于一个小分区,我们有例如10秒的加载和20分钟的统计.

所以我们建议切换到11g 的INCREMENTAL STATS功能,这意味着你没有指定你修改过的分区,你把所有参数保留在auto中,而Oracle做了它的魔力,自动了解哪个分区有被感动了.它确实有效,我们已经加快了小分区的速度.打开电话后,电话就变成了

 dbms_stats.gather_table_stats(ownname=>myschema,
                              tabname=>big_table,
                              estimate_percent=>dbms_stats.auto_sample_size,
                              granularity=>'AUTO',
                              CASCADE=>dbms_stats.auto_cascade,
                              degree=>dbms_stats.auto_degree) 
Run Code Online (Sandbox Code Playgroud)

请注意,您不再通过分区,并且未指定样本百分比.

但是,我们有一个缺点,可能比前一个更糟糕,这与我们的高水平并行性有关.

假设我们有两个同时启动的大分区,它们几乎同时也会完成加载阶段.

  1. 第一个线程结束插入语句,提交并启动统计信息收集.统计程序通知有2个分区已修改(这是正确的,一个已满,第二个被截断,正在进行事务),正确更新了两个分区的统计信息.

  2. 最终第二个分区结束,收集统计信息,它看到所有分区已经更新,并且什么也不做(这是不正确的,因为第二个线程同时提交了数据).

结果是:

PARTITION NAME | LAST ANALYZED        | NUM ROWS | BLOCKS | SAMPLE SIZE
-----------------------------------------------------------------------
PART1          | 04-MAR-2015 15:40:42 | 805731   | 20314  | 805731
PART2          | 04-MAR-2015 15:41:48 | 0 …
Run Code Online (Sandbox Code Playgroud)

oracle etl data-warehouse table-statistics oracle11g

14
推荐指数
1
解决办法
3247
查看次数

哪个更好,ETL还是ELT?

花了一些时间研究数据仓库,我创建了ETL(提取转换加载)和ELT(提取加载转换)过程.似乎ELT是一种更新的填充数据仓库的方法,可以更轻松地利用群集计算资源.我想听听其他人认为ETL和ELT相互之间的优势以及何时应该使用其中一种.

etl data-warehouse

13
推荐指数
2
解决办法
1万
查看次数

独立SSIS服务器的msdb数据库在哪里

我正在研究DWH应用程序.我被授予访问权限的服务器只安装了没有数据库引擎的SSIS.我收到的错误如下:

对象'sp_ssis_listfolders',数据库'msdb',架构'dbo'上的EXECUTE权限被拒绝.

我需要验证数据库引擎和msdb上的权限.有没有办法找到哪个服务器配置为托管msdb数据库?

sql-server ssis etl bids sql-server-data-tools

13
推荐指数
1
解决办法
395
查看次数

自动从.Dtsx文件中检索版本号

有没有办法或查询可以找到SSIS包的版本号(*.dtsx文件)?

我有*.dtsx我想要了解的Team Foundation Server中的文件.

手动方式是鼠标右键单击包并单击Compare以查看VersionBuild但是有数千个包,所以手动执行它是不可能的

注意:该过程应该是自动的,而不是手动的

sql sql-server ssis etl ssis-2012

13
推荐指数
2
解决办法
1700
查看次数

SSIS脚本任务丢失代码

我发生了一个非常奇怪的问题,导致脚本任务代码清除.我已经能够在2-3种不同的机器上进行测试.我们正在运行SSDT 15.4预览.重现的步骤如下.

  1. 在foreach循环容器内创建一个脚本任务.
  2. 在脚本任务中创建注释.
  3. 在foreach中更改或添加变量映射.
  4. 保存包裹.
  5. 关闭包裹.
  6. 打开包裹.
  7. 打开脚本任务,评论将消失.

作为我成功的最后一次尝试,我已升级到15.5.1并且问题仍然存在.

sql-server ssis etl sql-server-data-tools script-task

13
推荐指数
1
解决办法
1308
查看次数

SSIS与Oracle Data Integrator

目前我是一名主要与SSIS合作的数据工程师.在阅读市场上可用的ETL工具时,我发现Oracle有自己的ETL工具ODI(Oracle Data integrator).我搜索了Oracle Data Integrator和SSIS之间的公正比较.我没有找到任何关于此的文章.有一些偏见的文章,如:

基于Stackoverflow问题,有大约16000个关于SSIS的问题,而ODI有大约200个问题.这意味着SSIS更受欢迎.

两种技术之间是否有任何公正的比较?ODI提供哪些服务以及SSIS中没有的服务?

请我不是在寻找个人意见,我需要一个公正的答案

sql-server oracle ssis etl oracle-data-integrator

13
推荐指数
1
解决办法
1677
查看次数

JsonPath 在 Spring Cloud Data Flow 过滤器组件中无法正常工作

我正在尝试编写一个简单的 SCDF 流,该流从 Kafka 读取,通过特定值的存在过滤消息并将数据推送到 Mongo。作为其中的一部分,我必须按照#jsonPath 编写

 #jsonPath(payload,'$[?(@.metadata!=null)].metadata[?(@.trigger-routing!=
 null)].trigger-routing') == {'1'}
Run Code Online (Sandbox Code Playgroud)

我编写了一个示例测试,它将运行 SPeL 并验证它返回的内容(注意:我有意使用 @EnableIntegration 来连接与 SCDF 相同的 SPeL 功能配置文件,至少这是我的理论)

@SpringBootTest(classes = SpelTst.TestConfiguration.class)
public class SpelTst {

    @Configuration
    @EnableIntegration
    public static class TestConfiguration {

    }

    @Autowired
    IntegrationEvaluationContextFactoryBean factory;

    @Test
    public void test() throws JsonProcessingException {
        final StandardEvaluationContext context = factory.getObject();
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("#jsonPath(payload,'$[?(@.metadata!=null)].metadata[?(@.trigger-routing!= null)].trigger-routing') == {'1'}");

        final PixelHitMessage sampleOne = new PixelHitMessage()
                .setMetadata(ImmutableMap.of("trigger-routing", "1"))
                .toChildType();

        final PixelHitMessage sampleTwo = new PixelHitMessage()
                .setMetadata(ImmutableMap.of("trigger-routing", ""))
                .toChildType(); …
Run Code Online (Sandbox Code Playgroud)

java spring etl jsonpath spring-cloud-dataflow

13
推荐指数
1
解决办法
374
查看次数

将日志添加到Airflow日志

如何将自己的日志添加到自动生成的Apache Airflow日志中?任何打印语句都不会登录,所以我想知道如何添加我的日志,以便它也显示在用户界面上?

apache logging etl python-3.x airflow

12
推荐指数
2
解决办法
8478
查看次数

如何在SSIS中动态映射输入和输出列?

我必须通过SSIS从.dbf文件上传SQL Server中的数据。我的输出列是固定的,但输入列不是固定的,因为文件来自客户端,并且客户端可能会按照自己的样式更新数据。可能还有一些未使用的列,或者输入列的名称可能与输出列的名称不同。

我想到的一个主意是将SQL数据库表中的文件输入列与输出列进行映射,并仅使用文件ID行中存在的那些列。

但是我不知道该怎么做。您可以建议我这样做吗,否则您有任何想法吗?

表示例。

+--------+---------------+--------------+--------+ | FileID | InputColumn | OutputColumn | Active | +--------+---------------+--------------+--------+ | 1 | CustCd | CustCode | 1 | +--------+---------------+--------------+--------+ | 1 | CName | CustName | 1 | +--------+---------------+--------------+--------+ | 1 | Address | CustAdd | 1 | +--------+---------------+--------------+--------+ | 2 | Cust_Code | CustCode | 1 | +--------+---------------+--------------+--------+ | 2 | Customer Name | CustName | 1 | +--------+---------------+--------------+--------+ | 2 | Location | CustAdd | 1 | +--------+---------------+--------------+--------+

sql sql-server ssis etl ssis-2012

12
推荐指数
1
解决办法
2226
查看次数