2017-10-05 4 views
1

사용 사례는 Pub/Sub 구독에서 이벤트 로그를 읽고 구문 분석하고 BigQuery에 저장하는 간단한 방법입니다. 이벤트의 수가 크게 늘어날 것으로 예상되고 제한되지 않은 데이터 소스로 작업하기 때문에 BigQuery에서 샤딩을 구성하기로 결정했습니다. 이벤트 데이터의 타임 스탬프 (Beam 설명서에서 "이벤트 시간"이라고 함)를 기반으로 일별 테이블에 이벤트를 저장합니다. . 질문은 내 경우에 Windowing을 구성해야합니까 아니면 암시 적으로 글로벌 창을 사용하는 기본 구성을 그대로 둘 수 있습니까? 내가 묻는 이유는 BigQuery 샤딩 예제의 대부분이 윈도우 구성의 사용을 가정하기 때문입니다. 하지만 제 경우에는 그룹화 작업을 GroupByKeyCombine으로 사용하지 않으므로 모든 윈도우 구성 없이는 정상적으로 처리되어야합니다. 또는 어쨌든 windowing을 사용하는 이유가 있습니까? 예를 들어 BigQueryIO의 성능에 영향을 줄 수 있습니까?Apache Beam 윈도우 및 샤딩 BigQuery 출력 테이블

내가 지금 샤딩하는 방법은 다음과 같습니다.

static class TableNamingFn implements SerializableFunction<ValueInSingleWindow<TableRow>, TableDestination> { 
    @Override 
    public TableDestination apply(ValueInSingleWindow<TableRow> input) { 
     DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd").withZone(DateTimeZone.UTC); 

     TableReference reference = new TableReference(); 
     reference.setProjectId("test-project"); 
     reference.setDatasetId("event_log"); 

     DateTime timestamp = new DateTime(input.getValue().get("event_timestamp"), DateTimeZone.UTC); 
     reference.setTableId("events_" + formatter.print(timestamp)); 
     return new TableDestination(reference, null); 
    } 
} 

// And then 
eventRows.apply("BigQueryWrite", BigQueryIO.writeTableRows() 
     .to(new TableNamingFn()) 
     .withSchema(EventSchema) 
     .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED) 
     .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)); 

답변

1

날짜별로 테이블을 조각내는 것처럼 보입니다. 대신 Date-partitioned Table을 사용해 보셨습니까?

reference.setTableId("events$" + formatter.print(timestamp)); 

This article

아파치 빔의 BigQuery의 분할 된 테이블을 사용하여 커버 : 당신이 좋아하는 파티션 장식, 뭔가를 사용하여 테이블 ID를 설정 위치를 업데이트 할 수있다. 특히이 코드 스 니펫은 사용하고자하는 코드 일 것입니다. https://gist.githubusercontent.com/alexvanboxel/902099911d86b6827c8ea07f4e1437d4/raw/cc8246eb9b3219550379cfe7b3b7abca8fc77401/medium_bq_tableref_partition

+0

답장을 보내 주셔서 감사합니다. 예 저는 BigQuery의 분할 된 테이블에 대해 알고 있습니다. 분리 된 테이블 접근 방식이 나에게보다 유연해진 것처럼 일부러이 기능을 사용하지 않기로했습니다. 내가 그룹화 작업이 없거나 윈도우 잉 구성을위한 강력한 이유가있을 때 스트리밍 입력 창을 사용하지 않는 것이 좋습니까? [예제] (https://medium.com/google-cloud/bigquery-partitioning-with-beam-streams-97ec232a1fcc)에서 윈도우 잉이 언급되었습니다. – dmitryb