所以我有这段代码
dbs.foreach({
var map = scala.collection.mutable.Map[String, mutable.MutableList[String]]()
db =>
val resultList = getTables(hive, db)
map+=(db -> resultList)
})
这样做是循环遍历数据库列表,为每个数据库执行show tables in db
调用,然后将数据库->表添加到映射中。既然有大约5秒的等待时间来等待配置单元查询返回,那么如何同时完成这项工作呢?
更新代码--
def getAllTablesConcurrent(hive: JdbcHive, dbs: mutable.MutableList[String]): Map[String, mutable.MutableList[String]] = {
implicit val context:ExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
val futures = dbs.map {
db =>
Future(db, getTables(hive, db))
}
val map = Await.result( Future.sequence(futures), Duration(10, TimeUnit.SECONDS) ).toMap
map
}
发布于 2018-07-28 04:59:23
如果你想要更多的控制(你想等待多少时间,你想使用多少线程,如果你所有的线程都很忙会发生什么,等等)你可以使用ThreadPollExecutor和Future
implicit val context:ExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
val dbs = List("db1", "db2", "db3")
val futures = dbs.map {
name => Future(name, getables(hive, name))
}
val result = Await.result( Future.sequence(futures), Duration(TIMEOUT, TimeUnit.MILLISECONDS) ).toMap
请记住,不要每次需要时都创建一个新的ExecutionContext
发布于 2018-07-28 03:30:49
您可以在任何Scala集合上使用.par
来并行执行下一次转换(使用默认的并行性,这取决于内核的数量)。
此外-更容易和更干净地map
到一个(不可变的)映射中,而不是更新一个可变的映射。
val result = dbs.par.map(db => db -> getTables(hive, db)).toMap
要更好地控制所使用的并发线程数,请参见https://docs.scala-lang.org/overviews/parallel-collections/configuration.html
https://stackoverflow.com/questions/51564138
复制相似问题