athena.getQueryExecution 会返回 RUNNING 状态 1 分钟以上,即使历史记录说该作业花了 4 秒

Dan*_*lan 9 javascript typescript aws-sdk amazon-athena aws-sdk-js

我正在使用 typescript 和 aws-sdk 编写一个节点应用程序来调用 Athena。有时,对 Athena 的调用会在等待 Athena 响应一分钟后超时。我不明白的是,如果我转到 AWS 控制台并查看 Athena History 选项卡,它说我的查询需要 4 秒才能成功,但在我的代码中,它运行了超过一分钟等待响应。我希望我的代码中有什么地方做错了。

myFunct... {
    const athena = getAthena();

    const startQueryExecutionResponse: StartQueryExecutionOutput = await athena.startQueryExecution(params).promise();

    let status = "UNKNOWN";
    do { 
        await sleep(1000);
        status = await getQueryStatus(athena, startQueryExecutionResponse);  
    } while (status === "QUEUED" || status === "RUNNING");

    return await athena.getQueryResults(startQueryExecutionResponse as GetQueryResultsInput).promise();
};

const sleep = (ms: number) => {
    return new Promise(resolve => {
        setTimeout(resolve, ms)
    })
};

const getQueryStatus = async (athena: AWS.Athena, startQueryExecutionResponse: Athena.StartQueryExecutionOutput): Promise<QueryExecutionState> => {
    const result: GetQueryExecutionOutput = await athena.getQueryExecution(startQueryExecutionResponse as GetQueryResultsInput).promise();
    console.log(result);
    return result!.QueryExecution!.Status!.State || "Unknown"
};
Run Code Online (Sandbox Code Playgroud)

代码卡在那个 while 循环中,我可以从下面的 console.log 中看到,状态Status: { State: 'RUNNING', SubmissionDateTime: 2019-07-23T18:28:00.639Z },一遍又一遍。

如果 AWS 控制台说这个查询需要 4 秒才能完成,为什么 getQueryExecution 响应说它仍在运行几分钟?

jee*_*ves 0

可以获得函数的QueryExecutionStatisticsgetQueryExecution

         "DataManifestLocation": "string",
         "DataScannedInBytes": number,
         "EngineExecutionTimeInMillis": number,
         "QueryPlanningTimeInMillis": number,
         "QueryQueueTimeInMillis": number,
         "ServiceProcessingTimeInMillis": number,
         "TotalExecutionTimeInMillis": number
Run Code Online (Sandbox Code Playgroud)

如果您还没有检查过的话,这可能会给您带来更多的见解。4 秒可能是总执行时间的子集。也许您的查询在计划上花费了更多时间,而不是在执行上。

EngineExecutionTimeInMillis 执行查询所花费的毫秒数。

类型:长

必需: 否

QueryPlanningTimeInMillis Athena 规划查询处理流程所花费的毫秒数。这包括从数据源检索表分区所花费的时间。请注意,由于查询引擎执行查询计划,因此查询计划时间是引擎处理时间的子集。

类型:长

必需: 否

来源