关于OceanBase与CDH适配的经验分享

news2025/4/25 12:50:35
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 cdh
     CHARSET='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 cmdb
 DEFAULT 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.coloradmin.cn/o/2310979.html

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

相关文章

基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践

近年来&#xff0c;随着国产AI芯片的日益崛起&#xff0c;基于国产AI芯片的模型适配、性能优化以及应用落地是国产AI应用的一道重要关卡。如何在复杂的京东零售业务场景下更好地使用国产AI芯片&#xff0c;并保障算力安全&#xff0c;是目前亟需解决的问题。对此&#xff0c;京…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

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从入门到使用

安装和配置 修改文件配置&#xff1a;修改文件名将&#xff08;sqoop-env-template.sh改为sqoop-env.sh&#xff09; 编辑sqoop-env.sh内部文本&#xff0c;修改调用文件位置 将sqoop-env.sh&#xff0c;配置到全局变量中&#xff0c;方便调用。 查看正常运用 第一类&#xff1…

【数据结构】堆(挑战从零基础到进阶)

我们从概念开始一步步来学习堆&#xff0c;下面我们来从零基础来解剖该种数据结构。先提前透明&#xff1a;实现堆其实就是基于数组来实现一个完全二叉树而已 &#xff01; 目录 堆的概念 堆的性质 堆的物理逻辑&思维逻辑 堆的节点对应关系 堆的核心操作 &#xff08…

阿里 DataWorks:数据治理、安全中心、数据质量核心功能梳理

文章目录 阿里 DataWorks&#xff1a;云原生数据治理与安全一体化实践指南一、数据治理中心1.1 数据治理体系1.2 产品架构全图1.3 概要使用路径1.4 治理现状评估数据治理健康分评估模型 1.5 检查项 & 治理项(1) 检查项(2) 治理项 1.6 治理工具箱1.7 治理结果查看 二、安全中…

DeepSeek精品课分享 清北

AI淘金潮上热搜&#xff01;有人已经靠DeepSeek日入过万了&#xff01; 北大清华等高校也相继出品DeepSeek高质量精品课程&#xff0c;在网上传疯。帮助学者高效学习AI从入门到精通&#xff01; 完整版资料已经帮大家整理好了&#xff0c;免费领&#xff01; 资料链接: htt…

解锁健康密码,开启养生之旅

在这个生活节奏飞快、压力如影随形的时代&#xff0c;健康养生不再是一句空泛的口号&#xff0c;而是我们对高品质生活的热切追求。它就像一把神奇的钥匙&#xff0c;能够打开通往活力与幸福的大门。 日常习惯与养生息息相关。晨起后&#xff0c;空腹喝一杯温水&#xff0c;如…

Mybatis集合嵌套查询,三级嵌套

三个表&#xff1a;房间 玩家 玩家信息 知识点&#xff1a;Mybatis中级联有关联&#xff08;association&#xff09;、集合&#xff08;collection&#xff09;、鉴别器&#xff08;discriminator&#xff09;三种。其中&#xff0c;association对应一对一关系、collectio…

Python的Pandas和matplotlib库:让数据可视化贼简单

在数据爆炸的时代&#xff0c;数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言&#xff0c;拥有众多用于数据可视化的库&#xff0c;而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据&#xff0c;还具备强大的数据可视化功能&#xff0c;让我们轻…

数据结构基础之《(19)—矩阵处理》

一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序&#xff1a;1,2,7,13,8,3,4,9,14... 核心技巧&#xff1a;找到coding上的宏观调度 左上角有A、B两个点&#xff0c;A往右一步一步走&#xff0c;B往下一步一步走 写一个…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

nuxt2 打包优化使用“compression-webpack-plugin”插件

在使用 Nuxt.js 构建项目时&#xff0c;为了提高性能&#xff0c;通常会考虑对静态资源进行压缩。compression-webpack-plugin 是一个常用的 Webpack 插件&#xff0c;用于在生产环境中对文件进行 Gzip 压缩。这对于减少网络传输时间和提高页面加载速度非常有帮助。下面是如何在…

ArcGIS Pro:轻松制作地震动画,洞察灾害动态

在当今的信息展示领域&#xff0c;动画因其直观、生动的特点&#xff0c;逐渐成为各类汇报、研究展示中的重要元素。 尤其是在地理信息领域&#xff0c;通过动画来展示动态的地理现象&#xff0c;能够让观众更清晰地理解数据背后所蕴含的信息。 地震作为一种突发性的自然灾害…

MAVEN手动配置(阿里云)全教程

介于网上各种各样的MAVEN配置过程中方法大致相同却细节参差不齐&#xff0c;我总结了我遇见的一些问题&#xff0c;来完全的解决MAVEN手动配置的全过程&#xff0c;以及分享解决小毛病的经验。 所需材料&#xff1a; MAVEN3.9.9&#xff08;下载适合自己的版本即可&#xff09…

贪心算法一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

计算机毕业设计Python+DeepSeek-R1大模型微博的话题博文及用户画像分析系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Secret Cow Code S

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 既然选择了远方,当不负青春,砥砺前行! 题目描述 奶牛们正在实验秘密代码,并设计了一种方法用于生成无限长度的字符…

MyBatis - XML CRUD 其他查询

1. XML 配置文件 使用 MyBatis 操作数据库的方式有两种: 注解 (在注解中定义 SQL 语句)XML 配置文件 (在 XML 文件中定义 SQL 语句) 在上一篇博客中, 已经讲解了如何使用注解操作数据库, 本篇文章来讲解如何使用 XML 进行 MyBatis 开发. 使用 XML 的步骤, 和使用注解的步骤…

牛客python蓝桥杯11-32(自用)

11 import os import sysdef huiwen(str):length len(str)# if length 0:# return -1result []for i in range(length-1): # 0 - length-2for j in range(i2,length1):# 取出从索引 i 到 j-1 的子串s str[i:j]# 正序倒序if s s[::-1]:result.append(len(s))if result…