Google App Engine Webserviceを実行せずにユーザーデータを処理するスクリプトを実行できますか?小さなスクリプトでwebserviceなしの大きな質問cronジョブ
それがうまく動作しますが、私のスクリプトは、最後のおよそ40分、私はエラーを取得していたとき:DeadlineExceededError
私の一時的な修正は、Pythonスクリプトを使用してWindows VMおよびコマンドラインでWindowsスケジューラを使用する
ました編集:コードが追加されました
jobs = []
jobs_status = []
jobs_error = []
# The project id whose datasets you'd like to list
PROJECT_NUMBER = 'project'
scope = ('https://www.googleapis.com/auth/bigquery',
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/drive',
'https://spreadsheets.google.com/feeds')
credentials = ServiceAccountCredentials.from_json_keyfile_name('client_secrets.json', scope)
# Create the bigquery api client
service = googleapiclient.discovery.build('bigquery', 'v2', credentials=credentials)
def load_logs(source):
body = {"rows": [
{"json": source}
]}
response = service.tabledata().insertAll(
projectId=PROJECT_NUMBER,
datasetId='test',
tableId='test_log',
body=body).execute()
return response
def job_status():
for job in jobs:
_jobId = job['jobReference']['jobId']
status = service.jobs().get(projectId=PROJECT_NUMBER, jobId=_jobId).execute()
jobs_status.append(status['status']['state'])
if 'errors' in status['status'].keys():
query = str(status['configuration']['query']['query'])
message = str(status['status']['errorResult']['message'])
jobs_error.append({"query": query, "message": message})
return jobs_status
def check_statues():
while True:
if all('DONE' in job for job in job_status()):
return
def insert(query, tableid, disposition):
job_body = {
"configuration": {
"query": {
"query": query,
"useLegacySql": True,
"destinationTable": {
"datasetId": "test",
"projectId": "project",
"tableId": tableid
},
"writeDisposition": disposition
}
}
}
r = service.jobs().insert(
projectId=PROJECT_NUMBER,
body=job_body).execute()
jobs.append(r)
return r
class MainPage(webapp2.RequestHandler):
def get(self):
query = "SELECT * FROM [gdocs_users.user_empty]"
insert(query, 'users_data_p1', "WRITE_TRUNCATE")
check_statues()
query = "SELECT * FROM [gdocs_users.user_empty]"
insert(query, 'users_data_p2', "WRITE_TRUNCATE")
query = "SELECT * FROM [gdocs_users.user_%s]"
for i in range(1, 1000):
if i <= 600:
insert(query % str(i).zfill(4), 'users_data_p1', "WRITE_APPEND")
else:
insert(query % str(i).zfill(4), 'user_data_p2', "WRITE_APPEND")
for error in jobs_error:
load_logs(error)
app = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
ありがとうBrettJ!この解決策はうまくいくかもしれませんが、App EngineはBigQueryの復帰を待つ間に何の仕事もしていないことに注意してください。より良い方法は、ジョブがエンキューされるとすぐに戻ってから、後で戻ってジョブが完了したかどうかを確認することです。 –
@BrettJ助けてくれてありがとう。私も追加したいと思っている人がいれば、 'cron.yaml'に' target:your_service'を追加して、使用したいサービスを判断する必要があります – Mat