2015-01-23 1 views
1

샤딩이 애플리케이션 레이어에서 처리되는 PostgreSQL 머신의 프로덕션 샤드 클러스터가 있습니다. 생성 된 레코드에는 UUID가 아닌 시스템 생성 고유 식별자가 할당됩니다.이 식별자는 레코드가 저장되는 부분을 나타내는 0-255 값을 포함합니다.이 클러스터는 RDS에서 복제되므로 대량의 읽기 쿼리를 실행할 수 있습니다.스파크 및 샤드 된 JDBC 데이터 소스

나는 스파크 내에서이 데이터에 액세스하기위한 최선의 방법을 알아 내려고하고 있습니다.

내가 그럼 난 스파크 클러스터에서 유일한 것이다 이상적으로 각 노동자를이 데이터 집합을 분할 할 것 작은 데이터 세트에만 샤드 이름을 포함 (텍스트 파일), 즉, integration-shard-0, integration-shard-1 등을 만드는 생각했다 하나의 샤드 이름 (그러나 나는 노동자에게 하나 이상의 샤드가있는 경우를 처리해야한다). 그런 다음 JdbcRDD을 만들 때 실제로 해당 작업자에있는 각 샤드 이름에 대해 1 ... n과 같은 RDD를 만들고 결과 RDD를 병합합니다.

이 방법이 효과가있는 것처럼 보이지만이 경로로 들어가기 전에 다른 사람들이 비슷한 문제를 어떻게 해결했는지 알고 싶었습니다.

(나는 또한 스파크로 액세스됩니다 분석 처리를 위해 두 번째 데이터 센터로 사용할 별도의 카산드라 클러스터가 있습니다.)

+0

['preferredLocations()'] (https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.rdd.RDD)를 무시하는 자체 RDD 구현에 대해 생각해 보셨습니까? 각 스파크 파티션을 샤드에 할당 하시겠습니까? – climbage

+0

'getPartitions'을 덮어 쓰는 RDD를 구현했습니다. 아래에 요지에 대한 링크를 게시 할 것입니다. – cfeduke

답변

1

내가 작성 결국 내 예비 버전은 다음에서 찾을 수있는 자신의 ShardedJdbcRDD 요점 :

https://gist.github.com/cfeduke/3bca88ed793ddf20ea6d

내가 쓴 때,이 버전은 자바 만 스칼라에서 사용을 지원하지 않습니다. (업데이트 할 수도 있습니다.) JdbcRDD과 동일한 하위 파티셔닝 스키마가 없으므로 결국에는 오버로드 생성자를 만듭니다. 기본적으로 ShardedJdbcRDD은 클러스터에서 RDBMS 샤드를 쿼리합니다. 적어도 당신이 파편처럼 많은 스파크 노예를 가지고 있다면, 각 노예는 그 파티션을 위해 하나의 샤드를 얻을 것입니다.

미래의 오버로드 된 생성자는 JdbcRDD과 같은 범위 쿼리를 지원하므로 클러스터에 스파크 슬레이브가 여러 개있는 경우 샤드보다 데이터가 범위 쿼리를 통해 더 작은 세트로 분할 될 수 있습니다.

+0

샤드가 스파크 노드와 함께 배열되어 있습니까 아니면 다른 머신 세트입니까? – climbage

+0

데이터 집성이 필요하지 않도록 다른 시스템 세트 (AWS RDS replica). Spark로 작업 할 때 경험이 많을 때 데이터 지역을 지원하는 버전을 만드는 방법을 살펴 보겠습니다. (우리의 프로덕션 클러스터에는 복제 된 카산드라 데이터 센터가있는 데이터 지역이 있습니다.) – cfeduke

+0

Gotcha. 나는 당신이 품위있는 성능 이상의 것을 얻을 것이라 확신합니다. – climbage

관련 문제