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
将 CSV 数据加载到数据库中的速度很慢,因为它需要读取、拆分和验证数据。
所以你应该尝试的是:
在每台计算机上设置本地数据库。这将消除网络延迟。
在每台计算机上加载数据的不同部分。尝试给每台计算机相同的块。如果由于某种原因这并不容易,请为每台计算机分配 10'000 行。当他们完成后,给他们下一块。
使用DB工具转储数据
将所有转储加载到单个数据库中
确保您的加载工具可以将数据导入到已包含数据的表中。如果您无法执行此操作,请检查数据库文档中的“远程表”。许多数据库允许使来自另一个数据库服务器的表在本地可见。
这允许您运行类似的命令insert into TABLE (....) select .... from REMOTE_SERVER.TABLE
如果您需要主键(并且您应该),那么在导入到本地数据库期间也会遇到分配 PK 的问题。我建议将 PK 添加到 CSV 文件中。
[编辑]检查您的编辑后,您应该尝试以下操作:
编写一个小程序,提取 CSV 文件第一列和第二列中的唯一值。这可能是一个简单的脚本,例如:
cut -d";" -f1 | sort -u | nawk ' { print FNR";"$0 }'
Run Code Online (Sandbox Code Playgroud)
这是一个非常便宜的过程(即使对于大文件也需要几分钟)。它为您提供 ID 值文件。
编写一个程序,读取新的 ID 值文件,将它们缓存在内存中,然后读取巨大的 CSV 文件并用 ID 替换这些值。
如果ID值文件太大,只需对小文件执行此步骤,然后将大文件加载到所有40个每机DB中。
将大文件分成 40 个块,并将每个块加载到每台机器上。
如果您有巨大的 ID 值文件,则可以使用在每台计算机上创建的表来替换所有剩余的值。
使用备份/恢复或远程表来合并结果。
或者,更好的是,将数据保留在 40 台机器上,并使用并行计算的算法来拆分工作并合并结果。这就是谷歌如何在几毫秒内从数十亿网页创建搜索结果的方式。
请参阅此处的介绍。
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |