【问题标题】:Cassndra/Spark Correlating Data points seperated by million recordCassandra/Spark 相关数据点以百万条记录分隔
【发布时间】:2015-10-28 14:29:08
【问题描述】:

我有传感器数据,近似格式显示了我将其存储在 cassandra 表中的方式。

CREATE TABLE sensor_log (
    sensor_id BIGINT,
    created_at TIMEUUID,
    SensorEventType TEXT,
    PRIMARY KEY(sensor_id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC)

大约有 10 种不同类型的事件(SensorEventType)发生。说他们的名字

(SensorEventType)SET1...SET10. 

我将数据保留 90 天。

其中一些类型的事件发生得非常频繁,而有些则非常罕见。

所以发生的事情是 SET1 发生在第 1 天,而 SET9 发生在第 60 天之后。在这之间,还有许多其他 SensorEventType 记录被记录下来。因此,在这两者之间将有 1 亿个数据点。

example

SENSOR_ID   Data stored Clustered by created_at.
 1         SET2,SET1,SET3,SET4....100millionrandomSET....SET9,SET3,SET4....
 2         SET4,SET5,SET1,SET4....100millionrandomSET....SET2,SET9,SET6....

each SET stored in sequential manner by created_at

我需要为每个传感器关联 SET1 和 SET9 数据点在逻辑中的事实,以获取一些信息。我正在考虑使用火花。 Correlation 纯粹基于 SensorEventType,是查找 SET9 和 SET1 之间持续时间的业务逻辑要求。因此,如果 SET9 发生在 SET1 之后,请记下发生之间的持续时间并将其保存在另一个表中。

现在的问题是为了关联 Spark 中的数据,我似乎需要实际加载所有数据点,所有数据点都在内存中以在 SET1 和 SET9 之间关联。这是思考解决这个设计问题的正确方法吗?

对于应该如何设计以及如何在数据点之间以百万计的火花相关性如何工作,任何人都有更好的指示。我是新来的火花,任何帮助将不胜感激。

【问题讨论】:

  • 您能否提供更多关于您如何确定两个数据点相关的详细信息?你是否对两者都应用一个函数,如果结果匹配,那么它们是相关的?
  • Correlation 纯粹基于 SensorEventType,是查找 SET9 和 SET1 之间持续时间的业务逻辑要求。因此,如果 SET9 发生在 SET1 之后,请记下发生之间的持续时间并将其保存在另一个表中。
  • @Yatin - 两个事件是否必须具有相同的sensor_id 才能关联,或者您是否简单地在 SET1 之后查找第一个 SET9?无论如何,可能需要一些过滤和排序。
  • @Marmite 是的,相关性存在于同一传感器的不同事件之间。 (sensor_id) ?我正在简化上面的问题,使其更具可读性。
  • @Yatin it seems that i need to actually load all the data points - 我可能没有完全理解,但是只加载相关的事件类型(SET1 + SET9),根据 sensor_id 和时间戳对它们进行排序并计算间隔对于 SET9 跟随 SET1 且具有相同 sensor_id 的情况?

标签: cassandra apache-spark bigdata


【解决方案1】:

我不确定我是否完全理解您的用例,但您似乎不需要使用 Spark,并且可以在普通 Cassandra 中进行这种关联。

代替(或者可能除了)记录单个分区中传感器的所有事件的表,为什么不将事件类型添加到分区键中,如下所示:

CREATE TABLE sensor_log (
    sensor_id BIGINT,
    created_at TIMEUUID,
    SensorEventType TEXT,
    PRIMARY KEY((sensor_id, SensorEventType), created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC)

这会将每个 SET 值放在您可以独立查询的每个传感器的自己的分区中。

通过这样做,SET1 和 SET9 事件之间的 1 亿个数据点将被放置在单独的分区中,并且不会妨碍您。因此,当 SET9 事件出现时,只需从该传感器的 SET1 分区中选择最新的数据点:

SELECT created_at FROM sensor_log WHERE sensor_id=x and SensorEventType=SET1 LIMIT 1;

现在从传入的 SET9 事件的 created_at 时间中减去 created_at 时间。

这样的分区还可以简化 Spark 的使用,因为您可以从这些较小的分区创建 RDD,并且只加载 SET1 和 SET9 分区而不是所有 SET 类型。

【讨论】:

  • 我认为@Jim 您回答的内容是有道理的,并且对于 SET9 和 SET1 之间关联的特定业务逻辑将起作用,我不需要为此使用 spark 进行后处理。但是我有一个关于使用 PRIMARY KEY((sensor_id, SensorEventType), created_at) 方法的 DataLocality 的后续问题,这意味着 (SensorId_1, SET1) 的数据可能位于与 (SensorId_1, SET9) 不同的 Cassandra 节点上,对吗?
  • 是的,这些分区可能位于不同的节点上。因此,如果您在这些分区之间进行了火花连接,它将涉及通过网络对一些数据进行洗牌。但这可能比将数百万个不需要的数据点加载到内存中然后用过滤器丢弃它们更有效。
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多