如何有效利用10台以上的计算机导入数据

Roh*_*ada 9 database star-schema

我们有大于200,000,000行的平面文件(CSV),我们将其导入具有23个维度表的星型模式.最大的维度表有300万行.目前我们在一台计算机上运行导入过程,大约需要15个小时.由于时间太长,我们希望利用40台计算机之类的东西进行导入.

我的问题

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

有没有人有建议?

编辑:

以下是CSV文件的简化:

"avalue";"anothervalue"
"bvalue";"evenanothervalue"
"avalue";"evenanothervalue"
"avalue";"evenanothervalue" 
"bvalue";"evenanothervalue"
"avalue";"anothervalue"
Run Code Online (Sandbox Code Playgroud)

导入后,表格如下所示:

dimension_table1

id  name
1   "avalue"
2   "bvalue"
Run Code Online (Sandbox Code Playgroud)

dimension_table2

id  name
1   "anothervalue"
2   "evenanothervalue"
Run Code Online (Sandbox Code Playgroud)

事实表

  dimension_table1_ID       dimension_table2_ID
    1                      1
    2                      2
    1                       2
    1                       2              
    2                       2
    1                       1
Run Code Online (Sandbox Code Playgroud)

mag*_*gma 10

您可以考虑使用64位哈希函数bigint为每个字符串生成ID,而不是使用顺序ID.

使用64位哈希码,您可以在哈希表中存储2 ^(32 - 7)或超过3000万个项目,之后有0.0031%的冲突机会.

这将允许您在所有节点上具有相同的ID,在"dispatch"和"merge"阶段之间的服务器之间无任何通信.

您甚至可以增加位数以进一步降低碰撞几率; 只是,您将无法在64位整数数据库字段中生成结果哈希值.

看到:

http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash

http://code.google.com/p/smhasher/wiki/MurmurHash

http://www.partow.net/programming/hashfunctions/index.html


Aar*_*lla 3

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

所以你应该尝试的是:

  1. 在每台计算机上设置本地数据库。这将消除网络延迟。

  2. 在每台计算机上加载数据的不同部分。尝试给每台计算机相同的块。如果由于某种原因这并不容易,请为每台计算机分配 10'000 行。当他们完成后,给他们下一块。

  3. 使用DB工具转储数据

  4. 将所有转储加载到单个数据库中

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

这允许您运行类似的命令insert into TABLE (....) select .... from REMOTE_SERVER.TABLE

如果您需要主键(并且您应该),那么在导入到本地数据库期间也会遇到分配 PK 的问题。我建议将 PK 添加到 CSV 文件中。

[编辑]检查您的编辑后,您应该尝试以下操作:

  1. 编写一个小程序,提取 CSV 文件第一列和第二列中的唯一值。这可能是一个简单的脚本,例如:

     cut -d";" -f1 | sort -u | nawk ' { print FNR";"$0 }'
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个非常便宜的过程(即使对于大文件也需要几分钟)。它为您提供 ID 值文件。

  2. 编写一个程序,读取新的 ID 值文件,将它们缓存在内存中,然后读取巨大的 CSV 文件并用 ID 替换这些值。

    如果ID值文件太大,只需对小文件执行此步骤,然后将大文件加载到所有40个每机DB中。

  3. 将大文件分成 40 个块,并将每个块加载到每台机器上。

    如果您有巨大的 ID 值文件,则可以使用在每台计算机上创建的表来替换所有剩余的值。

  4. 使用备份/恢复或远程表来合并结果。

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

请参阅此处的介绍

  • 必须有某种算法为 CSV 文件中的每一行分配唯一的 ID。我想说的是:在尝试将数据导入数据库之前*应用该算法。这样,您可以一次将数据加载到 N 个数据库中,而不会出现 PK 冲突。 (2认同)