关于OceanBase与CDH适配的经验分享
CDH是Cloudera早期推出的一个开源平台版本,它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台,专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目,Cloudera构建了一个功能强大的系统,能够支持从端到端的大数据工作流处理。CDH的免费版本在6.3.2版本后停止了更新,转而专注于商业版本的发布。尽管如此,许多企业仍选择利用该免费版本的CDH成功部署了Hadoop大数据平台。
简单来说:CDH 是一个拥有集群自动化安装、中心化管理、集群监控、报警功能的一个工具(软件),使得集群的安装可以从几天的时间缩短为几个小时,运维人数也会从数十人降低到几个人,极大的提高了集群管理的效率。
1、前言
CDH的配置库支持Mysql,Oracle及postgresql数据库,大部分公司使用的是Mysql作为CDH的配置库,在高可用场景中,Mysql容易成为单点故障的关键点,而OceanBase天然具备高可用特性,有必要研究切换CDH的配置库为OceanBase,如此就有了这篇文章。
2、遇到的问题
问题一:在安装启动CM启动过程中,第一步将初始化配置数据库SQL的时候,有检查数据库的引擎,必须是InnoDB,如图1,原因是OB执行show engines返回的是OceanBase,如图2。(OB数据库可定制show engines输出来支持就好了)

图1-CM启动报错图

图2-OB执行show engines
问题2:通过重新编译源码,绕过CM对数据库引擎检查后,报不支持连续修改的错误,报错见图3-1及图3-2,原因是OB作为分布式数据库,为分布式一致性不支持连续执行ddl修改操作,需分步骤执行才能成功,如图4。(OB数据库能社加个开关支持连续修改就好了)

图3-1,通过逗号连接,连续修改数据库表报错-1

图3-2连续修改数据库表,上条未执行完执行下一条报错

图4-需改造CM的ddl语句
应对以上两个问题,经和社区大佬分析、评估及指导后,做出以下两个解决方案:
- 修改OB源码,编译并安装修改后的Observer,绕过CM的show engines的检查;
- 修改CM的ddl,绕过OB不支持连续执行的ddl;
下面以此操作步骤为线,记录这个过程。
3、编译OceanBase、安装和租户创建
1. 下载源码
git clone https://github.com/oceanbase/oceanbase.git
2. 修改源码
vim src/observer/virtual_table/ob_all_virtual_engine_table.cpp
第58行OceanBase改为InnoDB,如图5

图5-OceanBase改为InnoDB
3. 编译源码
编译流程见 编译方法 ,编译后新的RPM包在oceanbase/build_rpm目录下,RPM包见图6

图6-编译后的RPM包
4. 安装及启动
安装oceanbase-ce-4.1.0.0-1.el7.x86_64.rpm
rpm -ivh oceanbase-ce-4.1.0.0-1.el7.x86_64.rpm
拷贝安装目录bin下observer文件,使用OBD部署一个4.0环境,替换bin下observer文件为新文件,并启动,如图7;修改后的show engines如图8

图7-启动OB

图8-show engine
5. 准备用于安装CDH的租户及用户
登录系统root,并创建租户
CREATE RESOURCE UNIT unit001 MAX_CPU 8,MEMORY_SIZE '10G';
CREATE RESOURCE POOL pool001 UNIT='unit001',UNIT_NUM=1,ZONE_LIST=('zone1');
CREATE TENANT IF NOT EXISTS cdhCHARSET='utf8mb4',PRIMARY_ZONE='zone1',RESOURCE_POOL_LIST=('pool001')SET ob_tcp_invited_nodes='%';
登录租户root,并准备用户 bigdata 密码 Bigdata@cdh_test,并创建cmdb数据库和hive数据库
alter user root identified by 'Root@cdh_test' ;
CREATE USER 'bigdata' IDENTIFIED BY 'Bigdata@cdh_test';
CREATE DATABASE cmdbDEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON *.* TO bigdata WITH GRANT OPTION;
4、安装CDH并配置CM
(省略1千字的安装过程)
tar -zxvf cm6.3.1-redhat7.tar.gz
cd /home/shaqf/cm6.3.1/RPMS/x86_64
rpm -ivh cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm
yum install cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm
1. 修改数据库配置文件
vim /etc/cloudera-scm-server/db.properties
内容
com.cloudera.cmf.db.type=mysql
com.cloudera.cmf.db.host=192.168.21.17:2881
com.cloudera.cmf.db.name=cmdb
com.cloudera.cmf.db.user=bigdata@cdh
com.cloudera.cmf.db.setupType=EXTERNAL
com.cloudera.cmf.db.password=Bigdata@cdh_test
启动CM
service cloudera-scm-server restart
查看日志:more /var/log/cloudera-scm-server/cloudera-scm-server.log,报错如图9

图9-执行ddl报错
2. 修改ddl
修改/opt/cloudera/cm/schema/mysql下的所有ddl文件,修改如图4;
这里使用java进行批量修改,代码如下:
import java.io.*;
import java.util.HashSet;
import java.util.Set;public class StartMain {public static void main(String[] args) throws Exception {File pathFile = new File("C:\\Users\\sha\\Desktop\\mysql\\");Set<File> fileSet = new HashSet<>();findFiles(pathFile, fileSet);for (File file:fileSet) {RandomAccessFile raf = new RandomAccessFile(file,"r");String line = null;String preLine = null;StringBuffer sbfDDL = new StringBuffer();while ((line = raf.readLine()) != null){if(line.trim().startsWith("alter table ")){preLine = line;sbfDDL.append(line);sbfDDL.append("\n");} else if (line.trim().startsWith("add index ") && line.trim().endsWith(",")){line = line.replaceAll(",",";");sbfDDL.append(line);sbfDDL.append("\n");sbfDDL.append(preLine);sbfDDL.append("\n");} else {sbfDDL.append(line);sbfDDL.append("\n");}}BufferedWriter bufWriter = null;try {bufWriter = new BufferedWriter(new FileWriter(file, false));// 覆盖bufWriter.write(sbfDDL.toString());bufWriter.flush();} catch (Exception e) {e.printStackTrace();} finally {if (bufWriter != null) {try {bufWriter.close();} catch (IOException e) {e.printStackTrace();}}}}}private static void findFiles(File file, Set<File> files) {if (file.isDirectory()) {File[] fileArray = file.listFiles();if (fileArray != null) {for (int i = 0; i < fileArray.length; i++) {findFiles(fileArray[i], files);}}} else {files.add(file);}}
}
上传修改后的ddl,清空cmdb数据库,再次执行重启任务,有关命令如下
drop database cmdb;
CREATE DATABASE cmdb
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
service cloudera-scm-server restart
查看日志:more /var/log/cloudera-scm-server/cloudera-scm-server.log,报错如图9

图9-ddl报错
3. 继续修改ddl
继续修改/opt/cloudera/cm/schema/mysql下的所有ddl文件,修改如图4;
这里使用java到Linux上进行批量修改,代码如下:
import java.io.*;
import java.util.HashSet;
import java.util.Set;public class StartMain {public static void main(String[] args) throws Exception {File pathFile = new File("/opt/cloudera/cm/schema/mysql");Set<File> fileSet = new HashSet<>();findFiles(pathFile, fileSet);for (File file:fileSet) {RandomAccessFile raf = new RandomAccessFile(file,"r");String line = null;String preLine = null;StringBuffer sbfDDL = new StringBuffer();boolean isAlterLine = false;while ((line = raf.readLine()) != null){if(line.trim().startsWith("alter table ")){preLine = line;sbfDDL.append(line);sbfDDL.append("\n");isAlterLine = true;} else if (line.trim().startsWith("add ") && line.trim().endsWith(",")){line = line.replaceAll(",","; select sleep(1); ");sbfDDL.append(line);sbfDDL.append("\n");sbfDDL.append(preLine);sbfDDL.append("\n");} else if (line.trim().startsWith("modify ") && line.trim().endsWith(",")){line = line.replaceAll(",","; select sleep(1); ");sbfDDL.append(line);sbfDDL.append("\n");sbfDDL.append(preLine);sbfDDL.append("\n");} else if (line.trim().startsWith("drop ") && line.trim().endsWith(",")){line = line.replaceAll(",","; select sleep(1); ");sbfDDL.append(line);sbfDDL.append("\n");sbfDDL.append(preLine);sbfDDL.append("\n");} else {if(isAlterLine && line.trim().endsWith(";")){line = line.replaceAll(";","; select sleep(1); ");}sbfDDL.append(line);sbfDDL.append("\n");}}BufferedWriter bufWriter = null;try {bufWriter = new BufferedWriter(new FileWriter(file, false));// 覆盖bufWriter.write(sbfDDL.toString());bufWriter.flush();} catch (Exception e) {e.printStackTrace();} finally {if (bufWriter != null) {try {bufWriter.close();} catch (IOException e) {e.printStackTrace();}}}}}private static void findFiles(File file, Set<File> files) {if (file.isDirectory()) {File[] fileArray = file.listFiles();if (fileArray != null) {for (int i = 0; i < fileArray.length; i++) {findFiles(fileArray[i], files);}}} else {files.add(file);}}}
修改ddl文件:
vim 05021_cmf_schema.mysql.ddl
vim 05300_cmf_schema.mysql.ddl
分别注释掉下面两行(05021_cmf_schema.mysql.ddl新增IDX_CLIENT_CONFIG_HOST索引,05300_cmf_schema.mysql.ddl又删除IDX_CLIENT_CONFIG_HOST索引,而05300_cmf_schema.mysql.ddl删除索引会报错)
--alter table CLIENT_CONFIGS
-- add index IDX_CLIENT_CONFIG_HOST (HOST_ID); select sleep(1);-- alter table CLIENT_CONFIGS
-- drop index IDX_CLIENT_CONFIG_HOST; select sleep(1);
如图-10修复所有即建索引又指定主键的ddl

图-10 在建表时不能即建索引又指定主键(修复方法:索引单独创建)
确保ddl修改完成后,清空cmdb数据库,再次执行重启任务,有关命令如下
drop database cmdb;
CREATE DATABASE cmdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
service cloudera-scm-server restart
查看日志:more /var/log/cloudera-scm-server/cloudera-scm-server.log,报错如图-11,报错不影响接入系统(后续得观察运行稳定性)

图-11 启动报错
5、登录系统
登录地址:http://192.168.25.47:7180/ 如图-12

图-12 成功接入CM
相关文章:
关于OceanBase与CDH适配的经验分享
CDH是Cloudera早期推出的一个开源平台版本,它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台,专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目,Cloudera构建了一个功能…...
基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践
近年来,随着国产AI芯片的日益崛起,基于国产AI芯片的模型适配、性能优化以及应用落地是国产AI应用的一道重要关卡。如何在复杂的京东零售业务场景下更好地使用国产AI芯片,并保障算力安全,是目前亟需解决的问题。对此,京…...
第五十四:渲染数据 v-text 和 v-html
v-text : 解析成文本 v-html: 解析成 html <div id"app"><h3>{{ web.title }}</h3><!-- v-text 将数据解析为纯文本格式 --><h3 v-text"web.title"></h3><!-- v-html 将数据解析为 html 格式 --><h3 v-htm…...
HTML label 标签使用
点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签,可以使表单更加友好和易于使用,同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…...
GB28181开发--ZLMediaKit+WVP+Jessibuca
一、核心组件功能 1、ZLMediaKit 定位:基于 C++11 的高性能流媒体服务框架,支持 RTSP/RTMP/HLS/HTTP-FLV 等协议互转,具备低延迟(最低 100ms)、高并发(单机 10W 级连接)特性,适用于商用级流媒体服务器部署。 特性:跨平台(Linux/Windows/ARM 等)、支持 …...
Linux和gcc/g++常用命令总结
目录 Linux命令总结 文件操作相关命令 ls cd pwd cp mv rm cat mkdir rmdir touch 文本处理操作命令 grep awk sed 进程管理操作相关命令 ps top htop kill pkill killall chmod chown 网络操作相关命令 ping ifconfig netstat ss lsof curl …...
Sqoop从入门到使用
安装和配置 修改文件配置:修改文件名将(sqoop-env-template.sh改为sqoop-env.sh) 编辑sqoop-env.sh内部文本,修改调用文件位置 将sqoop-env.sh,配置到全局变量中,方便调用。 查看正常运用 第一类࿱…...
2024华为OD机试真题-磁盘容量排序算法(C++)-E卷B卷-100分
2024华为OD机试题库-(E卷+C卷+D卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 考点 题目解析 代码 c++ 题目描述 磁盘的容量单位常用的有 M,G,T 这三个等级,它们之间的换算关系为: 1T = 1024G 1G = 1024M 现在给定 n 块磁盘的容量,…...
【数据结构】堆(挑战从零基础到进阶)
我们从概念开始一步步来学习堆,下面我们来从零基础来解剖该种数据结构。先提前透明:实现堆其实就是基于数组来实现一个完全二叉树而已 ! 目录 堆的概念 堆的性质 堆的物理逻辑&思维逻辑 堆的节点对应关系 堆的核心操作 (…...
阿里 DataWorks:数据治理、安全中心、数据质量核心功能梳理
文章目录 阿里 DataWorks:云原生数据治理与安全一体化实践指南一、数据治理中心1.1 数据治理体系1.2 产品架构全图1.3 概要使用路径1.4 治理现状评估数据治理健康分评估模型 1.5 检查项 & 治理项(1) 检查项(2) 治理项 1.6 治理工具箱1.7 治理结果查看 二、安全中…...
DeepSeek精品课分享 清北
AI淘金潮上热搜!有人已经靠DeepSeek日入过万了! 北大清华等高校也相继出品DeepSeek高质量精品课程,在网上传疯。帮助学者高效学习AI从入门到精通! 完整版资料已经帮大家整理好了,免费领! 资料链接: htt…...
获取当前页面的 url 参数
一、使用 URLSearchParams(现代浏览器支持) URLSearchParams 是 JavaScript 提供的一个内置对象,用于处理 URL 的查询字符串,它提供了一系列方便的方法来获取、设置和删除查询参数。 // 获取当前页面的 URL 参数 const queryStr…...
解锁健康密码,开启养生之旅
在这个生活节奏飞快、压力如影随形的时代,健康养生不再是一句空泛的口号,而是我们对高品质生活的热切追求。它就像一把神奇的钥匙,能够打开通往活力与幸福的大门。 日常习惯与养生息息相关。晨起后,空腹喝一杯温水,如…...
Mybatis集合嵌套查询,三级嵌套
三个表:房间 玩家 玩家信息 知识点:Mybatis中级联有关联(association)、集合(collection)、鉴别器(discriminator)三种。其中,association对应一对一关系、collectio…...
Python的Pandas和matplotlib库:让数据可视化贼简单
在数据爆炸的时代,数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言,拥有众多用于数据可视化的库,而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据,还具备强大的数据可视化功能,让我们轻…...
数据结构基础之《(19)—矩阵处理》
一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序:1,2,7,13,8,3,4,9,14... 核心技巧:找到coding上的宏观调度 左上角有A、B两个点,A往右一步一步走,B往下一步一步走 写一个…...
IDEA与Maven使用-学习记录(持续补充...)
1. 下载与安装 以ideaIU-2021.3.1为例,安装步骤: 以管理员身份启动ideaIU-2021.3.1修改安装路径为:D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】(可选)、【打开文件夹作为项目】&…...
【运维笔记】docker 中 MySQL从5.7版本升级到8.0版本 - 平滑升级
在Docker环境中,将MySQL从5.7版本升级到8.0版本时,数据确实需要迁移。虽然不能直接通过docker-compose命令简单地进行版本升级并保留所有数据,但可以通过一系列步骤来实现平滑升级和数据迁移。以下是详细的迁移步骤: 一、准备阶段…...
nuxt2 打包优化使用“compression-webpack-plugin”插件
在使用 Nuxt.js 构建项目时,为了提高性能,通常会考虑对静态资源进行压缩。compression-webpack-plugin 是一个常用的 Webpack 插件,用于在生产环境中对文件进行 Gzip 压缩。这对于减少网络传输时间和提高页面加载速度非常有帮助。下面是如何在…...
fastapi+mysql实现增删改查
说明: 我计划用python的fastapi框架,实现操作MySQL数据库的表,实现增删改查的操作,并且在postman里面测试 step1: 安装数据库依赖 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…...
ArcGIS Pro:轻松制作地震动画,洞察灾害动态
在当今的信息展示领域,动画因其直观、生动的特点,逐渐成为各类汇报、研究展示中的重要元素。 尤其是在地理信息领域,通过动画来展示动态的地理现象,能够让观众更清晰地理解数据背后所蕴含的信息。 地震作为一种突发性的自然灾害…...
Redis系列之慢查询分析与调优
Redis 慢查询分析与优化:提升性能的实战指南 Redis 作为一款高性能的内存数据库,因其快速的数据读写能力和灵活的数据结构,被广泛应用于缓存、消息队列、排行榜等多种业务场景。然而,随着业务规模的扩大和数据量的增加࿰…...
Linux下磁盘读写流
用户空间请求 系统调用:应用程序通过系统调用(如 read() 或 write())请求对文件或设备进行读写操作。 文件描述符:操作通过文件描述符进行,该描述符在应用程序打开文件时获得。 VFS(虚拟文件系统ÿ…...
MAVEN手动配置(阿里云)全教程
介于网上各种各样的MAVEN配置过程中方法大致相同却细节参差不齐,我总结了我遇见的一些问题,来完全的解决MAVEN手动配置的全过程,以及分享解决小毛病的经验。 所需材料: MAVEN3.9.9(下载适合自己的版本即可)…...
贪心算法一
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是贪心算法,并且掌握贪心算法。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! >…...
计算机毕业设计Python+DeepSeek-R1大模型微博的话题博文及用户画像分析系统 微博舆情可视化(源码+ 文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Android Framework 常见面试题
以下是常见的 Android Framework 面试题,涵盖基础到高级知识点,帮助准备面试: 一、基础问题 Android 系统架构分层 描述 Android 系统的四层架构(Linux Kernel、Native、Framework、Application)及各层职责。 Zygote …...
绕过某书frida反调试检测 获取某宝支付参数
前言 在移动应用安全测试和研究过程中,我们经常需要使用Frida等工具对应用进行动态分析。然而,很多应用都实现了反调试和反注入机制,用来检测并阻止此类分析工具的使用。本文将分享如何使用Frida绕过某流行阅读应用(以下简称"某书",本次任务目的原本是需要找出…...
Secret Cow Code S
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝 既然选择了远方,当不负青春,砥砺前行! 题目描述 奶牛们正在实验秘密代码,并设计了一种方法用于生成无限长度的字符…...
MyBatis - XML CRUD 其他查询
1. XML 配置文件 使用 MyBatis 操作数据库的方式有两种: 注解 (在注解中定义 SQL 语句)XML 配置文件 (在 XML 文件中定义 SQL 语句) 在上一篇博客中, 已经讲解了如何使用注解操作数据库, 本篇文章来讲解如何使用 XML 进行 MyBatis 开发. 使用 XML 的步骤, 和使用注解的步骤…...
