1

我想知道 Stackoverflow 社区是否可以通过建议一种可以解决我的问题的技术(即 HBase、Raiku、Cassandra 等)来帮助我。我有一个大型数据集,我们想实时更新和查询,大约10 兆兆字节。我们的数据集是一个像素流,其中包含一个用户 ID 和一个或多个特征(通常大约 10 个)。可能的特征总数以百万计

我们想象我们的数据模型看起来像:

FEATUREID_TO_USER_TABLE : 功能 id -> {UserID Hash, UserID Hash, ...}

FEATUREID_TO_COUNTER_TABLE:特征 id -> {自史诗以来的小时数 -> HyperLogLog 字节 blob }

我们希望保留一组按用户 ID 的哈希排序的排序用户 ID。如果新 ID 具有较低的哈希值,我们还希望为每个 FEATUREID_TO_USER_TABLE 条目保留最多约 200k 的旧 ID。

我们希望商店支持以下操作(不一定用 SQL 表示):

select FeatureID, count(FeatureID) from FEATUREID_TO_USER_TABLE where UserID in 
(select UserID from FEATUREID_TO_USER_TABLE where FeatureID = 1234)
    group by FeatureID;

update FEATUREID_TO_COUNTER_TABLE set HyperLogLog = NewBinaryValue where FEATUREID_TO_COUNTER_TABLE.id = 567

我们相信跨机器分片这些数据的最简单方法是通过用户 ID。

感谢您的任何想法,马克

4

2 回答 2

0

Cassandra 是持久化数据的绝佳选择,但您需要其他东西来实时处理它。我建议您查看Storm,因为它可以相对轻松地为您提供实时流数据处理。它是一个为您处理并发和并行化的开源框架。它是在 JVM 上编写的,但也具有针对各种非 JVM 语言的语言绑定。

于 2012-10-10T14:09:14.697 回答
0

我不确定我是否理解你的全部描述,所以我在黑暗中拍摄了一些上下文。

有什么方法可以对您的数据进行分区,以便您可以查询到一个分区?这对扩展时的可扩展性和查询有很大帮助。您通常不想查询太大的表,而是查询分区。

IE。PlayOrm 在 cassandra 上具有分区功能,因此您可以查询一个分区。

虽然 PlayOrm 也有连接查询,但它此时不进行子选择,但通常客户端只是对 nosql 存储进行第一次调用,然后聚合结果并进行第二次查询,它仍然非常快(可能与你打了一个电话,因为即使是 cassandra 也必须在内部对其他服务器进行两次调用)。

嗯,我越读你的帖子,我不确定你应该在那里写 SQL,因为你可以通过主键做所有事情,但我不是 100% 确定。该 SQL 令人困惑,因为它抓取了行中的所有用户 ID,然后只计算它们????因为它在选择和子选择中是同一个表?

就数据分片而言,您无需执行任何操作,因为 cassandra 会自动执行此操作。

于 2012-10-10T14:15:47.947 回答