我有一个在纱线上运行的Spark应用程序。 有了RDD我需要对数据库执行查询。 问题是我必须设置正确的连接选项,否则数据库将被重载。这些选项取决于同时查询此DB的工作人员数量。为了解决这个问题,我想在运行时(来自worker)检测当前运行的worker数。 这样的事情:
val totalDesiredQPS = 1000 //queries per second
val queries: RDD[String] = ???
queries.mapPartitions(it => {
val dbClientForThisWorker = ...
//TODO: get this information from YARN somehow
val numberOfContainers = ???
val dbClientForThisWorker.setQPS(totalDesiredQPS / numberOfContainers)
it.map(query => dbClientForThisWorker.executeAsync...)
....
})
我也很欣赏其他解决方案,但我想避免随机播放,无论工作人员的数量是多少,都要获得几乎完整的数据库利用率。