繁体   English   中英

Spark:如何分隔数据处理以指向在RamFS / TmpFS分区上的内存中运行的不同Mongodb实例?

[英]Spark: How to separate data processing to point to different Mongodb instances that run in memory on RamFS/TmpFS partitions?

我在同一台机器上有不同的MongoDB实例,所有这些实例都指向Linux中在内存中创建的分区,其种类如下:

mount -t ramfs -o size=8000M ramfs /mongo/ramdata<n>/

每个<n> (例如1个)MongoDB实例具有以下配置:

dbpath=/mongo/ramdata1/
nojournal = true
smallFiles = true
noprealloc = true

这些实例具有完全相同的数据,而我只是使用纯粹的MongoDB-Java驱动程序对那些应为只读的数据进行地理查询(没有MongoDB-hadoop或Stratio或whatsover)。

因此,在某个时候,我希望我的Spark流程以类似以下的内容完成:

...foreach(query_a_specific-mongo_instance_for_a_specific_port)

因为MongoDB实例将在相同地址但不同端口上运行。

鉴于我不想使用一个或多个Mongo-conf实例创建MongoDB副本集,是否可以通过Spark这样的方式对流程进行“分区”,例如,每个“核心/分区”点到特定的Mongoldb端口?

例如,如果我有100个核心,则第一个“核心”将指向mongo-address:30001 ,而第100个核心将指向mongo-address:30100吗?

我只是将mapPartitionsWithIndex与一个小助手一起使用:

val mongos: Vector[String] = ??? // Vector("mongodb://mongo-address:30001", ...)

def getClient(mongos: Seq[String])(i: Integer): MongoClient = {
  MongoClient(mongos(i % mongos.size))
}

rdd.mapPartitionsWithIndex((i, iter) => {
  val client = getClient(mongos)(i)
  iter.map(someFunctionsWhichIsUsingTheClient)
})

对于其他操作或转换,您可以使用TaskContext获取分区/主机信息。 请参阅如何在Spark中获取地图任务的ID?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM