0

我必须以有效的压缩率将大量爬网和日志数据存储在 Datastore 中。

到目前为止,我尝试并安装了 Cassandra、Couchbase、Mysql 和 FlatFile 格式,并阅读了Google Big Table、Hypertable 和LevelDB File Layout的架构概述。

Cassandra 和 Couchbase 的磁盘大小约为未压缩 Mysql 数据库的 1/5,但我想要更好的结果。

所以我需要一个具有高压缩特性的简单数据存储,如 vertica、teradata、oracle 和 sqlserver 产品。(页面级压缩)

实际的 flatFile 数据集看起来像

/oil_type/gas_station/2014-03/2014-03-05-23.csv
/oil_type/gas_station/2014-03/2014-03-06-00.csv
/oil_type/gas_station/2014-03/2014-03-06-01.csv

每个文件大约有 400 个高冗余条目,每个大约 5kb 一个文件可以从 1722 KB 压缩到 39 KB,因此根据压缩块的大小,应该可以实现 44:1 到 100:1 的压缩比。

定义用例:

我必须每 30 秒轮询一次所有相关的 gas_station 网页/api 以获得最新的定价信息,因为不可能为每个加油站编写解析器,索引创建需要通用解决方案。使用包含所有 craweld 加油站页面的数据库,可以轻松开发通用解析器并进行回测。使用此原始数据模型,应避免通过损坏的特定转换器丢失数据。

使用“oil_type-gas_station-timestamp-content”之类的键,可以轻松高效地比较两个加油站的价格随时间变化。对于读取小于压缩块大小的时间序列,只需解压缩 2 到 4 个块。

因此,以下功能是最佳的:

  • SSTables
  • 可配置的压缩选项(级别、压缩引擎、块大小(从 64kb 到 10 MB))
  • 范围扫描
  • Java 绑定
  • 列数据存储以实现更好的压缩

很高兴有:

  • 复制
  • 多主
  • 写入法定人数 1
  • 对数据进行前向和后向迭代。(比较两个时间序列)
  • 可配置的副本分布
  • 很少的依赖

问题:

Wich 免费数据库能够保存高冗余爬取数据的归档数据(只有几个字节变化),压缩好并且不会花费太多时间来查询随机记录。(与 mysql 归档格式相反,它必须解压缩整个表,直到请求的行)

也许有一个日志数据库,它能够索引很多日志行并在内部压缩它们?(logstash、fluentd、flume 的范围)

如果有人知道一些基准,关于这个主题的数字,这将有助于评估正确的技术。

我很高兴你的帮助!

4

1 回答 1

1

假设您处于多线程环境中,可能是多进程,LevelDB 不是一个好主意。

Cassandra 是用 Java 编写的,因此在处理大量大文件时您会看到过多的内存消耗,至少在不调整 JVM 的情况下是这样。此外,由于它是用 Java 编写的,因此对于真正好的压缩来说,它可能不够快。

我在我的 Linux 机器上使用 HyperTable 来存储照片和电影。
您可以使用任何具有 Thrift 支持的语言的 HyperTable。

此外,如果您需要它,您可以使用 C++ 驱动程序,以获得额外的速度。
HyperTable 的优点之一是它不会增加对 Java 的依赖,因为它是用 C++ 编写的,这也意味着它速度极快而且不会被垃圾回收(没有内存开销)。

然而,Hypertable 确实有一个 Java 客户端,开箱即用。
我使用我自己的 C# Thrift 客户端,它是从 Java 移植过来的。
有关代码,请参见 >这里<。

由于 HyperTable 在字节数组上运行,您可以简单地将文件作为字节数组放入 thrift-client 中,如果您在列定义中告诉它这样做,HyperTable 会自动为您压缩它。

如果你绝对想的话,你也可以试试 MongoDb。
顺便说一句, Mongo 实际上源自 hu mongo us。
但是,我必须说我从未“真正”使用过它。

于 2014-08-27T11:49:24.897 回答