2016-07-20 5 views
2

나는 로그 파일에 데이터를 잦은 속도로 기록하는 센서를 가지고있다. 이 로그를 카산드라에 저장하고 스파크와 함께 처리하려고합니다.카산드라 - TimeUUID와 타임 스탬프가 중복됩니까?

TimeUUID 열을 사용하여 자동으로 주문을 보존하기 위해 타임 스탬프를 저장하려고 생각했습니다. 내 쿼리는 주로 범위 쿼리를 사용하므로 이상적이라고 생각했습니다. 그러나 내 로그 로깅 빈도로 인해 중복 타임 스탬프를 포함 할 수 있습니다. 로그는 cassandra로 스트리밍되지 않습니다. 나는 역사적인 데이터만을 가지고 일하고있다. 타임 스탬프는 복합 기본 키의 일부가됩니다. 고유 한 중복 타임 스탬프가있는 행을 만들기 위해 행 키에 넣을 수있는 실행 가능한 열을 생각할 수 없습니다.

documentation은 다음과 같이 말합니다. "minTimeuuid 및 maxTimeuuid 함수에서 반환하는 값은 값이 RFC 4122에 지정된 시간 기반 UUID 생성 프로세스를 준수하지 않는다는 점에서 true UUID가 아닙니다. 이러한 함수의 결과는 결정적이며, 지금 기능과 달리. "

now을 사용하는 대신 TimeUUID의 날짜를 강제로 설정하면 이전 데이터를 덮어 쓸 수 있습니다.

Java/Scala를 사용하여 내 기록 데이터를 .json에서 Cassandra로 대량 삽입합니다. (카산드라 3.0.8 | CQL 사양 3.4.0 | 기본 프로토콜 V4)


어떻게 내 데이터 내에서 중복 타임 스탬프를 가질 수 있습니까?

  1. 내 기본 키에 TimeUUID (지금)를 사용하고 실제 날짜/시간을 다른 열에 저장합니까? 이렇게하면 실제 날짜/시간을 이미 주문한 경우의 이점을 잃게됩니다.
  2. Java/Scala 응용 프로그램이 유효한 고유 한 TimeUUID를 생성하는지 확인해야합니까? 그렇다면 사용할 수있는 공용 라이브러리가 있습니까?

다른 옵션이 있습니까?

감사

답변

2

고유 식별자로 timeuuids를 사용하는 것이 적절한 방법입니다. 제대로 완료되면 중복되지 않습니다. timeuuid는 type 1 uuid이며, 은 아니지만 타임 스탬프뿐 아니라 동일한 시점에서도 고유성을 보장하는 엔트로피가 있습니다.

그래서 지금 질문이 남아 있습니다 - 과거 데이터에 대한 시간 제한을 어떻게 생성해야합니까? 언급했듯이, minTimeuuid/maxTimeuuid 함수는 적절한 버전 1uuid를 생성하는 데 적합하지 않습니다. 그것은 그 목적이 아니기 때문에 괜찮습니다.그래서 당신의 클라이언트가해야

SELECT * FROM sensor_readings 
    WHERE sensor_id = 123 
    AND ts > maxTimeuuid('2016-07-15 00:00+0000') 
    AND ts < minTimeuuid('2016-07-17 00:00+0000') 

불행하게도 CQL가 주어진 타임 스탬프 그들을 생성하는 기능을 제공하지 않습니다 (CQL 3.3 현재) : 당신은 범위 나중에 시간을 사용하여 데이터를 쿼리 할 때에 그들이 필요합니다 uuid를 생성하십시오. 자바 라이브러리가 있습니다. 몇 가지 제안 사항은 this question을 참조하십시오. 독창성을 보장하는 품질 라이브러리를 선택하십시오.

1

우선 모든 당신이 주문하고 데이터를 조회하는 방법에 대한 당신의 생각은 정말 카산드라를 사용 가능하다는 것을 확인하십시오. 범위 쿼리는 특정 파티션 키 (예 : PRIMARY KEY(sensor_id, time). 대부분의 경우 파티셔닝 키를 구별하면 시간 소인이 고유 할 수 있습니다.

전 세계적으로 유일한 시간 기반 UUID를 생성해야하는 경우 이전 데이터를 가져오고 마지막 UUID를 추적하여 고유 UUID를 생성하는 공유 UUID 생성기를 구현할 수 있으므로 가능해야합니다. 생성 된 타임 스탬프와 겹치기의 경우 새로운 고유 타임 스탬프를 만들기 위해 일정한 양의 나노 초만큼 증가하기 때문에 값은 항상 단조롭게 증가합니다.

관련 문제