【发布时间】:2018-01-11 18:04:49
【问题描述】:
我有一个脚本,它从 AWS Athena 中提取 25,000 条记录,这基本上是一个 PrestoDB 关系 SQL 数据库。假设我为这些记录中的每一个生成一个请求,这意味着我必须向 Athena 发出 25,000 个请求,然后当数据返回时,我必须向我的 Redis 集群发出 25,000 个请求。
从节点到 Athena 的理想请求数量是多少?
我问的原因是因为我试图通过创建一个包含 25,000 个承诺的数组然后在其上调用 Promise.all(promiseArray) 来做到这一点,但应用程序只是永远挂起。
所以我决定一次触发 1 个并使用递归将第一个索引拼接出来,然后在 promise 解决后将剩余的记录传递给调用函数。
问题在于它需要很长时间。我休息了大约一个小时,回来后发现还剩下 23,000 条记录。
我试图用谷歌搜索 Node 和 Athena 一次可以处理多少个请求,但我什么也没找到。我希望有人可能对此有所了解并能够与我分享。
谢谢。
这是我的代码仅供参考:
作为旁注,我想做的不同之处在于,我可以一次发送 4、5、6、7 或 8 个请求,而不是一次发送一个请求,具体取决于它的执行速度。
另外,Node 集群如何影响这样的性能?
exports.storeDomainTrends = () => {
return new Promise((resolve, reject)=>{
athenaClient.execute(`SELECT DISTINCT the_column from "the_db"."the_table"`,
(err, data) => {
var getAndStoreDomainData = (records) => {
if(records.length){
return new promise((resolve, reject) => {
var subrecords = records.splice(0, )[0]
athenaClient.execute(`
SELECT
field,
field,
field,
SUM(field) as field
FROM "the_db"."the_table"
WHERE the_field IN ('Month') AND the_field = '`+ record.domain_name +`'
GROUP BY the_field, the_field, the_field
`, (err, domainTrend) => {
if(err) {
console.log(err)
reject(err)
}
redisClient.set(('Some String' + domainTrend[0].domain_name), JSON.stringify(domainTrend))
resolve(domainTrend);
})
})
.then(res => {
getAndStoreDomainData(records);
})
}
}
getAndStoreDomainData(data);
})
})
}
【问题讨论】:
-
看看stackoverflow.com/questions/47967232/…,您可能想要分块您的请求并一次处理一个块。块大小取决于您的系统,因此我们无法为您估计,您可能需要自己测试。
-
这取决于很多因素。有些是你无法控制的。例如,AWS Athena 有请求限制。 docs.aws.amazon.com/athena/latest/ug/service-limits.html
-
@Kevin,谢谢,我认为这解决了我的问题,即我的请求为何停滞不前。如果您想提交它作为您的答案,我很乐意接受。
-
您可以以 1000 个为一组使用 Promise.all,并限制每个时间段发出的请求(例如每秒最多 20 个)或限制活动请求(最多 100 个)。限制不仅是您的硬件处理的内容和硬件上的软件允许的内容,还包括您的请求的接收者可以处理或允许的内容。 Here 是一个限制承诺的例子。
标签: javascript node.js express node-redis amazon-athena