作者:
蘇崑輝,花名撫月,阿里巴巴計算平臺事業部 EMR 高級工程師, Apache HDFS committer. 目前從事開源大數據存儲和優化方面的工作。
JindoFS 是阿里雲E-MapReduce團隊開發的基於雲上對象存儲的文件系統(緩存系統)。JindoFS SDK作為JindoFS的客戶端,提供了三大能力:1. 面向Hadoop/Spark生態提供訪問OSS對象存儲的封裝;2. 訪問JindoFS OSS緩存加速服務;3. 訪問JindoFS塊模式文件系統。本文主要介紹如何使用JindoFS SDK來訪問OSS對象存儲,以及使用它來提升我們操作OSS文件的性能。值得一提的是,此前JindoFS SDK 僅限於E-MapReduce產品內部使用,此次全方位面向整個阿里雲OSS用戶放開,並提供官方維護和支持技術,歡迎廣大用戶集成和使用。
大數據和OSS
傳統大數據領域,我們經常使用HDFS作為底層存儲,然後在上面跑MapReduce、SQL on Hadoop的作業。隨著雲上大數據技術的發展,以及年代悠久的HDFS越發凸顯出來的瓶頸問題,越來越多的用戶開始將HDFS的數據遷移到對象存儲系統上(比如阿里雲OSS)然後直接在OSS上跑MapReduce、SQL作業。同時,客戶習慣將機器學習的數據集也放在OSS上,同時進行相關機器學習作業。用戶逐步依託OSS搭建他們的數據倉庫、數據湖,此時OSS操作的速度將成為影響作業的執行效率的重大因素。
OSS SDK
官方SDK是阿里雲OSS團隊開發的官方SDK,提供了Bucket管理、文件管理、文件上傳下載、版本管理、授權訪問、圖片處理等API接口。官方SDK提供了Java、Python、C++等版本,它們都是對Restful API的封裝。官方SDK提供了對OSS資源全方位管理的接口,這些接口非常全面,也比較底層。
Hadoop-OSS-SDK
Hadoop-OSS-SDK是基於官方SDK(Java版)進行封裝,提供了Hadoop FileSystem接口的抽象層。大數據生態的系統如Hive、Spark無法直接使用官方SDK,但是它們可以直接操作FileSystem接口進行OSS文件的讀寫操作。Hadoop-OSS-SDK是Hadoop大數據生態和OSS之間的粘合劑。FileSystem接口主要關注OSS的文件管理、文件上傳下載功能,它對官方SDK的Bucket管理、圖片處理等並不關心,它不是官方SDK的一個替代。使用FileSystem接口,用戶不需要關心什麼時候使用簡單上傳、什麼時候使用分片上傳,因為FileSystem接口替用戶考慮了這些事情。而如果使用官方SDK就必須考慮這些問題,使用起來比較複雜。
JindoFS SDK
JindoFS SDK是一個簡單易用的 JindoFS 客戶端,目前主要用在E-Mapreduce集群內,提供JindoFS集群訪問能力和操作OSS文件的能力。相比於Hadoop-OSS-SDK做了很多的性能優化。現在,JindoFS SDK對外開放使用,我們可以使用該SDK來獲得訪問OSS的能力,並獲得更好的性能。
JindoFS SDK的作用等價於Hadoop-OSS-SDK,可以直接替代Hadoop-OSS-SDK。與Hadoop-OSS-SDK不同的是,JindoFS SDK直接基於OSS Restful API進行實現,而不是基於Java版SDK進行封裝。JindoFS SDK也同樣提供了Hadoop FileSystem接口,並且JindoFS SDK對文件管理、文件上傳下載進行了一系列的性能優化。
JindoFS SDK兼容性如何?
Hadoop開源版本(截止到寫這篇文章的時候,Hadoop的最新穩定版是3.2.1)基於OSS SDK 3.4.1版本,其實現了create、open、list、mkdir等FileSystem接口,從而支持Hive、Spark等程序訪問OSS。Hadoop-OSS-SDK中實現的接口,在JindoFS SDK中也全面支持。使用方式完全相同,除了一些配置項的key不一樣,使用上非常方便,只要用戶將JindoFS SDK的jar包放入hadoop的lib目錄下,再配上oss的accessKey即可。
JindoFS SDK對Hadoop3的兼容性做了增強,比如支持對OSS的隨機讀(pread接口),支持ByteBuffer讀等等。
使用JindoFS SDK性能提升多少?
我們做了一個JindoFS SDK 和Hadoop-OSS-SDK 性能對比測試,這個測試中我們準備了3組數據集,從不同的角度進行測試,需要覆蓋讀、寫、移動、刪除等一些操作,並且需要分別測試大文件、小文件下的性能。這個測試覆蓋了平時用戶作業中的大部分場景。
從這個測試中可以看出,JindoFS SDK在put、get、mv、delete操作上性能均顯著好於Hadoop-OSS-SDK。
安裝SDK
1. 安裝jar包
我們去github repo下載最新的jar包 jindofs-sdk-x.x.x.jar ,將sdk包安裝到hadoop的classpath下
cp ./jindofs-sdk-*.jar hadoop-2.8.5/share/hadoop/hdfs/lib/jindofs-sdk.jar
注意: 目前SDK只支持Linux、MacOS操作系統,因為SDK底層採用了native代碼。
2. 創建客戶端配置文件
將下面環境變量添加到/etc/profile文件中
export B2SDK_CONF_DIR=/etc/jindofs-sdk-conf
創建文件 /etc/jindofs-sdk-conf/bigboot.cfg 包含以下主要內容
[bigboot]
logger.dir = /tmp/bigboot-log
[bigboot-client]
client.oss.retry=5
client.oss.upload.threads=4
client.oss.upload.queue.size=5
client.oss.upload.max.parallelism=16
client.oss.timeout.millisecond=30000
client.oss.connection.timeout.millisecond=3000
我們可以將oss的ak、secret、endpoint預先配置在 hadoop-2.8.5/etc/hadoop/core-site.xml ,避免每次使用時臨時填寫ak。
<configuration>
<property>
<name>fs.AbstractFileSystem.oss.impl</name>
<value>com.aliyun.emr.fs.oss.OSS</value>
</property>
<property>
<name>fs.oss.impl</name>
<value>com.aliyun.emr.fs.oss.JindoOssFileSystem</value>
</property>
<property>
<name>fs.jfs.cache.oss-accessKeyId</name>
<value>xxx</value>
</property>
<property>
<name>fs.jfs.cache.oss-accessKeySecret</name>
<value>xxx</value>
</property>
<property>
<name>fs.jfs.cache.oss-endpoint</name>
<value>oss-cn-xxx.aliyuncs.com</value>
</property>
<property>
<name>fs.jfs.cache.copy.simple.max.byte</name>
<value>67108864</value>
<description>set to -1 if your oss bucket supports shallow copy.</description>
</property>
</configuration>
至此安裝就完成了,非常的方便。
另外,我們推薦配置免密功能,避免明文保存accessKey,提高安全性。
使用場景:用Hadoop Shell訪問OSS
我們試一下用hadoop shell去訪問oss,我們可以使用以下命令,訪問一個臨時的oss bucket
hadoop fs -ls oss://<ak>:<secret>@<bucket>.<endpoint>/
在生產上不推薦使用此方式,因為這種方式accessKey會作為path的一部分落在日誌裡面。
如果我們已經事先在core-site.xml配置好了accessKey,或者配置了免密功能,那麼我們可以直接使用以下命令
hadoop fs -ls oss://<bucket>/
使用場景:將Hive表存放在OSS
默認hive使用HDFS作為底層存儲,我們可以將hive的底層存儲替換成OSS,只需要在hive-site.xml裡面修改以下配置
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>oss://bucket/user/hive/warehouse</value>
</property>
</configuration>
然後,我們通過hive建的表,就會直接存放在OSS上。後續通過hive的查詢就會查詢OSS的數據。
CREATE TABLE pokes_jfs (foo INT, bar STRING);
如果不希望將整個hive的warehouse都放到OSS上,也可以對單表指定location到OSS。
CREATE TABLE pokes_jfs (foo INT, bar STRING) LOCATION 'oss://bucket/warehouse/pokes_jfs.db';
使用場景:用Spark查詢OSS表
spark使用自帶的hadoop client包,因此我們需要把JindoFS SDK也複製到spark目錄。
cp ./jindofs-sdk-*.jar spark-2.4.6/jars/
然後執行spark-sql去查詢Hive的OSS表
bin/spark-sql
select * from pokes_jfs;
更多場景
除了上面提到的MapReduce、Hive、Spark引擎,下面這些場景也可以受益於JindoFS SDK:
- Presto讀寫OSS
- Impala讀寫OSS
- 使用OSS作為Hbase的底層存儲
JindoFS SDK還在日益完善,後續會在實時計算、機器學習等更多領域提供支持。歡迎大家下載使用JindoFS SDK,如果遇到任何問題,請隨時聯繫阿里雲E-Mapreduce團隊,或者在github上提交issue,我們將盡快為您解答。
相關閱讀推薦:
JindoFS - 分層存儲
後續我們也會在雲棲社區和釘釘群分享更多的 Jindo 技術乾貨,歡迎有興趣的同學加入 【阿里雲EMR釘釘群】進行交流和技術分享。