我正在构建数据索引,这将需要以(document, term, weight)
的形式存储大量三元组。我将存储高达几百万这样的行。目前我正在MySQL中做这个简单的表格。我将文档和术语标识符存储为字符串值,而不是外键到其他表。我正在重新编写软件并寻找更好的数据存储方式。看看HBase的工作方式,这似乎很适合架构。我可以将document
映射到{term => weight}
,而不是存储大量的三元组。HBase是否有意义,如果它没有在分布式环境中运行?
我在单个节点上这样做,所以我不在乎分布式节点等。我应该坚持使用MySQL,因为它的工作原理,还是明智的尝试HBase?我看到Lucene将它用于全文索引(这与我正在做的类似)。我的问题是,单个HBase节点如何与单个MySQL节点进行比较?我来自Scala,所以直接的Java API可以通过JDBC和MySQL解析每个查询的优势吗?
我主要关心的是插入速度,因为这是以前的瓶颈。处理完后,我最终可能会把数据放回到MySQL中进行实时查询,因为我需要做一些在MySQL中更好的计算。
我会尝试两种原型,但我相信社区可以给我一些有价值的见解。
什么是您的插入模式?随机的,批量的,有序的?在批次插入过程中是否应该关闭键?确保使用插入表(...)values(),(),(),(),(),()...(),();所以你不要分析尽可能多的语句,让文本增长到大约mysql服务器通道限制的大小。 – Don 2009-11-07 02:32:29
插入将是随机的:我将扫描数十万个文件,每个文档产生数百个元组。没有排序(但我想通过加权频率从另一端进行排序)。 在我以前的MySQL实现中,是的,我按照您的建议将输入分为多个批次。我不记得尺码,但我尝试了正确的尺码。我也做延期插入,因为在插入时我不关心实时可用的数据。 – Joe 2009-11-07 09:18:21
看过MapReduce之后,这看起来像我可以以不同方式解决的问题(即不是连续写入表中,而是运行单个批处理),但可能更好。 – Joe 2009-11-07 09:19:06