SparkDataFrame操作OceanBase

文章目录

      • 前言
        • 架构
        • 集群架构
        • SQL 引擎执行过程
      • OceanBase安装
      • SparkDataFrame链接OceanBase

前言

前几天领导让用spark集成OceanBase支持读写,没办法只能简单的了解一下OceanBase,然后搭建了一个单机版的OceanBase测试使用,这里也理解的比较浅显,毕竟时间紧任务重,一切以完成任务为目的。。。

简单的介绍一下OceanBase 吧,大部分都是从官网直接拿过来的
OceanBase 数据库是阿里巴巴和蚂蚁集团不基于任何开源产品,完全自研的原生分布式关系数据库软件, 产品具有云原生、强一致性、高度兼容 Oracle/MySQL 等特性

OceanBase 数据库具有业务连续性、应用易用性、低成本及低风险的产品优势。

架构

OceanBase 数据库采用 Shared-Nothing 架构,各个节点之间完全对等,每个节点都有自己的 SQL 引擎、存储引擎,运行在普通 PC 服务器组成的集群之上,具备可扩展、高可用、高性能、低成本、云原生等核心特性。
SparkDataFrame操作OceanBase_第1张图片

集群架构

OceanBase 数据库支持数据跨地域(Region)部署,以 OceanBase 数据库可以支持多城市部署,也支持多城市级别的容灾。一个 Region 可以包含一个或者多个 Zone,Zone 是一个逻辑的概念,它包含了 1 台或者多台运行了 OBServer 进程的服务器。

每个 Zone 会提供两种服务:总控服务(RootService)和分区服务(PartitionService)。总控服务负责整个集群的资源调度、资源分配、数据分布信息管理以及 Schema 管理等功能

OceanBase 数据库基于 Paxos 的分布式选举算法来实现系统的高可用,

SQL 引擎执行过程

SparkDataFrame操作OceanBase_第2张图片

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>

OceanBase安装

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的截图:默认没密码
SparkDataFrame操作OceanBase_第3张图片

SparkDataFrame链接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)``

你可能感兴趣的:(scala,spark)