![](/img/trans.png)
[英]Is MongoDB usable as shared memory for a parallell processing / multiple-instances application?
[英]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.