问题描述:
小伙伴们将scala操作mongodb作业提交到spark上运行的时候, 可能会报如下错误:
(1)no such cmd:aggregate exit code -1;
(2)ERROR partitioner.DefaultMongoPartitioner:
WARNING: MongoDB version < 3.2 detected.
原因分析和解决方案:
第一个是因为:使用spark.sql(sqlText=“XXX”),里面使用了类似于count的聚合函数,但是在mongodb2.2.0以下是没有聚合函数的。这里需要将mongodb升级到2.2.0以上。升级后修改pom里面的驱动,与mongdb版本匹配即可。
第二个是因为:mongodb3.2版本以下需要指定spark.mongodb.input.partitioner。可以直接将其升级到3.2以上或者在代码中加入如下配置:
// An highlighted block
val sparkConf = new SparkConf().setMaster("spark://192.168.125.129:7077").set("yarn.resourcemanager.hostname", "192.168.125.129").set("spark.executor.instance", "3").set("spark.executor.memory", "512M").setAppName("StatisticsRecommender")
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
//加入以下一行即可
sparkConf.set("spark.mongodb.input.partitioner","MongoShardedPartitioner").set("spark.mongodb.input.partitionerOptions.shardkey","_id")