使用 AWS Cloudformation 在 Amazon EMR 中一分鐘配置 JuiceFS

語言: CN / TW / HK

這是一篇使用 JuiceFS 作為 Amazon EMR 儲存後端的快速入門文章,JuiceFS 是一個專門為在雲端工作而設計的 POSIX 相容的共享檔案系統並且相容 HDFS。JuiceFS 與自建的 HDFS 相比,可以節省 50% ~ 70% 的成本,同時達到與自建 HDFS接近的效能。

為什麼在 Amazon EMR 中使用 JuiceFS?

在 Hadoop 叢集中使用 HDFS 是儲存計算耦合架構,叢集中的每個節點都同時承擔計算和儲存的職責。在實際業務場景中,資料量的增長通常遠遠快於計算需求的增長,但是在 Hadoop 儲存計算耦合的架構下,擴容必須要求儲存和計算同時擴容,自然會帶來計算資源利用率的低下。隨著儲存規模的增大,HDFS 的負載壓力越來越高,但又不支援橫向擴充套件,給運維帶來很高的複雜度,NameNode 重啟、Full GC 等問題會給整個叢集帶來數十分鐘到數小時的不可用,影響業務健康度。

如果將 Hadoop 儲存由 HDFS 換成 Amazon S3,在相容性、一致性、效能、許可權管理等方面要一一解決差異。相容性方面,使用者如果想用 EMR 沒有內建的計算引擎,可能要自己解決驅動適配的問題;效能方面的下降可能要擴大叢集規模;許可權管理方式的變化可能要重建整個 ACL 體系。

在 HDFS 和 Amazon S3 之間是否有一個兩全其美的方案呢?JuiceFS 正是這樣一個低成本彈性伸縮的全託管 HDFS 服務。可以為客戶帶來和 HDFS 一樣的相容性、一致性和接近的效能,和 Amazon S3 一樣的全託管、彈性伸縮、低成本。

什麼是 JuiceFS?

JuiceFS 是面向雲原生環境設計的分散式檔案系統,完全相容 POSIX 和 HDFS,適用於大資料、機器學習訓練、Kubernetes 共享儲存、海量資料歸檔管理場景。支援全球所有公有云服務商,並提供全託管服務,客戶無需投入任何運維力量,即刻擁有一個彈性伸縮,並可擴充套件至 100PB 容量的檔案系統。

在下面的這張架構圖中可以看出,JuiceFS 已經支援將各種公有云物件儲存作為後端資料持久服務,同時也支援了開源物件儲存,如 Ceph、MinIO、Swift 等。在 Linux 和 macOS 上提供 FUSE 客戶端,在 Windows 系統上也提供原生客戶端,都可以將 JuiceFS 的檔案系統掛載到系統中,使用體驗和本地盤一模一樣。在 Hadoop 環境中提供 Java SDK,使用體驗和 HDFS 一樣。JuiceFS 的元資料服務在所有公有云上都部署了全託管服務,客戶不用自己維護任何服務,學習和使用門檻極低。

效能測試

綜合 效能

TPC-DS 由事務效能管理委員會(TPC)釋出,該委員會是目前最知名的資料管理系統評測基準標準化組織。TPC-DS 採用星型、雪花型等多維資料模式。它包含 7 張事實表,17 張緯度表,平均每張表含有 18 列。其工作負載包含 99 個 SQL 查詢,覆蓋 SQL99 和 2003 的核心部分以及 OLAP。這個測試集包含對大資料集的統計、報表生成、聯機查詢、資料探勘等複雜應用,測試用的資料和值是有傾斜的,與真實資料一致。可以說 TPC-DS 是與真實場景非常接近的一個測試集,也是難度較大的一個測試集。

測試環境

ningxia (cn-northwest-1) region

1 Master m5.2xlarge 8 vCore, 32 GiB memory, 128 GB EBS storage

3 Core m5d.4xlarge 16 vCore, 64 GiB memory, 600 SSD GB storage

emr-6.1.0 Hive 3.1.2, Spark 3.0.0, Tez 0.9.2

Juicefs-hadoop-1.0-beta.jar

JuiceFS 專業試用版

使用 500GB TPC-DS 資料集 測試。

JuiceFS 引數

juicefs.cache-dir=/mnt*/jfs

juicefs.cache-size=10240M

juicefs.cache-full-block=false

Hive 測試的結果

由於完整的測試時間比較長,我們選取了部分測試集作為參考。每個測試指令碼均執行2次並取兩次的平均值作為測試結果。

Hive on Parquet 測試總時間開銷:

  • JuiceFS 685.34秒

  • HDFS 615.31秒

  • S3 1887.99秒

JuiceFS 比 S3 速度提升 175%,比 HDFS 慢 11%。

Hive on ORC 測試總時間開銷:

  • JuiceFS 789.58秒

  • HDFS 695.25秒

  • S3 1796.34秒

JuiceFS 比 S3 速度提升 127%,比 HDFS 慢 13%。

寫入效能

我們通過 Spark 來做資料寫入測試,寫入 143.2 GB 文字(未分割槽)格式的資料,具體的 SQL 語句如下:

CREATE TABLE catalog_sales2 AS SELECT * FROM catalog_sales;

Juicedata 與亞馬遜雲科技聯合開發的解決方案通過 AWS CloudFormation 模板可以在 Amazon EMR 中自動配置好可用的 JuiceFS 環境,並且提供一個 TPC-DS Benchmark 測試程式供使用。上述測試結果均使用該解決方案搭建環境。

如何利用 AWS CloudFormation 在 Amazon EMR 中快速使用 JuiceFS

Github 原始碼

https://github.com/aws-samples/amazon-emr-with-juicefs/

架構圖

注意

  • EMR 叢集需要連線到 JuiceFS 元資料服務。它需要一個 NAT 閘道器來訪問公共網際網路。

  • EMR 叢集的每個節點都需要安裝 JuiceFS Hadoop 擴充套件 JAR 包,才能使用 JuiceFS 作為儲存後端。

  • JuiceFS 只儲存元資料,原始資料仍然儲存在您的賬戶 S3 中。

部署指南

先決條件

  • 註冊 JuiceFS 賬戶

  • 在 JuiceFS 控制檯上建立一個卷。選擇你的 AWS 賬戶區域,並建立一個新卷。請在 “高階選項” 中將 “壓縮” 項改為 Uncompressed

注意: JuiceFS  檔案系統預設啟用  lz4  演算法對資料進行壓縮。在大資料分析場景中經常使用  ORC  或者  Parquet  等列存檔案格式,查詢過程中往往只需要讀取檔案中的一部分,如果啟用壓縮演算法,則必須讀取完整  block  解壓後才能獲得需要的部分,這樣會造成讀放大。關閉壓縮後,則可以直接讀取部分資料

  • 從 JuiceFS 控制檯獲取訪問令牌和桶名。

啟動 AWS CloudFormation Stack

  • 從 AWS 中國區域控制檯中啟動

  • 從 AWS 海外區域控制檯中啟動

  • 填寫配置項

引數說明

引數名 解釋
EMRClusterName EMR 叢集名稱
MasterInstanceType 主節點例項型別
CoreInstanceType 核心節點型別
NumberOfCoreInstances 核心節點數量
JuiceFSAccessToken JuiceFS 訪問令牌
JuiceFSVolumeName JuiceFS 儲存卷 Volume 名稱
JuiceFSCacheDir 本地快取目錄,可以指定多個資料夾,用冒號 : 分隔,也可以使用萬用字元(比如 * )
JuiceFSCacheSize 磁碟快取容量,單位 MB。如果配置多個目錄,這是所有快取目錄的空間總和
JuiceFSCacheFullBlock 是否快取連續讀資料,在磁碟空間有限或者磁碟效能低下的時候,設定為 false

啟動 CloudFormation Stack 完成部署後可以在 EMR 服務中檢查你的叢集。

進入硬體選項卡。

找到你的 Master 節點。

通過 AWS Systems Manager Session Manager 會話管理器連線到主節點。

登入到 Master 節點。

接下來驗證叢集環境。

$ sudo su hadoop
# JFS_VOL 是一個預製的環境變數,指向您所在的JuiceFS儲存卷
$ hadoop fs -ls jfs://${JFS_VOL}/ # 別忘了最後一個“斜線”
$ hadoop fs -mkdir jfs://${JFS_VOL}/hello-world
$ hadoop fs -ls jfs://${JFS_VOL}/

執行 TPC-DS 基準測試

  • 通過 AWS Systems Manager Session Manager 會話管理器登入到叢集主節點,然後將當前使用者改為 hadoop。

$ sudo su hadoop
  • 解壓 benchmark-sample.zip。

$ cd && unzip benchmark-sample.zip
  • 執行 TPC-DS 測試。

$ cd benchmark-sample
$ screen -L


# ./emr-benchmark.py 為 benchmark 測試程式
# 它會生成 TPC-DS 基準的測試資料,並執行測試集(從 q1.sql 到 q10.sql)
# 測試會包含一下部分:# 1. 生成 TXT 測試資料
# 2. 將 TXT 資料轉成 Parquet 格式
# 3. 將 TXT 資料轉成 Orc 格式
# 4. 執行 Sql 測試用例並統計 Parquet 和 Orc 格式的耗時


# 支援的引數
# --engine 計算引擎選擇 hive 或 spark
# --show-plot-only 只在控制檯中顯示柱狀圖
# --cleanup, --no-cleanup 是否在每次測試時清除 benchmark 資料,預設:否
# --gendata, --no-dendata 是否在每次測試時生成資料,預設:是
# --restore 從已有的資料中恢復資料庫,此選項需要在 --gendata 開啟後才生效
# --scale 資料集大小(例如:100 代表 100GB 資料)
# --jfs 開啟 uiceFS benchmark 測試
# --s3 開啟 S3 benchmark 測試
# --hdfs 開啟 HDFS benchmark 測試


# 請確保機型有足夠的空間儲存測試資料,例如:500GB 推薦 Core Node 使用 m5d.4xlarge 或以上
# 關於機型儲存空間選擇請參考 https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-storage.html
$ ./emr-benchmark.py --scale 500 --engine hive --jfs --hdfs --s3 --no-cleanup --gendata
Enter your S3 bucket name for benchmark. Will create it if it doesn\'t exist: (請輸入用來存放s3基準測試的桶名,若不存在則會建立一個新的) xxxx


$ cat tpcds-setup-500-duration.2021-01-01_00-00-00.res # 測試結果
$ cat hive-parquet-500-benchmark.2021-01-01_00-00-00.res # 測試結果
$ cat hive-orc-500-benchmark.2021-01-01_00-00-00.res # 測試結果


# 刪除資料
$ hadoop fs -rm -r -f jfs://$JFS_VOL/tmp
$ hadoop fs -rm -r -f s3://<your-s3-bucketname-for-benchmark>/tmp
$ hadoop fs -rm -r -f "hdfs://$(hostname)/tmp/tpcds*"
  • 注意:AWS Systems Manager Session Manager 會話管理器可能會超時導致終端連線斷開,建議使用 screen -L 命令講會話保持在後臺 screen 的日誌會儲存在當前目錄下的 screenlog.0

  • 注意:若測試機器一共超過 10vcpu,需要開通 JuiceFS 專業版試用,例如:您有可能會遇到以下錯誤 juicefs[1234] <WARNING>: register error: Too many connections

  • 樣例輸出

  • 刪除 Stack

結語

通過測試驗證可以看到 JuiceFS 確實是彈性伸縮的全託管 HDFS 服務。可以為客戶帶來和 HDFS 一樣的相容性、一致性和接近的效能,和 Amazon S3 一樣的全託管、彈性伸縮、低成本。

原文發表於 Amazon 雲科技中國官方部落格:

https://aws.amazon.com/cn/blogs/china/use-aws-cloudformation-to-configure-juicefs-in-amazon-emr-in-one-minute/