關于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.pswp.cn/diannao/72850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72850.shtml
英文地址,請注明出處:http://en.pswp.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;可以采用大根堆快速達到…