BigQuery로 스트리밍할 때 발견된 작은 세그먼트

12225 단어 BigQuery
빅쿼리 어드벤트 캘린더 2021 4일차 기사입니다!
개시하다
이것은 흐르는 매체와 관련된 작은 단락이다.
당사의 ETL/ELT 도구(CDAta Sync)의 기술 지원을 진행할 때 한 사용자는 "빅 Query에 데이터를 연합하고 있지만 빅 Query가 '404 not found' 로 오류를 회답했습니다."라고 말했다.이런 질문은 조사할 때의 소재다.콘텐츠가 도구 쪽이라기보다는 빅큐리의 삽입 방법에 조금 주목해 화제가 됐다.
사용자가 도구로 하는 일은 매우 간단하다.
데이터를 업데이트할 때마다 ELT 도구의 임무는'표 제작→흐름 전송 삽입'이며, 조금만 기다리면'표 삭제→표 제작→흐름 전송 삽입'이라는 내용으로 수행되는 것 같다.
내용별로는 같은 설정과 용례라면 다른 ETL/ELT 도구도 발생할 수 있다.
그럼 이 현상을 재현하면서 해결책을 쓰자.
다시 나타나다
이번에는 ETL/ELT 도구를 사용하지 않아도 재현이 불가능하지만, 이번에는 자체 사용 습관이 있는 회사CData BigQuery Driver에서 확인할 예정이다.
※ 이외에 스트리밍 삽입물이 확인되어 빅큐리의InsertAll 메서드를 사용합니다.CData BigQueryDriver는 Insertmode 옵션를 Streaming으로 설정하여 InsertAll 메서드를 요청합니다.
먼저 표 제작과 기록을 추가합니다.
CREATE TABLE Streaming_Table (
   StoreId INT,
   ProductId INT,
   ProductName VARCHAR(100),
   StockAmount INT
);
insert into Streaming_Table (StoreId,ProductId,ProductName,StockAmount) values(1,1,'AAA Item',50);
특히 무사기록이 추가됐다.

이른바 ETL/ELT 도구의 첫 번째 작업이다.
그러면 조금만 놓으면 ETL/ELT 도구부터 두 번째 작업의'표 삭제→표 제작→흐름 전송 삽입'을 깨닫게 된다.먼저 테이블을 삭제합니다.
drop table Streaming_Table;
그리고 그때 주문방송 결과.별다른 변화 없이 정상적으로 끝났다.

bq 명령을 통해서도 표를 삭제했습니다.
PS C:\dev\tools\scripts> bq query "SELECT count(*) FROM sync.Streaming_Table"
BigQuery error in query operation: Error processing job 'dataflow-
cdata:bqjob_r3a471484c98c9893_0000017d7fcab27c_1': Not found: Table dataflow-
cdata:sync.Streaming_Table was not found in location US
PS C:\dev\tools\scripts>
변경합니다.
CREATE 문서가 실행될 때의 팟캐스트 내용에 관해서는 이쪽의 팟캐스트와 응답이 모두 가능하다.(CREATE 문은 아까와 같기 때문에 생략합니다.)

마지막으로 테이블 삭제 - 테이블 만들기 - 흐름 전송 삽입 레코드 추가
image.png
시계가 없는 404 오류를 되돌렸습니다~
{
  "error": {
    "code": 404,
    "message": "Table 917044252951:sync.streaming_Table not found.",
    "errors": [
      {
        "message": "Table 917044252951:sync.streaming_Table not found.",
        "domain": "global",
        "reason": "notFound"
      }
    ],
    "status": "NOT_FOUND"
  }
}
이상 재현 확인입니다.
까닭
빅큐리의 insertAll 방법으로 추가 기록을 한다면 이 일대의 구조는 잘 이해되지 않지만, 다시 만든 표에는 표가 없는 것 같다.
예제)https://www.googleapis.com/bigquery/v2/projects/dataflow-cdata/datasets/sync/tables/Query_Table_1/insertAll해결책
몇 분 정도 두면 오류 없이 기다릴 수 있어
짧은 간격으로 데이터를 BigQuery와 협업하고 매번 교체할 경우 추가 기록은 InsertAll이 아닌jobs입니다.query로 해결해.
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
이렇게 되면 음반이 확실히 반영될 수 있다.
그럼 해볼게요.
우선 아까와 같이 첫 번째 작업 이미지에 표를 만들고 기록을 추가한 후 두 번째 작업 이미지에서 표를 삭제하고 표를 만듭니다.
표 만들기 & 기록 추가
CREATE TABLE Query_Table_1 (
   StoreId INT,
   ProductId INT,
   ProductName VARCHAR(100),
   StockAmount INT
);
insert into Query_Table_1 (StoreId,ProductId,ProductName,StockAmount) values(1,1,'AAA Item',50);

표 삭제 & 표 만들기
drop table Query_Table_1;

CREATE TABLE Query_Table_1 (
   StoreId INT,
   ProductId INT,
   ProductName VARCHAR(100),
   StockAmount INT
);
여기는 인스타그램이 아니라 잡스예요.query를 사용합니다.
※ CData Driver에서 Insertmode DML로 변경된 경우 jobs.query처럼 전환합니다.
그러면 Insert 문을 실행합니다.
insert into Query_Table_1 (StoreId,ProductId,ProductName,StockAmount) values(1,1,'AAA Item',50);
성공했어!

그럼 이때의 팟캐스트 내용을 살펴보겠습니다.

액세스https://www.googleapis.com/bigquery/v2/projects/dataflow-cdata/queries - 요청 Body에서 Insert 문을 직접 지정합니다.
{
    "kind": "bigquery#queryRequest",
    "query": "INSERT INTO `Query_Table_1` (`StoreId`, `ProductId`, `ProductName`, `StockAmount`) VALUES (1, 1, 'AAA Item', 50)",
    "useLegacySql": "false",
    "priority": "INTERACTIVE",
    "defaultDataset": {
        "datasetId": "sync",
        "projectId": "dataflow-cdata"
    }
}
신경 쓰이는 일
InsertAll 방법으로 흐름 전송을 삽입하는 사람은 매번 짧은 간격으로 표를 삭제하는 경우가 적다. 예를 들어 다른 ETL/ELT 도구가 어떤 방법으로 빅큐리를 삽입했는지 시간이 있으면 조사하고 싶다.
끝말
작은 단락이지만 같은 오류가 발생하면 삽입 방법을 확인하는 것이 좋다.
참고로 이번 보도에 등장한 도구는 다음과 같다.
BigQuery JDBC Driver: https://www.cdata.com/jp/drivers/bigquery/
CDataSync: https://www.cdata.com/jp/sync/

좋은 웹페이지 즐겨찾기