Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error : 'Received error in response from 192.168.12.161:27018: { $err: "$sample stage could not find a non-duplicate document after 100 while using a random cursor. This is likely a sporadic failure, please try again.", code: 28799 }' on server 192.168.12.161:. The full response is { "ok" : 0.0, "errmsg" : "Received error in response from 192.168.12.161:27018: { $err: \"$sample stage could not find a non-duplicate document after 100 while using a random cursor. This is likely a sporadic failure, please try again.\", code: 28799 }", "code" : , "codeName" : "Location28799" }
at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:)
at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:)
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:)
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:)
at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:)
at com.mongodb.operation.AggregateOperation$.call(AggregateOperation.java:)
at com.mongodb.operation.AggregateOperation$.call(AggregateOperation.java:)
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:)
at com.mongodb.operation.AggregateOperation.execute(AggregateOperation.java:)
at com.mongodb.operation.AggregateOperation.execute(AggregateOperation.java:)
at com.mongodb.Mongo.execute(Mongo.java:)
at com.mongodb.Mongo$.execute(Mongo.java:)
at com.mongodb.OperationIterable.iterator(OperationIterable.java:)
at com.mongodb.OperationIterable.forEach(OperationIterable.java:)
at com.mongodb.OperationIterable.into(OperationIterable.java:)
at com.mongodb.AggregateIterableImpl.into(AggregateIterableImpl.java:)
at com.mongodb.spark.rdd.partitioner.MongoSamplePartitioner$$anonfun$.apply(MongoSamplePartitioner.scala:)
at com.mongodb.spark.rdd.partitioner.MongoSamplePartitioner$$anonfun$.apply(MongoSamplePartitioner.scala:)
at com.mongodb.spark.MongoConnector$$anonfun$withCollectionDo$.apply(MongoConnector.scala:)
at com.mongodb.spark.MongoConnector$$anonfun$withCollectionDo$.apply(MongoConnector.scala:)
at com.mongodb.spark.MongoConnector$$anonfun$withDatabaseDo$.apply(MongoConnector.scala:)
at com.mongodb.spark.MongoConnector$$anonfun$withDatabaseDo$.apply(MongoConnector.scala:)
at com.mongodb.spark.MongoConnector.withMongoClientDo(MongoConnector.scala:)
at com.mongodb.spark.MongoConnector.withDatabaseDo(MongoConnector.scala:)
at com.mongodb.spark.MongoConnector.withCollectionDo(MongoConnector.scala:)
at com.mongodb.spark.rdd.partitioner.MongoSamplePartitioner.partitions(MongoSamplePartitioner.scala:)
at com.mongodb.spark.rdd.partitioner.DefaultMongoPartitioner.partitions(DefaultMongoPartitioner.scala:)
at com.mongodb.spark.rdd.MongoRDD.getPartitions(MongoRDD.scala:)
at org.apache.spark.rdd.RDD$$anonfun$partitions$.apply(RDD.scala:)
at org.apache.spark.rdd.RDD$$anonfun$partitions$.apply(RDD.scala:)
at scala.Option.getOrElse(Option.scala:)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:)
at org.apache.spark.SparkContext.runJob(SparkContext.scala:)
at org.apache.spark.rdd.RDD.count(RDD.scala:)
at org.jh.TestSpark$.doTest(DocHandler.scala:)
at org.jh.TestSpark$.main(DocHandler.scala:)
at org.jh.TestSpark.main(DocHandler.scala)

错误如上,解决方式如下,根据connector源码(并没有完全看懂),分析出现这个问题的原因是因为:

if (numDocumentsPerPartition >= count) {
MongoSinglePartitioner.partitions(connector, readConfig, pipeline)
} else {
val samples = connector.withCollectionDo(readConfig, {
coll: MongoCollection[BsonDocument] =>
coll.aggregate(List(
Aggregates.`match`(matchQuery),
Aggregates.sample(numberOfSamples),
Aggregates.project(Projections.include(partitionKey)),
Aggregates.sort(Sorts.ascending(partitionKey))
).asJava).allowDiskUse(true).into(new util.ArrayList[BsonDocument]()).asScala
})
def collectSplit(i: Int): Boolean = (i % samplesPerPartition == 0) || !matchQuery.isEmpty && i == count - 1
val rightHandBoundaries = samples.zipWithIndex.collect {
case (field, i) if collectSplit(i) => field.get(partitionKey)
}
PartitionerHelper.createPartitions(partitionKey, rightHandBoundaries, PartitionerHelper.locations(connector))
}

  numDocumentsPerPartition < count,导致执行了else代码出现的,else先进行sample,然后:

val numDocumentsPerPartition: Int = math.floor(partitionSizeInBytes.toFloat / avgObjSizeInBytes).toInt
val numberOfSamples = math.floor(samplesPerPartition * count / numDocumentsPerPartition.toFloat).toInt

  为了避免出错,所以要降低numberOfSamples,那么就需要降低samplesPerPartition,增加numDocumentsPerPartition,samplesPerPartition通过调低spark.mongodb.input.partitionerOptions.samplesPerPartition实现,增加numDocumentsPerPartition通过调大spark.mongodb.input.partitionerOptions.partitionSizeMB实现。并且调大spark.mongodb.input.partitionerOptions.partitionSizeMB会提高numDocumentsPerPartition的数值,可以避免进入else下面的代码块。

  所以解决方案如下:

SparkSession.builder()
// .master("local")
.master(sparkURI)
.config(new SparkConf().setJars(Array(s"${hdfsURI}/mongolib/mongo-spark-connector_2.11-2.2.1.jar",
s"${hdfsURI}/mongolib/bson-3.4.2.jar",
s"${hdfsURI}/mongolib/mongo-java-driver-3.4.2.jar",
s"${hdfsURI}/mongolib/mongodb-driver-3.4.2.jar",
s"${hdfsURI}/mongolib/mongodb-driver-core-3.4.2.jar",
s"${hdfsURI}/mongolib/commons-io-2.5.jar",
s"${hdfsURI}/mongolib/config-1.2.1.jar",
s"${hdfsURI}/${jarName}") ++ extJars))
.config("spark.cores.max", 80)
.config("spark.executor.cores", 16)
.config("spark.executor.memory", "32g")
.config("spark.mongodb.input.uri", inp)
.config("spark.mongodb.output.uri", oup)
.config("spark.mongodb.input.partitionerOptions.samplesPerPartition", 1)
.config("spark.mongodb.input.partitionerOptions.partitionSizeMB", 128)
.getOrCreate()

  

MongoSpark 28799错误的更多相关文章

  1. 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)

    航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...

  2. MongoDB With Spark遇到的2个错误,不能初始化和sample重复的key

    1.$sample stage could not find a non-duplicate document while using a random cursor 这个问题比较难解决,因为我用mo ...

  3. 日期格式代码出现两次的错误 ORA-01810

    错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...

  4. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

  5. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  6. 实时的.NET程序错误监控产品Exceptionless

    Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...

  7. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  8. SQL Server 致程序员(容易忽略的错误)

    标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...

  9. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

随机推荐

  1. 浅从System.Web.Http.Owin的HttpMessageHandlerAdapter看适配器模式

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 适配器模式(Adapter) 可用来在现有接口和不兼容的类之间进行适配.有助于 ...

  2. [pig] pig 基础使用

    1.pig运行模式 本地模式: pig -x local 直接访问本地磁盘 集群模式: pig  或者 pig -x mapreduce 2.pig latin 交互 帮助信息 help 上传本地文件 ...

  3. IDEA下搭建Shiro-web环境,总是报BasicDataSource,classnotfound;问题解决

    进入报错跟踪,查看加载的classloader中没有dbcp相关jar包 猜测结果是,jar没有被加载,但是maven引用没错,而且也能找到对应的class 后来又查看IDEA配置中,相关jar也引入 ...

  4. [学习笔记]nodejs全局安装和本地安装的区别

    参考来源于 nodejs全局安装和本地安装的区别 1.全局安装 $ npm install gulp --global 2.作为项目的开发一开(devDependencies)安装 $ npm ins ...

  5. hibernate源码分析1

  6. socket详解(二)----实例和多线程,线程池使用

    一般而言,Java 语言中的套接字有以下两种形式: TCP 套接字(由 Socket 类实现,) UDP 套接字(由 DatagramSocket 类实现) TCP 和 UDP 扮演相同角色,但做法不 ...

  7. F - Rescue 优先队列bfs

    来源poj Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a ...

  8. [Codeforces Round #221 (Div. 1)][D. Tree and Queries]

    题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...

  9. 浅谈编码Base64、Hex、UTF-8、Unicode、GBK等

    网络上大多精彩的回答,该随笔用作自我总结: 首先计算机只认得二进制,0和1,所以我们现在看到的字都是经过二进制数据编码后的:计算机能针对0和1的组合做很多事情,这些规则都是人定义的:然后有了字节的概念 ...

  10. Spark Streaming实战演练

    一.spark streaming简介 Streaming是一种数据传输技术,它把客户机收到的数据变成一个稳定连续的流,源源不断的输出,使用户听到的声音和图像十分稳定,而用户在整个文件传输完成开始前就 ...