Apache Accumulo 簡介
一、簡介
人類每天都會產生大量敏感數據,組織需要管理從個人資訊和財務記錄到機密文件和網路安全日誌的所有內容。統計數據顯示,傳統資料庫常常難以應付大數據量和現代企業複雜的安全要求。
由於安全資料管理在現代世界中的作用變得更具策略性,並且大多數組織需要細粒度的存取控製到單元級別,因此我們需要一個能夠處理大量資料集的資料庫系統,同時維護嚴格的安全協議- 在PB 級資料規模,包含數十億個個人存取決策。
在這篇介紹文章中,我們將探討Apache Accumulo ,這是一個功能強大的分散式鍵值存儲,具有無與倫比的單元級安全性、高效能和可擴展性。
2. 什麼是 Apache Accumulo?
Apache Accumulo 最初由美國國家安全局(NSA)基於Google 的 Bigtable設計開發,是一個分散式鍵值儲存。
它建構在 Apache Hadoop 和 Apache ZooKeeper 之上,旨在處理跨商用硬體叢集的海量資料。
Accumulo 可實現高效的資料攝取、檢索和儲存。它還提供伺服器端編程,允許直接在資料庫內進行複雜的資料處理,使其成為具有細粒度存取控制的複雜解決方案,可處理敏感的大數據。
Apache Accumulo 的主要功能如下:
- 可擴展性:可跨大型叢集管理 PB 級數據
- 高效能:使用記憶體處理和優化來實現高效的資料訪問
- 單元級安全性:允許細粒度的存取控制,其中每個單元都可以有唯一的可見性標籤
- 豐富的客製化 API :提供用於資料庫內處理的迭代器等功能
與用於網頁索引、Google Earth 和 Google Finance 的 Google Bigtable類似,Apache Accumulo 可用於多種應用程序,但不限於:
- 政府和軍事數據系統
- 醫療記錄管理
- 金融服務數據
- 網路安全分析
- 大規模圖形處理
3. 安裝與設定
首先,我們確保安裝了 Java 11、Apache Hadoop、YARN 和 Apache ZooKeeper 等先決條件,並在路徑中設定了相應的JAVA_HOME
、 HADOOP_HOME
和ZOOKEEPER_HOME
。
然後,我們將下載最新版本的 Apache Accumulo 並將其解壓縮:
$ tar -xzf accumulo-2.1.3-bin.tar.gz
同樣,我們可以將ACCUMULO_HOME
加入到路徑變數中:
$ export ACCUMULO_HOME=/path/to/accumulo
$ export PATH=$ACCUMULO_HOME/bin:$PATH
接下來,我們按順序啟動 ZooKeeper、Hadoop HDFS 和 YARN 等服務:
$ zkServer start
$ start-dfs.sh
$ start-yarn.sh
另外,我們需要確保 HDFS 在localhost:8020
上啟動,並且 ZooKeeper 主機設定為localhost:2181
,因為這些是在accumulo.properties
中設定的預設屬性。
讓我們使用jps
命令確認一切運作正常,該命令應顯示以下輸出:
82306 Main
81385 DataNode
81745 ResourceManager
82867 Jps
81846 NodeManager
81530 SecondaryNameNode
68474 ResourceManager
81276 NameNode
現在,我們準備好設定 Accumulo 以將資料儲存在 ZooKeeper 和 HDFS 中:
$ accumulo init
init
指令只需要一次,並提示輸入實例name
和 root password
。
然後,我們將建立啟動叢集所需的其他設定檔:
$ accumulo-cluster create-config
最後,我們準備啟動叢集:
$ accumulo-cluster start
啟動後,我們可以運行Accumulo shell – 一個用於與 Apache Accumulo 互動的命令列工具:
$ accumulo shell -u root
注意:此指令要求在accumulo-client.properties
中設定實例名稱和密碼。
Accumulo Shell 提供了用於管理、查詢表和實例以及執行管理任務的基本命令。
讓我們來看看一些最方便的指令:
-
**tables**
:列出實例中的所有表 -
**createtable <table>**
:建立一個新表 -
**deletetable <table>**
:刪除表 -
**scan**
:掃描並顯示目前表中的數據 -
**insert <row> <colfam> <colqual> <value>**
:向表中插入一個值 -
**delete <row> <colfam> <colqual>**
:從表中刪除特定條目 -
**setiter -t <table>**
:設定特定於表格的迭代器 -
**listiter [-scan | -table]**
:列出掃描器或表格的迭代器 -
**createuser <username>**
:建立一個新用戶 -
**info**
:顯示有關 Accumulo 實例的系統訊息 -
**config**
:檢視或變更配置設定 -
**flush <table>**
:強制將表的記憶體刷新到磁碟 -
**compact <table>**
:壓縮表的數據
4. 資料模型
Accumulo資料模型類似Google的Bigtable,提供稀疏、分散式、持久的多維排序映射。
具體來說,Accumulo 實例的鍵由三個元件組成(有助於它對於儲存的每個值都是唯一的):
- Row ID :一行資料的主標識符,用於資料的字典排序
- 柱子:
- 系列:列被分組為系列,充當資料的類別或命名空間。列族提供了一種組織相關資料的方法。
- 限定符:在每個列族中,各個列由列限定符標識。這允許對列族內的資料進行細粒度區分。
- 可見性:每個鍵值對都可以與安全標籤或可見性相關聯。這允許單元級存取控制,其中使用者必須具有適當的授權才能讀取資料。
- TimeStamp :與每個鍵值對關聯的版本號,允許 Accumulo 儲存相同資料的多個版本
總體而言,Accumulo 資料模型提供了一個靈活且安全的框架,用於管理具有複雜安全需求的大規模結構化資料集。
它使用行 ID、列族和限定符來實現穩健的資料組織和查詢,而單元格級可見性控制則確保敏感資訊的保護。
五、操作及特點
5.1.基本表操作
Accumulo 提供強大的表格管理功能。我們可以根據需要建立新表,克隆現有表以用於測試或開發目的,並將大表拆分為較小的平板電腦以優化效能。
此外,還可以合併表格以整合資料並提高查詢效率。 Accumulo還支援靈活的資料匯入和匯出操作,實現資料的無縫遷移以及與其他系統的整合。
5.2.資料處理
Accumulo 提供基本的資料操作來建立、更新和刪除資料。為了高效處理大型資料集,Accumulo 提供批次操作,允許批量處理資料。
此外,基於範圍的掃描可以有效地檢索特定資料子集,從而優化查詢效能。
5.3.安全特性
Accumulo 透過為每個資料設定安全標籤來提供單元級安全性。我們可以使用布林表達式設定複雜的安全規則並管理使用者存取以實施細粒度的授權策略。
5.4.迭代器框架
Accumulo 提供了強大的迭代器,可作為現場資料處理器,直接在資料所在的位置工作。它們在伺服器本身上處理資料的過濾、聚合和轉換,因此我們不需要透過網路發送大量原始資料。
這會導致更快的查詢處理、更高的效率並減少網路流量。
5.5.效能最佳化
Accumulo 結合了各種效能最佳化,例如預寫日誌記錄、基於記憶體的寫入、布隆過濾器和局部性群組,以確保高效的資料儲存和檢索。
預寫日誌記錄保證了資料的持久性,而基於記憶體的寫入則加速了資料的攝取。布隆過濾器可快速查找,減少全表掃描的需求。位置組優化資料放置,提高讀寫效能。
5.6.縮放和分佈
當添加更多資料時,Accumulo 會自動拆分平板電腦並平衡負載,並且將新機器整合到叢集中就像將它們指向它一樣簡單。隨著資料的擴展,系統可以平滑地管理資料分佈。
5.7.即時洞察
Accumulo 可讓我們監控效能指標、追蹤資源使用情況並偵測出現的問題,從而提供即時見解。
憑藉其高效的數據處理能力以及與監控工具的集成,我們可以快速響應變化並確保最佳的系統性能。
5.8.行政
Accumulo 提供強大的管理功能,包括可靠的備份和復原機制、智慧資料壓縮策略以及靈活的系統配置選項。
它還提供全面的用戶管理和資源控制等優勢,確保安全存取和最佳效能。
6. 累積客戶
現在我們已經介紹了 Accumulo 的安裝流程、資料模型、操作和功能,讓我們探索 Accumulo 用戶端透過 Java API 與 Accumulo 進行互動。
Accumulo 用戶端 API 允許我們以程式設計方式執行管理任務、查詢資料和管理表。
6.1. Maven依賴
首先,讓我們將最新的accumulo-core
Maven依賴項加入我們的pom.xml
:
<dependency>
<groupId>org.apache.accumulo</groupId>
<artifactId>accumulo-core</artifactId>
<version>2.1.3</version>
</dependency>
此依賴項新增了使用 Accumulo 所需的類別和方法。
6.2.建立 Accumulo 用戶端
接下來,讓我們建立一個與 Accumulo 互動的客戶端:
AccumuloClient client = Accumulo.newClient()
.to("accumuloInstanceName", "localhost:2181")
.as("username", "password").build();
我們使用建構器方法透過指定 Accumulo 的實例名稱、ZooKeeper 主機詳細資料、Accumulo 實例的使用者名稱和密碼來初始化連線。
6.3.基本操作
接下來,設定好客戶端後,讓我們執行建立表的基本操作:
client.tableOperations().create(tableName);
然後,要將資料新增至表中,我們可以使用BatchWriter
類,它提供高效能、面向批次的寫入:
try (BatchWriter writer = client.createBatchWriter(tableName, new BatchWriterConfig())) {
Mutation mutation1 = new Mutation("row1");
mutation1.at()
.family("column family 1")
.qualifier("column family 1 qualifier 1")
.visibility("public").put("value 1");
Mutation mutation2 = new Mutation("row2");
mutation2.at()
.family("column family 1")
.qualifier("column family 1 qualifier 2")
.visibility("private").put("value 2");
writer.addMutation(mutation1);
writer.addMutation(mutation2);
}
在這裡,每個條目都由Mutation
物件表示,該物件接受列訊息,例如family
、 qualifier
和visibility
,如前面在資料模型中討論的那樣。
同樣,讓我們使用Scanner
類別從表中檢索資料:
try (var scanner = client.createScanner(tableName, new Authorizations("public"))) {
scanner.setRange(new Range());
for (Map.Entry<Key, Value> entry : scanner) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
在這裡,我們迭代掃描整個表格的指定範圍內的行,並套用授權等篩選器,確保只取得公開可見的資料。
七、結論
在本教程中,我們討論了 Apache Accumulo,這是一個多功能、可擴展的資料庫,擅長處理具有複雜存取要求的海量資料集。
其獨特的功能(例如單元級安全性、迭代器和靈活的資料模型)使其成為需要安全高效的資料管理以進行即時分析、安全資料處理或大規模資料儲存的應用程式的絕佳選擇。
首先,我們探討了安裝和設定的步驟。然後,我們用其獨特的數據模型進行了自我教育。最後,我們熟悉了可用的操作和功能。
本文的完整程式碼可在 GitHub 上取得。