雲計算

重磅:阿里雲 JindoFS SDK 全面開放使用,OSS 文件各項操作性能得到大幅提升

作者:
蘇崑輝,花名撫月,阿里巴巴計算平臺事業部 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組數據集,從不同的角度進行測試,需要覆蓋讀、寫、移動、刪除等一些操作,並且需要分別測試大文件、小文件下的性能。這個測試覆蓋了平時用戶作業中的大部分場景。
截屏2020-07-09 下午2.19.35.png

從這個測試中可以看出,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 - 分層存儲

JindoFS概述:雲原生的大數據計算存儲分離方案

JindoFS解析 - 雲上大數據高性能數據湖存儲方案


後續我們也會在雲棲社區和釘釘群分享更多的 Jindo 技術乾貨,歡迎有興趣的同學加入 【阿里雲EMR釘釘群】進行交流和技術分享。
產品群.JPG

Leave a Reply

Your email address will not be published. Required fields are marked *