java及spark2.X连接mongodb3.X单机或集群的方法(带认证及不带认证)
首先,我们明确的是访问Mongos和访问单机Mongod并没有什么区别。接下来的方法都是既可以访问mongod又可以访问Mongos的。
另外,读作java写作scala,反正大家都看得懂......大概?
1、不带认证集群的连接方法(JAVAscala):
首先是创建连接的方法,我们先声明一个client,然后指定访问的DB和collection:
private lazy val mongo = new MongoClient("192.168.2.51", 27017)
private lazy val db = mongo.getDatabase("test")
private lazy val dbColl = db.getCollection("origin2")
然后我们读取数据:
import com.mongodb.client.model.Filters.{eq => eqq}
val docs = dbColl.find(eqq("basiclabel.procedure", "second")).iterator()
额。。上面那段代码是带filter过滤的读取数据。首先Import com.mongodb.client.model.Filters.eq并把eq重命名为eqq,然后通过dbColl.find(Bson)方法读取指定数据。剩下的就是正常的迭代器的使用方法了,docs获取出来的数据是Iterator[Document]。
然后我们更新数据:
dbColl.updateOne(eqq("_id", x.get("_id")), set("segdata", fenduan(str, name)))
上面这段代码是说找到_id对应的数据,并将其中一个字段set为一个新的值,这个值可以为Document,String,Int,List等一系列数据结构。我这里fenduan方法返回的是一个Document,做了一层嵌套。
至于插入数据更为简单:
dbColl.insertOne(doc)
2、不带认证的spark读取方法(scala,理直气壮)
两种方式,其一是在创建sparksession的时候(SparkContext可以使用第二种方法,醒醒兄弟,2017年了),直接指定"spark.mongodb.input.uri"。然后使用正常的MongoSpark来读取数据。(pipeline里面是过滤条件,愿意尝试的各位可以自己试试filter下的其他方法)。使用rdd是因为rdd更适合进行map和flatmap等一系列精细的转换操作,如果只需要读数据,可以使用MongoSpark.read(spark)方法,直接获取DataFrameReader。
val spark = SparkSession.builder()
.master("spark://192.168.2.51:7077")
.config(new SparkConf().setJars(Array("hdfs://192.168.2.51:9000/mongolib/mongo-spark-connector_2.11-2.0.0.jar",
"hdfs://192.168.2.51:9000/mongolib/bson-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/mongo-java-driver-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/mongodb-driver-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/mongodb-driver-core-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/commons-io-2.5.jar",
"hdfs://192.168.2.51:9000/segwithorigin2.jar")))
.config("spark.cores.max", 80)
.config("spark.executor.cores", 16)
.config("spark.executor.memory", "32g")
.config("spark.mongodb.input.uri", "mongodb://192.168.2.51:27017/test.origin2")
// .config("spark.mongodb.output.uri", "mongodb://192.168.12.161:27017/test.origin2")
.getOrCreate()
val rdd = MongoSpark.builder().sparkSession(spark).pipeline(Seq(`match`(eqq("basiclabel.procedure", "second")))).build.toRDD()
第二种方式也较为简单,创建一个ReadConfig,这个是connector提供的一个单例类,可以设置很多参数,例如(此时不必指定"spark.mongodb.input.uri"),如下所示是通过sparkcontext和通过sparksession两种方式读取数据的方法:
val readConfig = ReadConfig(Map(
"uri" -> "mongodb://192.168.2.48:27017/",
"database" -> "test",
"collection" -> "test"
))
val r2 = MongoSpark.load(spark, readConfig).rdd
// val r2 = MongoSpark.load(spark.sparkContext, readConfig)
3、带认证的Java读取方法:
带认证的需要先创建一个MongoURI,在URI里把用户名,密码和认证库都指定清楚。这种方法通用性比较强,因为spark也这么用,如果使用其他方式认证要么是必须使用库等于认证库,要么是没有通用性。这种方法可以在admin认证然后去读test的数据,就很好。
//带认证的需要先创建一个MongoURI,在URI里把用户名,密码和认证库都指定清楚,至于为什么需要指定库建议看上一篇博客
val mongoURI = new MongoClientURI("mongodb://gaoze:gaolaoban@192.168.2.48:27017/?authSource=admin")
//val mongoURI = new MongoClientURI("mongodb://192.168.2.48:27017/");
lazy val mongo = new MongoClient(mongoURI)
private lazy val db = mongo.getDatabase("test")
private lazy val dbColl = db.getCollection("test")
//然后和1一样
4、带认证的Spark读取方法:
同3一样,在URI里加入用户名密码和库就行了:
val spark = SparkSession.builder()
.master("spark://192.168.2.51:7077")
.config(new SparkConf().setJars(Array("hdfs://192.168.2.51:9000/mongolib/mongo-spark-connector_2.11-2.0.0.jar",
"hdfs://192.168.2.51:9000/mongolib/bson-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/mongo-java-driver-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/mongodb-driver-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/mongodb-driver-core-3.4.2.jar",
"hdfs://192.168.2.51:9000/mongolib/commons-io-2.5.jar",
"hdfs://192.168.2.51:9000/segwithorigin2.jar")))
.config("spark.cores.max", 80)
.config("spark.executor.cores", 16)
.config("spark.executor.memory", "32g")
//这里这个配置项指定了用户名gaoze,密码gaolaoban,认证库admin
.config("spark.mongodb.input.uri", "mongodb://gaoze:gaolaoban@192.168.2.51:27017/test.origin2?authSource=admin")
.getOrCreate()
val rdd = MongoSpark.builder().sparkSession(spark).pipeline(Seq(`match`(eqq("basiclabel.procedure", "second")))).build.toRDD()
或者:
//这里指定了用户名rw,密码1,认证库test
val readConfig = ReadConfig(Map(
"uri" -> "mongodb://rw:1@192.168.2.48:27017/?authSource=test",
"database" -> "test",
"collection" -> "test"
))
val rdd = MongoSpark.builder().sparkSession(spark).readConfig(readConfig).build().toRDD()
//val r2 = MongoSpark.load(spark.sparkContext, readConfig)
java及spark2.X连接mongodb3.X单机或集群的方法(带认证及不带认证)的更多相关文章
- 【运维技术】Zookeeper单机以及集群搭建教程
Zookeeper单机以及集群搭建教程 单机搭建 单机安装以及启动 安装zookeeper的前提是必须有java环境 # 选择目录进行下载安装 cd /app # 下载zk,可以去官方网站下载,自己上 ...
- java架构之路(MQ专题)kafka集群配置和简单使用
前面我们说了RabbitMQ和RocketMQ的安装和简单的使用,这次我们说一下Kafka的安装配置,后面我会用几个真实案例来说一下MQ的真实使用场景.天冷了,不愿意伸手,最近没怎么写博客了,还请见谅 ...
- Redis 5.0.7 讲解,单机、集群模式搭建
Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...
- Zookeeper集群搭建(多节点,单机伪集群,Docker集群)
Zookeeper介绍 原理简介 ZooKeeper是一个分布式的.开源的分布式应用程序协调服务.它公开了一组简单的原语,分布式应用程序可以在此基础上实现更高级别的同步.配置维护.组和命名服务.它的设 ...
- 备忘zookeeper(单机+伪集群+集群)
#下载: #单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime ...
- Greenplum源码编译安装(单机及集群模式)完全攻略
公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...
- zookeeper安装和配置(单机+伪集群+集群)
#单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime=2000 ...
- redis在Windows下以后台服务一键搭建集群(单机--伪集群)
redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...
- Spark Tachyon编译部署(含单机和集群模式安装)
Tachyon编译部署 编译Tachyon 单机部署Tachyon 集群模式部署Tachyon 1.Tachyon编译部署 Tachyon目前的最新发布版为0.7.1,其官方网址为http://tac ...
随机推荐
- 帝国cms用户密码忘记怎么修改
帝国CMS7.2忘记后台密码怎么找回呢?有时候经常会忘记用户密码,我们可以通过修改数据库的值来初始化密码,下面就和ytkah一起来操作吧 1:进入phpmyadmin 2:找到 phome_enews ...
- SQL assistant
SQL assistant取消自动生成别名 SQL assistant-->Options-->DB option -->SQL Servers-->Auto Complete ...
- Linux学习和ROS安装(1)
参考文档:https://www.cnblogs.com/liu-fa/p/5779206.html#undefined 系统环境:Window7 64bit+VMware11 ubuntu-gnom ...
- webpack打包多个入口文件
打包后的目录结构: webpack.config.js // path 模块提供了一些用于处理文件路径 const path = require('path'); // fs模块用于对系统文件及目录进 ...
- 抛异常 throw的注意事项
子类覆盖父类只能抛出父类的异常或者子类或者子集注意:如果父类的方法没有抛异常,那么子类覆盖时绝对不能抛. 子类继承父类时,方法抛异常,要么抛父类,要么抛父类下的子类,不能抛父类平级或以上的异常 原因是 ...
- Linux开启root用户
1.进入系统的时候Ctrl + Alt + F1,切换到命令窗口,登录现有用户: 2.执行sudo passwd root + root的密码: 3.按照要求输入密码: ==> root用户密码 ...
- 新发现:排序算法时间复杂度只有O(3n),命名为"wgw"排序法
思路:首先在待排序数组i[]中找出最大的值,以(最大值+1)的大小创建一个空数组kk[],然后遍历待排序数组i[]中的值n,其值n对应数组kk[]中的第n个元素加1.最后再把数组kk[]排好序的值赋回 ...
- 【LeetCode每天一题】Median of Two Sorted Arrays(两数组中的中位数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the tw ...
- git的reset的理解
git的reset的理解 1.在理解reset命令之前,先对git中涉及到的与该reset命令相关概念进行说明和解释HEAD这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交Indexind ...
- 19-Python3 函数
def area(width,heigh): return width*heigh def print_wecome(name): print('welcome',name) print('Runoo ...