kudu使用雜記分享

2021-12-30 09:04:35 字數 3090 閱讀 6788

kudu 提供了 table 的概念。使用者可以建立多個 table,每個 table 都有乙個預先定義好的 schema。schema 裡面定義了這個 table 多個 column,每個 column 都有名字,型別,是否允許 null 等。一些 columns 組成了 primary key。分割槽kudu 支援對資料按照 range 以及 hash 的方式進行分割槽。 每個大的 table 都可以通過這種方式將資料分不到不同的 tablet 上面。三種fulsh mode

auto_flush_sync 預設,自動flush,同步方法,呼叫 kudusession.apply() 時立即寫入,在寫入完成後才會返回乙個 operationresponse 物件,也只有模式下才會返回該物件,其他的都是返回 null,呼叫kudusession.flush() 不會有任何操作。 auto_flush_background 自動後台寫入,在apply後會立即返回null,但是寫入會在後再自動執行,可能會多條操作用同乙個session批量寫入,如果快取條數滿了,則會阻塞一會,直至緩衝區有可用的空間在返回。因為可能多條併發寫入,所以寫入順序可能是無序的,(猜測當一條資料先插再刪、變成先刪再插可能就有問題,並沒有測試過)。因為後台寫入,多以error資訊會儲存在 session-local buffer 中,通過 kudusession.countpendingerrors() 訪問等待的error數量,kudu.getpendingerrors() 得到error的操作進行重試。呼叫kudusession.fulsh()時會阻塞,直至緩衝區為空。 manual_flush 手動flush,在此狀態下呼叫 apply() 會立即返回null,只有使用者呼叫 kudusession.fulsh() 的時候才會傳送寫入操作。如果超過了緩衝區配置的大小,在 apply() 的時候會返回乙個error。

kudusession.setflushmode(sessionconfiguration.flushmode.manual_flush);

kudu 原生對impala 做了很好的相容,用impala可以很方便的使用sql對kudu進行操作,我們在專案中是使用了 impala 和原生 kuduclient 相結合的方式進行。impala 和 kuduclient 的選擇

就查詢來說,在我的使用過程中 impala 的查詢速度要快於 kuduclient 的 scan。建議使用impala insert 的速度都很快 upsert/update/delete 如果用主鍵的話也都很快,但impala的併發效能比較差,所以這種操作盡量用 kuduclient 的原生 api 進行操作 原生 api update、delete、upsert 只能根據主鍵操作,如果需要其他條件則需要查詢一下,拿到主鍵再進行操作,所以不如impala寫sql方便,看具體情況吧,只要 impala 吼得住併發,或做好資源隔離。 原生 api 在操作上有些不方便,我們自己封裝了乙個簡單的 spring starter ,還在完善,當然也可以把核心**拿出來自己封裝。鏈結:impala用sql操作 set version = version + 1 ,version 必須是 bigint,因為 version(int)+1 結果是bigint json中的 」 會被轉義為 \」 而當作為sql存入的時候 \」 又會被反譯 為 」 所以,再取出來就不是規範的json格式了。。不過這個問題是所有拼接 sql 提交查詢的共性問題//所以把其中的 \ 替換為 \\ , " 替換為 \"

str = str.replaceall("\\\\","\\\\\\\\").replaceall("\"","\\\\\"");

// ps : replaceall 的引數是正則,所以 \\\\ = 正則 \\ = 真正的 \kudu 支援最大300列,每個欄位不超過64k(包括string型別和二進位制型別)。一般每列不建議超過1k,每行不建議超過100k。impala 大小寫不敏感,kudu 大小寫敏感,impala建表時的大小寫除了表名其他的所有欄位都會變成小寫進入kudu

impala 會儲存 kudu 的 schema,所以使用impala查詢全程大小寫混搭無所謂的,但用 kudu 原生api,要注意,表名區分大小寫,列名全程小寫。

impala 建乙個資料庫 wx ,建乙個表 test,在kudu中沒有 資料庫的概念,impala會把它宣告為, impala::db.tablename -> impala::wx.test

使用原生kudu api upsert 時,除了傳入主鍵的幾個欄位外,not null的字段也必須傳入,否則更新不了,如果用 impala 寫sql 就會報錯的,但用原生 api 正常返回 operationresponse 裡面有錯誤資訊,如果不主動檢查是發現不了更新失敗的。 用原生 api 進行刪除操作,只能set 主鍵作為條件,其他的字段都不能設定,會失敗,在 operationresponse 可以看到錯誤資訊。但如果用 impala 的話,where 條件就無所謂了,更正常 sql 一樣, impala 會處理的impala 檔案操作符數量(ulimit) 32,768 -> 50000 觀察中 kudukudu tablet server block cache capacity

block_cache_capacity_mb 512m -> 1g

kudu tablet server hard memory limit

memory_limit_hard_bytes 預設 4g -> 30 g 這個引數盡量大,機器 80% 左右額,正常不用這麼複雜,只是我們用的 cloudera 公司的版本所以需要引,cloudera 公司的私有庫

1.1.0-cdh5.10.0

2.6.0-cdh5.10.0

cdh.repo

cloudera repositories

false

cdh.snapshots.repo

cloudera snapshots repository

true

false

org.apache.hive

hive-jdbc

$org.eclipse.jetty.aggregate

jetty-all

org.apache.hive

hive-shims

org.apache.hadoop

hadoop-common

$

hook筆記分享

見多了前端各種js的混淆,引數的加密,雖然抓包會拿到最後的結果,但是一步步分析是真的折磨人,像一些噁心的sojson混淆,可能會讓人看著各種引數而頭皮發麻。這裡分享一些常用的hook js的方法,與反爬一起進步!hook window物件的 pt 屬性的設定與取值 function set func...

Django 筆記分享

django是乙個基於mvc構造的框架。但是在django中,控制器接受使用者輸入的部分由框架自行處理,所以 django 裡更關注的是模型 model 模板 template 和檢視 views 稱為 mtv模式。它們各自的職責如下 層次職責 模型 model 即資料訪問層 處理與資料相關的所有事...

PCIe學習筆記分享

本總結隨著dm8168中pcie的學習,以及pcie原理的學習而新增,都是一些零碎的知識點,有部分個人理解,將來溫故知新用。欠奉。pcie裝置需要使用refclk refclk作為本地參考時鐘,其時鐘頻率固定為100mhz,在dm8168系統中,需要提供兩個100mhz時鐘,乙個給dm8168用於檢...