我们拥有的平面文件(CSV)的行数超过200,000,000,我们将其导入具有23个维表的星型模式中。最大的维度表有300万行。目前,我们在单台计算机上运行导入过程,大约需要15个小时。由于时间太长,我们想利用40台计算机来进行导入。

我的问题

如何有效利用40台计算机进行导入。主要的担心是,在所有节点上复制维表将花费大量时间,因为它们在所有节点上都必须相同。这可能意味着,如果将来我们使用1000台服务器进行导入,由于服务器之间的广泛网络通信和协调,它实际上可能比使用单个服务器慢。

有人有建议吗?

编辑:

以下是CSV文件的简化:

"avalue";"anothervalue"
"bvalue";"evenanothervalue"
"avalue";"evenanothervalue"
"avalue";"evenanothervalue"
"bvalue";"evenanothervalue"
"avalue";"anothervalue"

导入后,表如下所示:

Dimensions_table1
id  name
1   "avalue"
2   "bvalue"

Dimensions_table2
id  name
1   "anothervalue"
2   "evenanothervalue"

事实表
  dimension_table1_ID       dimension_table2_ID
    1                      1
    2                      2
    1                       2
    1                       2
    2                       2
    1                       1

最佳答案

将CSV数据加载到数据库中很慢,因为它需要读取,拆分和验证数据。

因此,您应该尝试的是:

  • 在每台计算机上设置本地数据库。这将摆脱网络延迟。
  • 在每台计算机上加载数据的不同部分。尝试为每台计算机分配相同的块。如果由于某种原因这不容易,则为每台计算机分配10,000行。完成后,给他们下一块。
  • 使用数据库工具
  • 转储数据
  • 将所有转储装入单个数据库

  • 确保您的加载器工具可以将数据导入到已经包含数据的表中。如果无法执行此操作,请检查数据库文档中的“远程表”。许多数据库都允许在本地显示来自另一个DB服务器的表。

    这使您可以运行insert into TABLE (....) select .... from REMOTE_SERVER.TABLE之类的命令

    如果您需要主键(并且应该),则在导入到本地DB的过程中分配PK时也会遇到问题。我建议将PK添加到CSV文件。

    [编辑] 在检查完您的修改后,您应该尝试以下操作:
  • 编写一个小程序,提取CSV文件第一和第二列中的唯一值。那可能是一个简单的脚本,例如:
     cut -d";" -f1 | sort -u | nawk ' { print FNR";"$0 }'
    

    这是一个非常便宜的过程(即使是巨大的文件也要花费几分钟)。它为您提供ID值文件。
  • 编写一个程序,该程序读取新的ID值文件,将其缓存在内存中,然后读取庞大的CSV文件,然后将这些值替换为ID。

    如果ID值文件太大,则只需对小文件执行此步骤,然后将大文件加载到所有40个每计算机DB中。
  • 将巨大的文件分成40个块,并将每个文件加载到每台计算机上。

    如果您有大量的ID值文件,则可以使用在每台计算机上创建的表替换所有剩余的值。
  • 使用备份/还原或远程表合并结果。

    或者,甚至更好的是,将数据保留在40台计算机上,并使用并行计算中的算法来拆分工作并合并结果。这就是Google可以在几毫秒内从数十亿个网页创建搜索结果的方式。

  • 参见here for an introduction

    09-08 01:16
    查看更多