关于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.rhkb.cn/news/30925.html

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

相关文章

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

假设检验与置信区间在机器学习中的应用

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 &#x1f4da; 引言 在机器学…

鸿蒙Next-应用检测、安装以及企业内部商店的实现

一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…

Locker 是 Godot 的一个开源插件,它提供了一种快速且可扩展的方式来使用不同的策略保存和加载数据,并且具有开箱即用的 JSON 和加密功能。

一、软件介绍 文末提供下载 Locker 插件是在 Godot 4.3 中创建的框架&#xff0c;旨在简化在 Godot 项目中保存、加载和管理数据的过程。该插件的主要目标之一是对用户自定义开放&#xff0c;允许使用不同的用户定义策略来访问数据。并且具有开箱即用的 JSON 和加密功能。 二、…

(更新完)LPZero: Language Model Zero-cost Proxy Search from Zero

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

Varlens(手机上的单反)Ver.1.9.3 高级版.apk

Varlens 是一款专业级手机摄影软件&#xff0c;旨在通过丰富的功能和高自由度参数调节&#xff0c;让手机拍摄效果媲美微单相机。以下是核心功能总结&#xff1a; 一、核心功能 专业拍摄模式 支持手动/自动/程序模式&#xff0c;可调节ISO、快门速度、EV、白平衡等参数27 提供…

Unity2017打包出来后的场景一片红

bug展示&#xff1a; 解决办法&#xff1a; Edit——Project Settings——Graphics——添加下面这俩Shader(用于UI展示)即可。

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

html-表格标签

一、表格标签 1. 表格的主要作用 表格主要用于显示&#xff64;展示数据,因为它可以让数据显示的非常的规整,可读性非常好&#xff61;特别是后台展示数据 的时候,能够熟练运用表格就显得很重要&#xff61;一个清爽简约的表格能够把繁杂的数据表现得很有条理&#xff61; 总…

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

Oracle RAC配置原理详解:构建高可用与高性能的数据库集群

在现代企业级应用中&#xff0c;数据库的高可用性和高性能是至关重要的。Oracle Real Application Clusters&#xff08;RAC&#xff09;是Oracle数据库提供的一种集群解决方案&#xff0c;能够将多个数据库实例部署在不同的服务器上&#xff0c;实现负载均衡和故障切换&#x…

ESP8266TCP客户端(单连接TCP Client)

单连接TCP Client 电脑作为服务器&#xff0c;8266作为客户端 1.配置WiFi模式 ATCWMODE3 //softAPstation mode 相应&#xff1a;ok 2.连接路由器 ATCWJAP“SSID”&#xff0c;“password” //SSID就是wifi的名字&#xff0c; password WIFI密码 响应&#xff…

【Linux】软硬连接与动静态库

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.软硬连接02.动静态库静态库&#xff08;Static Library&#xff09;动态库&#xff08;Dynamic Library&#xff09; 03.动态库加载 01.软硬连接 我们先看一下它的用法 这个是…

关于Springboot 应配置外移和Maven个性化打包一些做法

期望达到的效果是每次更新服务器端应用只需要更新主程序jar 依赖jar单独分离。配置文件独立存放于文件夹内&#xff0c;更新程序并不会覆盖已有的配置信息。 一、配置外移 1、开发环境外移 做法&#xff1a;在项目同级或者上级创建config文件夹放置配置文件&#xff0c;具体m…

阿里云操作系统控制台——解决服务器磁盘I/O故障

目录 引言 需求介绍 操作系统使用实例 获得的帮助与提升 建议 引言 你的云服务器是否遇到过系统响应变慢、服务超时&#xff0c;或者进程卡顿、磁盘空间不足、系统日志频繁告警的问题&#xff1f;这些情况在日常运维中并不少见&#xff0c;尤其是在 高负载或资源紧张时&a…

【英伟达AI论文】多模态大型语言模型的高效长视频理解

摘要&#xff1a;近年来&#xff0c;基于视频的多模态大型语言模型&#xff08;Video-LLMs&#xff09;通过将视频处理为图像帧序列&#xff0c;显著提升了视频理解能力。然而&#xff0c;许多现有方法在视觉主干网络中独立处理各帧&#xff0c;缺乏显式的时序建模&#xff0c;…

蓝桥杯备考:图论初解

1&#xff1a;图的定义 我们学了线性表和树的结构&#xff0c;那什么是图呢&#xff1f; 线性表是一个串一个是一对一的结构 树是一对多的&#xff0c;每个结点可以有多个孩子&#xff0c;但只能有一个父亲 而我们今天学的图&#xff01;就是多对多的结构了 V表示的是图的顶点集…

记录小白使用 Cursor 开发第一个微信小程序(一):注册账号及下载工具(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;一&#xff09;&#xff1a;注册账号及下载工具&#xff08;250308&#xff09;一、微信小程序注册摘要1.1 注册流程要点 二、小程序发布流程三、下载工具 记录小白使用 Cursor 开发第一个微信小程序&#xff08…

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…