关于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输出来支持就好了)

1677989041

图1-CM启动报错图

1677988399

图2-OB执行show engines

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

1678015742

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

1678017040

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

1678022152

图4-需改造CM的ddl语句

应对以上两个问题,经和社区大佬分析、评估及指导后,做出以下两个解决方案:

  1. 修改OB源码,编译并安装修改后的Observer,绕过CM的show engines的检查;
  2. 修改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

1677993608

图5-OceanBase改为InnoDB

3. 编译源码

编译流程见 编译方法 ,编译后新的RPM包在oceanbase/build_rpm目录下,RPM包见图6

1677993892

图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

1678000592

图7-启动OB

1678000808

图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

1678015742

图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

1678017040

图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

1678097791

图-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,报错不影响接入系统(后续得观察运行稳定性)

1678097821

图-11 启动报错

5、登录系统

登录地址:http://192.168.25.47:7180/ 如图-12

1678097831

图-12 成功接入CM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电机驱动电路:单桥(H桥)与双桥(双H桥)详解

一、电机驱动电路的作用 电机驱动电路通过控制电流方向和大小,实现电机的正反转、调速及制动。常见的结构包括单桥(H桥)和双桥(双H桥),分别适用于不同场景。 二、单桥(H桥)驱动电路 1. 结构示意图(文字描述) 开关元件:4个功率开关(如MOSFET或IGBT)组成桥臂,分…

[网络爬虫] 动态网页抓取 — Selenium 入门操作

&#x1f31f;想系统化学习爬虫技术&#xff1f;看看这个&#xff1a;[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01&#xff1a;WebDriver 类基础属性 & 方法 为模仿用户真实操作浏览器的基本过程&#xff0c;Selenium 的 WebDriver 模块提供了一个 WebDriver 类…

牛客周赛A:84:JAVA

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 \hspace{15pt}小红定义一个数组的陡峭值为&#xff1a;每两个相邻的元素&#xff0c;差值的绝对值之和。例如&#xff0c;数组 {2,3,1}\{2,3,1\}{2,3,1} 的陡峭值是 ∣2−3∣∣3−1∣…

Cython编译去掉符号表

在Cython编译过程中去掉符号表&#xff08;symbol table&#xff09;可以增加生成代码的安全性&#xff0c;使其更难被逆向工程。然而&#xff0c;需要注意的是&#xff0c;Cython本身并不直接提供一个开关来去除符号表。通常&#xff0c;这是通过编译器和链接器的选项来实现的…

在 IntelliJ IDEA(2024) 中创建 JAR 包步骤

下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤&#xff1a; ​1. 选择File -> Project Structure->Artifacts&#xff0c; (1)点击➕新建&#xff0c;如下图所示&#xff1a; (2)选择JAR->Empty (3)输入jar包名称&#xff0c;确定输出路径 &#xff08;4&#…

Python零基础学习第三天:函数与数据结构

一、函数基础 函数是什么&#xff1f; 想象你每天都要重复做同一件事&#xff0c;比如泡咖啡。函数就像你写好的泡咖啡步骤说明书&#xff0c;每次需要时直接按步骤执行&#xff0c;不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…

idea启动项目报端口被占用

端口确实被占用 winR&#xff0c;输入cmd&#xff0c;进入终端&#xff0c;查找到对应端口的进程id&#xff0c;杀掉项目 netstat -ano | findstr "8080"taskkill /F /PID 37020 idea设置中&#xff0c;选择让maven代替进行项目关闭&#xff0c;此时其实点击build可…

达梦数据库在Linux,信创云 安装,备份,还原

&#xff08;一&#xff09;系统环境检查 1操作系统&#xff1a;确认使用的是国产麒麟操作系统&#xff0c;检查系统版本是否兼容达梦数据库 V8。可以通过以下命令查看系统版本&#xff1a; cat /etc/os-release 2硬件资源&#xff1a;确保服务器具备足够的硬件资源&#xff0…

Java中,BIO、NIO和AIO三种模型的区别和适用场景

在Java中&#xff0c;BIO&#xff08;同步阻塞IO&#xff09;、NIO&#xff08;同步非阻塞IO&#xff09;和AIO&#xff08;异步非阻塞IO&#xff09;是三种核心的I/O模型&#xff0c;它们在处理网络通信时有着不同的设计理念和适用场景。以下从核心特性、适用场景及联系三方面…

p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳

向 豆包 提问&#xff1a;编写一个 p5.js 脚本&#xff0c;模拟 42 个彩色小球在一个3D大球体内部弹跳。每个小球都应留下一条逐渐消失的轨迹。大球体应缓慢旋转&#xff0c;并显示透明的轮廓线。请确保实现适当的碰撞检测&#xff0c;使小球保持在球体内部。 cd p5-demo copy…

linux环保监测4G边缘网关:环境数据的可靠传输者

环保监测工控机&#xff0c;常被称为“环境数据采集器”或“环保数据终端”&#xff0c;是一种专门用于环境监测领域的工业计算机。它具备强大的数据处理能力、稳定的运行性能和多种接口&#xff0c;能够实时采集、处理和传输环境监测数据。这些数据包括空气质量、水质、噪声、…

k8s概念及k8s集群部署(Centos7)

Centos7部署k8s集群 部署之前&#xff0c;先简单说下k8s是个啥&#xff1a; 一、k8s简介&#xff1a; k8s&#xff0c;全称&#xff1a;kubernetes&#xff0c;它可以看作是一个分布式系统支撑平台。k8s的作用&#xff1a; 1、故障自愈&#xff1a; k8s这个玩意可以监控容器…

HTML 文本格式化

HTML 文本格式化 在构建网页的过程中&#xff0c;文本的格式化是一个至关重要的环节。HTML&#xff08;HyperText Markup Language&#xff09;提供了丰富的标签和属性来帮助我们实现各种文本格式化的需求。本文将详细介绍HTML中常见的文本格式化方法&#xff0c;包括字体、颜…

Manus AI Agent 技术解读:架构、机制与竞品对比

目录 1. Manus 是什么&#xff1f; 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在&#xff1f; 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…

【学习思维模型】

学习思维模型 一、理解类模型二、记忆类模型三、解决问题类模型四、结构化学习模型五、效率与习惯类模型六、高阶思维模型七、实践建议八、新增学习思维模型**1. 波利亚问题解决四步法****2. 主动回忆(Active Recall)****3. 鱼骨图(因果图/Ishikawa Diagram)****4. MECE原则…

PCIE接口

PCIE接口 PIC接口介绍PIC总线结构PCI总线特点PCI总线的主要性能PIC的历程 PCIE接口介绍PCIe接口总线位宽PCIE速率GT/s和Gbps区别PCIE带宽计算 PCIE架构PCIe体系结构端到端的差分数据传递PCIe总线的层次结构事务层数据链路层物理层PCIe层级结构及功能框图 PCIe链路初始化PCIe链路…

大语言模型(LLM)和嵌入模型的统一调用接口

ChatModelFactory、EmbeddingModelFactory 讲解代码&#xff1a;import os from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelF…

在Linux开发板中使用.NET实现音频开发

本文将以Linux开发板为基础&#xff0c;使用ALSA音频框架和C#语言&#xff0c;演示如何实现基础的音频录制与播放功能。 1. 背景 音频处理是嵌入式开发中常见的需求&#xff0c;无论是语音交互、环境监测还是多媒体应用都离不开音频模块的支持。在Linux系统中&#xff0c;ALSA…

Windows控制台函数:控制台输出函数WriteConsoleA()

目录 什么是 WriteConsoleA&#xff1f; 函数签名 参数详解 返回值 一个最简单的例子 跟 ReadConsoleA 对比 再试一个有趣的例子 为什么传地址给 lpNumberOfCharsWritten&#xff1f; 注意事项 什么是 WriteConsoleA&#xff1f; WriteConsoleA 是一个 Windows API 函…

【贪心算法】将数组和减半的最小操作数

1.题目解析 2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 使用当前数组中最大的数将它减半&#xff0c;&#xff0c;直到数组和减小到一半为止&#xff0c;从而快速达到目的 重点是找到最大数&#xff0c;可以采用大根堆快速达到…