前几天领导让用spark集成OceanBase支持读写,没办法只能简单的了解一下OceanBase,然后搭建了一个单机版的OceanBase测试使用,这里也理解的比较浅显,毕竟时间紧任务重,一切以完成任务为目的。。。
简单的介绍一下OceanBase 吧,大部分都是从官网直接拿过来的
OceanBase 数据库是阿里巴巴和蚂蚁集团不基于任何开源产品,完全自研的原生分布式关系数据库软件
, 产品具有云原生、强一致性、高度兼容 Oracle/MySQL 等特性
OceanBase 数据库具有业务连续性、应用易用性、低成本及低风险的产品优势。
OceanBase 数据库采用 Shared-Nothing
架构,各个节点之间完全对等,每个节点都有自己的 SQL 引擎、存储引擎,运行在普通 PC 服务器组成的集群之上,具备可扩展、高可用、高性能、低成本、云原生等核心特性。
OceanBase 数据库支持数据跨地域(Region)部署,以 OceanBase 数据库可以支持多城市部署,也支持多城市级别的容灾。一个 Region 可以包含一个或者多个 Zone,Zone 是一个逻辑的概念,它包含了 1 台或者多台运行了 OBServer 进程的服务器。
每个 Zone 会提供两种服务:总控服务(RootService)和分区服务(PartitionService)。总控服务负责整个集群的资源调度、资源分配、数据分布信息管理以及 Schema 管理等功能
OceanBase 数据库基于 Paxos 的分布式选举算法来实现系统的高可用,
Parser(词法/语法解析模块)
Resolver(语义解析模块)
Transfomer(逻辑改写模块)
Optimizer(优化器)
Code Generator(代码生成器)
Executor(执行器)
Plan Cache(执行计划缓存模块)
安装参考视频,安装参考博客,代码参考地址,
pom依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
<type>jar</type>
</dependency>
1.安装
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y ob-deploy
yum install -y obclient
2.自己手动上传配置文件(位置无所谓),根据自己集群模式选择对应的配置文件
配置文件地址:https://gitee.com/oceanbase/obdeploy/tree/master/example
3.启动oceanbase
//启动之前注意:
3.1:先检查句柄限制,修改/etc/security/limits.conf配置,不修改会报错
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited
3.2:检查可用内存是否大于8G(即使在上一步自己上传的配置文件将启动可用内存修改小于8G也不行),实际可用内存必须大于8G,否则绝对报错,而且错误信息根本无从排查,以下是错误信息,曾卡了我一天
Check before start observer ok
[WARN] (127.0.0.1) clog and data use the same disk (/)
Start observer ok
observer program health check x
[WARN] failed to start 127.0.0.1 observer
[ERROR] oceanbase-ce start failed
注意:如果配置文件中的ip由127.0.0.1改为自己的ip,那么也要将配置文件中的devname属性改为自己的网卡名!!
3.3:安装集群( /opt/oceanbase/mini-local-example.yaml是我自己上传的配置文件的路径)
obd cluster deploy oceanTest -c /opt/oceanbase/mini-local-example.yaml -f
mini-local-example.yaml是上传的配置文件,
oceanTest是指定的集群名(不可重复,默认在/root/.obd/cluster/下,如果启动时发生错误,又不想改集群名,可手动删除系统创建的集群名文件夹,再用命令)
-f:配置文件中有一个目录,不可有内容;-f表示覆盖,可用于启动错误后第二次启动(未手动删除之前的目录)
如果报错:
[ERROR] (127.0.0.1) / not enough disk space for clog. Use `redo_dir` to set other disk for clog, or reduce the value of `datafile_size`
那么修改配置文件中的datafile_disk_percentage属性,改小一些
3.4启动 oceanTest:上一步启动时的集群名字
obd cluster start oceanTest
obd cluster stop oceanTest //停止
3.5启动成功,查看状态 oceanTest:上一步启动时的集群名字
obd cluster display oceanTest
4.连接oceanBase
127.0.0.1:IP
2881:配置文件中配置的端口号,若配置文件中修改,这里也要修改,可根据3.5查看状态;
obclient -h127.0.0.1 -P2881 -uroot
5.使用Navicat连接OceanBase(没记错的话,默认没密码)
这里附上一张使用Navicat连接OceanBase的截图:默认没密码
val conf = new SparkConf().setAppName("test").setMaster("local[4]")
val spark = SparkSession.builder().config(conf).getOrCreate()
//读数据
val df= spark.read.format("jdbc")
.option("url", "jdbc:mysql://127.0.0.1/dbname")
.option("driver", "com.mysql.jdbc.Driver")
.option("dbtable", "tc_table")
.option("user", "root")
.option("password","password")
.load()
df.show()
//写数据
val df = spark.createDataFrame(Seq(
("ming", 20, 15552211521L),
("hong", 19, 13287994007L),
("zhi", 21, 15552211523L)
)).toDF("name", "age", "phone")
val properties = new Properties()
properties.put("user", "root")
properties.put("password", "password")
properties.put("driver","com.mysql.jdbc.Driver")
properties.put("isolationLevel","NONE") //如果这里事务不设置NONE,会报错
//写入TiDB数据库的tc_table表中
df.write.mode(SaveMode.Append).jdbc("jdbc:mysql://127.0.0.1/dbname","tc_table",properties)``