華能 + Alluxio | 數字化浪潮下跨地域數據聯邦訪問與分析

語言: CN / TW / HK

 

1. 數字化轉型與國產化進程推進

為了響應國家“十四五”數字經濟發展規劃的號召,中國企業推動創新資源共建共享,促進創新模式開放化演進,在信息化、數字化、智能化的強烈需求下,中國龍頭企業統籌全渠道的技術能力,逐漸形成了一套覆蓋集團業務發展、經營管理等核心發展戰略需要的戰略方向。

數字化轉型初見成效,數據能力不斷挖掘與創新;大數據技術推陳出新,國產化步伐日益加快。無論是互聯網企業還是傳統行業下的領導企業,有什麼數據,如何使用數據,如何更加智能地利用數據這些議題被不斷挖掘與迭代。

在東數西算的理念下,數據跨平台、跨機房、跨地域的技術問題與挑戰逐漸浮現出來。這篇文章我們主要從技術的角度,對跨地域的數據聯邦,或者説總公司和分公司不同數據域的互聯互通進行討論,研究相關技術可行性與分享整個研究過程。為了加快國產化軟硬件的推進,本次實踐採用國產化硬件ARM服務器(鯤鵬920)以及國產化操作系統統信進行相關的技術驗證。

2. 原型目標與設計

通過對跨地域數據聯邦的調研,我們發現中國很多企業面臨的業務挑戰雖然不同,但是技術難點是相似的,主要有:

挑戰一:總公司通過傳統的ETL作業採集分公司數據(比如通過Informatica、Kettle、DataX等),這些作業往往是按需定製,並且定期執行的;當有新的數據合規要求或者總公司數據分析要求時,都需要進行定製開發、測試、部署,這對數據彙總的時效性帶來了很大的負面影響。另外通過ETL作業採集的分公司數據,在遇到分公司數據更新時,非常容易造成總公司與分公司之間的數據不一致,導致分析結果有所紕漏。

挑戰二:子公司的自助式查詢,一方面是對總公司的數據申請,很多時候整個數據訪問鏈路是斷裂的,往往需要通過流程篩查、繁瑣的數據同步手段進行(比如通過FTP傳輸,甚至是物理介質的長途運輸)。考慮到數據安全以及國家審計合規的要求,總公司數據是否可以在子公司持久化存儲、數據訪問脱敏、權限管控等等也都是當前中國企業面臨的具體技術挑戰。

因此我們本次的研究主要會關注在數據流的雙向流動方面。

2.1 研究原型技術選型

當前大數據技術已經成為企業內部典型的數據分析手段,因此在原型實現的過程中,我們主要使用開源的大數據技術,從存儲、計算(分析)、編排3個維度進行選型。其中每個維度我們選擇時下最主流的組件,以確保該原型的通用性。

數據存儲:

√ HDFS:Hadoop分佈式文件系統(Distributed File System)

數據分析(以SQL分析為主):

√ Hive:構建於Hadoop之上的數據倉庫,通過一種類SQL語言HiveQL為用户提供數據的歸納、查詢和分析等功能。

數據編排:

√ lluxio:Alluxio是一個開源的虛擬分佈式文件系統( Virtual Distributed File System, VDFS),位於大數據棧中的計算和存儲之間。它為計算框架提供了數據抽象層,使得應用能夠通過一個共同的接口連接底層不同的存儲系統。

環境模擬:總公司/分公司-1/分公司-2

√ 每個公司有自建的HDFS集羣;

√ 每個公司有自建的Alluxio集羣:用於實現與本公司HDFS集羣和其他公司HDFS集羣的數據聯邦;

√ 每個公司有自建的Hive集羣。

 

備註: CPU型號: 鯤鵬920 HDFS 3.1.1 Hive 3.1.0 Alluxio 2.8

2.2 數據流定義

使用HDFS、Hive、Alluxio定義數據持久化與數據訪問鏈路。在總公司和分公司構建統一的技術棧(技術標準),實現數據共享閉環: 1 在總公司數據域,實現分公司數據聯邦,允許總公司實現全域數據訪問與分析;

2 在分公司數據域,合規訪問總公司數據湖,並結合子公司私有數據進行自助化分析;

 

3. Alluxio在ARM環境下的基本測試

3.1 Alluxio基於ARM編譯

## 編譯 
mvn -T2C -DskipTests -Dmaven.javadoc.skip -Dlicense.skip - 
Dcheckstyle.skip -Dfindbugs.skip clean install

3.2 Alluxio基於ARM服務器的部署與基本測試

## 基本測試 
[root@node1 ~]# alluxio runTests

 

3.3 Alluxio分佈式高可用性驗證(自動切換+手動切換)

## 管理命令獲取元數據高可用信息
[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER
Journal domain  : MASTER
Quorum size     : 3
Quorum leader   : node1:19200

STATE       | PRIORITY | SERVER ADDRESS
AVAILABLE   | 0        | node1:19200
AVAILABLE   | 0        | node2:19200
AVAILABLE   | 0        | node3:19200

## 關閉主管理節點
[root@node1 ~]# alluxio-stop.sh master
Successfully Killed 1 process(es) successfully on node1

## 管理命令獲取元數據高可用信息,檢查管理節點自動切換狀態
[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER
Journal domain  : MASTER
Quorum size     : 3
Quorum leader   : node2:19200

STATE       | PRIORITY | SERVER ADDRESS
UNAVAILABLE | 0        | node1:19200
AVAILABLE   | 0        | node2:19200
AVAILABLE   | 0        | node3:19200
[root@node1 ~]#
## 管理命令獲取元數據高可用信息
[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER
Journal domain  : MASTER
Quorum size     : 3
Quorum leader   : node2:19200

STATE       | PRIORITY | SERVER ADDRESS
AVAILABLE   | 0        | node1:19200
AVAILABLE   | 0        | node2:19200
AVAILABLE   | 0        | node3:19200

## 手動切換主節點
[root@node1 ~]# alluxio fsadmin journal quorum elect -address node3:19200
Initiating transfer of leadership to node3:19200
Successfully elected node3:19200 as the new leader
Resetting priorities of masters after successful transfer of leadership
Quorum priorities were reset to 1

## 管理命令獲取元數據高可用信息,檢查管理節點切換狀態
[root@node1 ~]# alluxio fsadmin journal quorum info -domain MASTER

Journal domain  : MASTER
Quorum size     : 3
Quorum leader   : node3:19200

STATE       | PRIORITY | SERVER ADDRESS
AVAILABLE   | 1        | node1:19200
AVAILABLE   | 1        | node2:19200
AVAILABLE   | 1        | node3:19200
[root@node1 ~]#

3.4 Alluxio與HDFS集成

## HDFS數據查詢
[root@node1 alluxio]# hdfs dfs -ls /test/
Found 1 items
-rw-r--r--   1 root hdfsadmingroup      53136 2022-07-22 16:57 /test/pom.xml

## Alluxio數據掛載映射
[root@node1 alluxio]# alluxio fs mount /test/ hdfs://node1:9000/test
Mounted hdfs://node1:9000/test at /test

## Alluxio數據查詢
[root@node1 alluxio]# alluxio fs ls -R /test
-rw-r--r--  root           hdfsadmingroup           53136       PERSISTED 07-22-2022 16:57:23:651   0% /test/pom.xml
[root@node1 alluxio]#

3.5 Alluxio與Hive集成

## 創建Hive表
hive> create table test.test(id int) location 'alluxio://node1:19998/test/test';
OK
Time taken: 0.116 seconds
hive>

3.6 Alluxio基於ACL的權限控制

## 默認其他用户可以訪問,禁止其他用户可以訪問
[root@node1 ~]# alluxio fs setfacl -m user::--- /test
[root@node1 ~]# alluxio fs setfacl -m other::--- /test

## user1 用户訪問失敗
user1@node1 ~]$ alluxio fs ls /test
Permission denied: user=user1, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x—
[user1@node1 ~]$

## user1 用户授權,訪問成功
root@node1 ~]# alluxio fs setfacl -m user:user1:rwx /test
[user1@node1 ~]$ alluxio fs ls /test
-rw-r--r--  root           root                      1726       PERSISTED 07-25-2022 14:50:51:180 100% /test/run-presto.pl
[user1@node1 ~]$

## user2 用户未授權訪問失敗
[user2@node1 ~]$ alluxio fs ls /test
Permission denied: user=user2, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x---
[user2@node1 ~]$

## 取消授權user1,訪問失敗
root@node1 ~]# alluxio fs setfacl -b /test
[user1@node1 ~]$ alluxio fs ls /test
Permission denied: user=user1, access=r--, path=/test: failed at test, inode owner=root, inode group=root, inode mode=---r-x---
[user1@node1 ~]$

## 查看目錄權限
[root@node1 ~]# alluxio fs getfacl /test
# file: /test
# owner: root
# group: root
user::---
group::r-x
other::---
mask::rwx
[root@node1 ~]#

4. 數據域聯邦場景研究

4.1 分公司數據彙總與總公司集中式分析

數據流驗證:在總公司數據域,實現分公司數據聯邦,允許總公司實現全域數據訪問與分析:

√ 構建總公司分公司模擬環境;

√ 總公司基於Alluxio創建數據表T3,建立分區x, y, z;

√ 分公司-1將HDFS目錄X映射到總公司Alluxio分區x,準備模擬數據;

√ 分公司-2將HDFS目錄Y映射到總公司Alluxio分區y,準備模擬數據;

√ 總公司使用Hive讀取T3數據,驗證:訪問分公司-1與分公司-2的所有數據正常;

√ 分公司-2將目錄Y的數據進行更新;

√ 通知總公司數據表T3 y分區數據變更(元數據失效);

√ 總公司使用Hive讀取T3數據,驗證:訪問分公司-1與分公司-2(更新後)的所有數據正常。

## 總公司創建t3 表
hive> create external table group_company.t3(value string)
    > partitioned by (part string)
    > location 'alluxio://node1:19998/group_company/t3';
OK
Time taken: 0.069 seconds
hive>

## 分公司1 分區x掛載到總公司 alluxio
[root@node1 ~]# hdfs dfs -put part\=x/ hdfs://node3:9000/regional_company_1/t3
[root@node1 ~]# hdfs dfs -put part\=y/ hdfs://node5:9000/regional_company_2/t3
[root@node1 ~]#

[root@node1 ~]# alluxio fs mount \
> /group_company/t3/part=x \
> hdfs://node3:9000/regional_company_1/t3/part=x
Mounted hdfs://node3:9000/regional_company_1/t3/part=x at /group_company/t3/part=x
[root@node1 ~]#

## 查詢數據
hive> MSCK REPAIR TABLE group_company.t3;
OK
Partitions not in metastore:    t3:part=x
Repair: Added partition to metastore t3:part=x
Time taken: 0.169 seconds, Fetched: 2 row(s)
hive> select * from  group_company.t3;
OK
1abc    x
Time taken: 0.108 seconds, Fetched: 1 row(s)
hive>

## 分公司2 分區y掛載到總公司 alluxio
[root@node1 ~]# alluxio fs mount \
> /group_company/t3/part=y \
> hdfs://node5:9000/regional_company_2/t3/part=y
Mounted hdfs://node5:9000/regional_company_2/t3/part=y at /group_company/t3/part=y
[root@node1 ~]#

## 查詢數據
hive> MSCK REPAIR TABLE group_company.t3;
OK
Partitions not in metastore:    t3:part=y
Repair: Added partition to metastore t3:part=y
Time taken: 0.153 seconds, Fetched: 2 row(s)
hive> select * from  group_company.t3;
OK
1abc    x
2def    y
Time taken: 0.137 seconds, Fetched: 2 row(s)
hive>

## 更新分區y 數據
[root@node1 ~]# hdfs dfs -cat hdfs://node5:9000/regional_company_2/t3/part=y/000000_0
2def
[root@node1 ~]# hdfs dfs -get hdfs://node5:9000/regional_company_2/t3/part=y/000000_0
[root@node1 ~]# echo '1111' > 000000_0
[root@node1 ~]# hdfs dfs -rm hdfs://node5:9000/regional_company_2/t3/part=y/000000_0
Deleted hdfs://node5:9000/regional_company_2/t3/part=y/000000_0
[root@node1 ~]# hdfs dfs -put 000000_0 hdfs://node5:9000/regional_company_2/t3/part=y/
[root@node1 ~]# hdfs dfs -cat hdfs://node5:9000/regional_company_2/t3/part=y/000000_0
1111
[root@node1 ~]#

## 更新查詢數據
hive> select * from  group_company.t3;
OK
1abc    x
2def    y
Time taken: 0.112 seconds, Fetched: 2 row(s)
hive>

## 通知總公司更新數據
[root@node1 ~]# alluxio fs loadMetadata -F /group_company/t3
[root@node1 ~]#

## 總更新數據後查詢
hive> select * from  group_company.t3;
OK
1abc    x
1111    y
Time taken: 0.1 seconds, Fetched: 2 row(s)
hive>

 

4.2 總公司數據分發與分公司自助分析

數據流驗證:在分公司數據域,合規訪問總公司數據湖,並結合私有數據進行自助化分析:

√ 構建總公司分公司模擬環境;

√ 總公司基於HDFS創建數據表T1,建立分區a, b, c;

√ 分公司-1基於Alluxio使用數據表T1元數據創建相應表格T1’;

√ 總公司掛載分區a到分公司-1的Alluxio相關目錄;

√ 分公司-1的Hive, 訪問T1’,驗證:訪問分區a的數據正常;

√ 總公司掛載分區c到分公司-1的Alluxio相關目錄;

√ 通過分公司-1的Hive, 訪問T1’,驗證:訪問分區a/c的數據正常;

√ 總公司將掛載的分區c從分公司1撤回;

√ 通過分公司-1的Hive, 訪問T1’,驗證:僅能正常訪問分區a的數據;

√ 分公司創建數據表T2,完成數據表之間的join類型SQL,驗證:總公司數據與分公司自有數據聯邦訪問正常。

## 總公司創建 t1 表 三個分區 a b c
hive> create database group_company location '/user/hive/group_company.db';
OK
Time taken: 0.017 seconds
hive> create external table group_company.t1(value string) partitioned by (part string);
OK
Time taken: 0.144 seconds

hive> insert into table group_company.t1 partition(part='a') values('1abc');
hive> insert into table group_company.t1 partition(part='b') values('2def');
hive> insert into table group_company.t1 partition(part='c') values('3ghi');

hive> select * from group_company.t1;
OK
1abc    a
2def    b
3ghi    c
Time taken: 0.142 seconds, Fetched: 3 row(s)

## 分公司1 掛載總表分區 a
[root@node3 alluxio]# bin/alluxio fs mkdir /regional_company_1/t1/
Successfully created directory /regional_company_1/t1
[root@node3 alluxio]#

[root@node3 alluxio]# bin/alluxio fs mount \
> /regional_company_1/t1/part=a \
> hdfs://node1:9000/user/hive/group_company.db/t1/part=a
Mounted hdfs://node1:9000/user/hive/group_company.db/t1/part=a at /regional_company_1/t1/part=a
[root@node3 alluxio]#

## 創建表查詢數據
hive> create external table t1(value string)
    > partitioned by (part string)
    > location 'alluxio://node3:19998/regional_company_1/t1';
OK
Time taken: 0.972 seconds
hive> select * from t1;
OK
Time taken: 1.282 seconds
hive> MSCK REPAIR TABLE t1;
OK
Partitions not in metastore:    t1:part=a
Repair: Added partition to metastore t1:part=a
Time taken: 0.235 seconds, Fetched: 2 row(s)
hive> select * from t1;
OK
1abc    a
Time taken: 0.137 seconds, Fetched: 1 row(s)
hive>

## 分公司1 掛載總表分區 c
[root@node3 alluxio]# bin/alluxio fs mount \
> /regional_company_1/t1/part=c \
> hdfs://node1:9000/user/hive/group_company.db/t1/part=c
Mounted hdfs://node1:9000/user/hive/group_company.db/t1/part=c at /regional_company_1/t1/part=c
[root@node3 alluxio]#

## 查詢數據
hive> MSCK REPAIR TABLE t1;
OK
Partitions not in metastore:    t1:part=c
Repair: Added partition to metastore t1:part=c
Time taken: 0.244 seconds, Fetched: 2 row(s)
hive> select * from t1;
OK
1abc    a
3ghi    c
Time taken: 0.145 seconds, Fetched: 2 row(s)
hive>

## 撤回
[root@node3 alluxio]# bin/alluxio fs unmount /regional_company_1/t1/part=c
Unmounted /regional_company_1/t1/part=c
[root@node3 alluxio]#

hive> select * from t1;
OK
1abc    a
Time taken: 2.281 seconds, Fetched: 1 row(s)
hive>

## join t2 表
hive> select * from t2;
OK
5678    a
1234    d
Time taken: 0.082 seconds, Fetched: 2 row(s)
hive>

hive> select * from (
    > select * from t1
    > ) t1
    > join (
    > select * from t2
    > ) t2
    > on t1.part = t2.part;
Query ID = root_20220720135305_c5730dc3-a46a-478a-a368-2e0343385700
Total jobs = 1
Hadoop job information for Stage-3: number of mappers: 1; number of reducers: 0
2022-07-20 13:53:26,621 Stage-3 map = 0%,  reduce = 0%
2022-07-20 13:53:31,775 Stage-3 map = 100%,  reduce = 0%, Cumulative CPU 2.42 sec
MapReduce Total cumulative CPU time: 2 seconds 420 msec
Ended Job = job_1658118353477_0009
MapReduce Jobs Launched:
Stage-Stage-3: Map: 1   Cumulative CPU: 2.42 sec   HDFS Read: 8876 HDFS Write: 113 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 420 msec
OK
1abc    a       5678    a
Time taken: 27.333 seconds, Fetched: 1 row(s)
hive>

5. 總結

通過本次研究發現:

1 我們在國產化軟硬件環境中(ARM+統信)對當前主流組件完成了適配和基本驗證,Hive+Alluxio+HDFS的技術棧可以在國產化環境下正常運行;

2 通過Alluxio數據編排實現跨地域的數據聯邦,實現總公司與分公司之間不同物理數據域的互聯互通,提供企業內部完整的數據鏈路;

3 通過Alluxio自身的ACL控制,以及Alluxio與底層UFS(本次驗證是HDFS)的掛載設定進行數據邏輯映射的控制;

 

在技術可行性方面的驗證,也為我們日後的原型優化提供了更多的思路:

1 考慮新的數據合規要求,設定Alluxio中數據的TTL控制數據訪問生命週期;

2 數據更新的機制,無論是利用UFS自身的變更通知還是外圍的消息機制,更好地保障企業內部跨數據域的數據訪問一致性;

3 更加細粒度的數據訪問控制,通過更多的數據語義理解,提高對數據管理的靈活度;

 

想要獲取更多有趣有料的【活動信息】【技術文章】【大咖觀點】,請關注[Alluxio智庫]