2014-10-14 3 views
0

BigQuery 작업을 잡으려고이 논리를 사용하고 있습니다. 이 성공했는지 여부는 알지만 때로는 성공적인 작업 ID이기 때문에 심지어 작업을 실행하여 쿼리를 실행했지만 행을 삽입하지 않았습니다.BigQuery 작업 상태 논리

주로 테이블에 대한 쿼리와 함께 발생합니다.

나는 Google 문서에서 본 코드를 사용하여 약간의 로그를 조금 추가합니다.

누군가 내가 잘못하고있는 것을 말할 수 있다면 좋을 것입니다.

데프 _wait_for_response (자기, bq_api, insert_response, max_wait_time = 3600) : "" "BigQuery의 작업 상태를 확인 DONE 대기 및 오류를 확인 을 오류가있는 경우 - 예외를 발생.." ""

start_time = time.time() 
    logstr.info(current_module='bq_session', 
       current_func='_wait_for_response') 

    # sleep interval between retries 
    # first, try 8 times every 1 second, then double sleep time until 
    # 30 seconds (and stay on 30 until max_wait_time is reached) 
    sleep = itertools.chain(itertools.repeat(1, 8), xrange(2, 30, 3), 
          itertools.repeat(30)) 

    while time.time() - start_time < max_wait_time: 

     try: 
      job = bq_api.jobs().get(
       projectId=insert_response['jobReference']['projectId'], 
       jobId=insert_response['jobReference']['jobId']).execute() 

      # on job end 
      if job['status']['state'] == 'DONE': 
       # if job failed raise error(s) 
       if 'errors' in job['status'].keys() and\ 
         job['status']['errors']: 
        raise Exception(','.join(
         [err['message'] 
         for err in job['status']['errors']])) 
       else: 
        return job 

     except apiclient.errors.HttpError, error: 
      status = int(error.resp.get('status', 0)) 
      if status >= 500: 
       pass 
       # raise Exception(
       #  global_messages.BQ_SERVER_ERROR.format(err=error)) 
      elif status == 404: 
       raise Exception(
        global_messages.BQ_JOB_NOT_FOUND.format(
         jobid=insert_response['jobReference']['jobId'])) 
      else: 
       raise Exception(
        global_messages.BQ_ERROR_GETTING_JOB_STATUS.format(
                   err=error)) 

     time.sleep(sleep.next()) 

    raise Exception(global_messages.BQ_TIMEOUT.format(
         time=max_wait_time, 
         jobid=insert_response['jobReference']['jobId'])) 
을 스크립트 원인 컨트롤의
+0

보고있는 문제에 대한 추가 정보를 제공해주십시오. –

+0

내 직업이 suceesully가 실행되는지 아닌지, 내가 추가하는 스크립트에 따라 알 수 있습니다. 때로는 오류없이 완료된 상태이기 때문에 작업이 테이블에 데이터를로드하지 않는 것을 볼 수 있습니다. Google에서 일자리 ID를 보냈을 때 서버 오류 (내부 오류)로 인해 작업이 실패하고이 오류를 잡아야한다고 대답했습니다. 나는 내가 추가 한 스크립트 논리에 왜 그것을 잡지 못했는지 알고 싶다. –

답변

2

이 라인 상태가 예상되는 예외를보고에서 당신을 방지 할 수있는보다 큰 500

if status >= 500: 
    pass 
    # raise Exception(
    #  global_messages.BQ_SERVER_ERROR.format(err=error)) 

경우를 통해 가을.

+0

사실입니다. 나는 Google의 모범 사례에 따라 해냈습니다. 그렇지 않으면 중요한 일이 아닌 내부 경고로 인해 매 시간마다 업무가 방해받습니다. –