OSS加速器最佳实践-总述篇

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: OSS加速器最佳实践(总述篇)本最佳实践提供OSS加速器相关的信息和适合的场景,面向对oss和数据湖相关技术有一定了解的开发者。     大家可以通过这俩篇先做一些了解相关文档:《配置OSS加速器》https://help.aliyun.com/document_detail/190726.html《OSS加速器介绍》https://developer.aliyun.com/article/780

OSS加速器最佳实践(总述篇)

本最佳实践提供OSS加速器相关的信息和适合的场景,面向对oss和数据湖相关技术有一定了解的开发者。

     大家可以通过这俩篇先做一些了解相关文档:

《配置OSS加速器》https://help.aliyun.com/document_detail/190726.html

OSS加速器介绍https://developer.aliyun.com/article/780254

介绍

OSS加速器提供AZ(可用区)级的对象下载加速服务,目前已经上线杭州-J,上海-G,北京-H三个可用区,正在白名单申请使用阶段。其用于为AliyunECS/EMR等内部集群的大数据计算场景提供服务(不单独对公网访问服提供务,需要使用Aliyun ECS或Aliyun EMR等基于Aliyun的弹性计算服务来访问)。

OSS加速器面向使用OSS为底座作为数据底座的基因训练、机器学习、数据湖大数据计算等大量数据需要load以及数据重复读较多的场景;其能够提供低延时,高吞吐的数据下载服务。

以10MB的对象多次下载测试,统计其响应延迟(单位ms)分位数,结果显示能降低10倍延迟。

 

 

 

OSS加速器在OSS对象存储的基础上提供更低的延时,特别适合对下载数据延时比较敏感的业务,其基本特性如下:

1) 极致吞吐能力    OSS加速器有效解决多种应用场景(比如数据湖等)的读吞吐的挑战,特别是重复读的场景,其能够每TB提供200MBpsByte)的吞吐能力,线性扩展,最高可以交付Tbps的带宽交付能力。 2)弹性伸缩    通常计算任务有周期性需求,如何有效避免资源浪费,提效降本,通过OSS加速器的弹性伸缩能力,能够在线进行扩容缩容,可以按需释放或提升资源,有效降低TCOOSS加速器提供秒级调整配额的弹性能力:对于批任务,一般下载流量都有波峰,对于下载任务带宽波峰特别突出的情况,OSS加速器提供极大的弹性扩缩容能力,可以提供秒级扩缩容量(数十T到数百T)和带宽(数Gb到上百Gb)配额的能力,使用者可以在任务启动前扩大配额,任务完成后缩小配额,节约日常使用成本。  3)存算分离    OSS加速器满足计算资源和存储资源解耦,面对计算任务的多样化,不再需要多个自建缓存搭建匹配,存算分离,灵活选择引擎和版本,满足多业务场景的吞吐加速。 4)数据一致    同时,基于OSS智能元数据架构,OSS加速器提供了传统缓存方案不具备的一致性,当OSS上文件被更新时,加速器能自动识别,确保引擎读取到的都是最新数据。

 

 

开箱即用的服务端加速模式

在以前的oss使用场景中,通常都是通过客户端缓存数据来提供数据的低延迟加速,但是客户端缓存有其不足:

  1. 客户端空间有限:客户端缓存需要使用客户端的内存或者磁盘,空间有限,无法存放很多数据。在一些面向数据表加速的场景下,需要加载数 TB 至数十 TB 的缓存数据用户分析,明显超过客户端缓存的能力。
  2. 建设复杂度高:为了突破空间限制,需要客户部署更加复杂的集群缓存系统,然后将 oss 数据搬迁进去。这里就涉及到不同系统间的数据移动,大大增加系统复杂度和建设成本。
  3. 数据一致性难以解决:如何在客户端缓存或服务端的数据修改后,避免数据不一致,这是一个很难解决好的问题。

 

OSS加速器提供的是服务端加速的能力:

  1. 继承了 OSS 海量数据存储的优点,能提供数 TB 至数百 TB 的缓存空间   ,能够直接缓存下数仓中的多个表或者分区
  2. 不需要客户端做任何额外系统的部署,即可享受数据加速的效果。
  3. 缓存数据一致性:当 OSS 上文件被更新时,加速器能自动识别,确保引擎读取到的都是最新数据。 OSS 加速器由于不存在一致性的问题,所以只提供 3 种预热策略(反观 Alluxio 等客户端缓存系统,需要提供数十种缓存策略来权衡一致性的问题):
  1. 写时预热:数据写入时同步预热
  2. 读时预热:数据读取时未命中加速器,将其预热到缓存集群
  3. 异步预热:通过命令触发批量预热(开发中)

 

当然客户端缓存和服务端加速并不是冲突的,我们也可以使用客户端缓存+OSS加速器来构建多级缓存,做到极致加速。

 

API接口使用

1简单使用

OSS加速器的的API使用方式同OSS相同,使用上只需要替换OSS标准域名为加速域名(OSS加速器和OSS 使用相同的SDK)

String acclerator_oss_endpoint = "http://oss-cache-cn-beijing-h.aliyuncs.com";

// 创建OSSClient实例。

OSS ossClient = new OSSClientBuilder().build(normal_oss_endpoint, accessKeyId, accessKeySecret);

 

OSSObject ob = ossClient.getObject(bucketName,objectname);

OSSObject ob = ossClient.putObject(bucketName,objectname,inputStream);

这种用法只是修改一下endpoint即可,上传下载都是使用ossClient初始化时的加速域名,对于上传和非热数据的下载也走了加速路径,会造成客户成本浪费。我们下面介绍一下数据分流读写的方式。

 

2 数据分流

这里介绍使用API进行读写数据分流的方法。即将发布的新版OSSJavaSDK各种操作都支持单独设置endpoint.

 GetObjectRequest getObjectRequest = new   GetObjectRequest(bucketName, objectName);

//这里如果不显式设置endpoint,会使用ossclient初始化时设置的值getObjectRequest.setEndPoint(acclerator_oss_endpoint);

OSSObject ob = ossClient.getObject(getObjectRequest);

 

使用者可以在其上定制自己的上传下载数据分离逻辑,甚至做到对不同的下载路径进行再分流,让普通数据走oss机器,只有热数据走oss加速集群,这样可以极大的减少客户的使用成本。

 

 

这里我们使用两个endpont来做上传下载数据的分流。

 

  • oss-cn-beijing.aliyuncs.com用来接收上传数据和下载普通数据(normal_data/*)
  • oss-cache-cn-beijing-h.aliyuncs.com用来获取需要加速的热数据(hot_data/*)。

 

public class Test2 {

    private static String accessKeyId     = "xxxxxxx";

    private static String accessKeySecret =   "xxxxxxx";

 

    //endpoint用于进行上传,将上传数据直接写入oss标准型

    private static String normal_oss_endpoint   = "http://oss-cn-beijing.aliyuncs.com";

 

    //endpoint用于数据下载,其指向oss加速集群

    private static String   acclerator_oss_endpoint =   "http://oss-cache-cn-beijing-h.aliyuncs.com";

 

    private static String bucketName    = " bucketName";

    private static String object_hot    = "hot_data/filetest";

    private static String object_normal =   "normal_data/filetest";

    private static String content       = "1234567";

 

    public static void main(String[] args)   throws IOException {

 

        // 创建OSSClient实例。

        OSS ossClient = new   OSSClientBuilder().build(normal_oss_endpoint, accessKeyId, accessKeySecret);

 

        //object_hot上传到标准OSS

        uploadFile(object_hot, ossClient);

 

        //object_normal上传到标准OSS

        uploadFile(object_normal, ossClient);

 

        //由加速器下载hot_data/filetest

        downloadFile(object_hot, ossClient);

 

        //由标准OSS下载normal_data/filetest

        downloadFile(object_normal,   ossClient);

 

        // 关闭OSSClient。

        ossClient.shutdown();

 

    }

 

    public static void   printObjectContent(OSSObject ob) throws IOException {

        //// 读取文件内容。

        BufferedReader reader = new   BufferedReader(new InputStreamReader(ob.getObjectContent()));

        while (true) {

            String line = reader.readLine();

            if (line == null) { break; }

 

           System.out.println("content:" + line);

        }

    }

 

    /*

    *全部上传到标准oss

    */

    public static void uploadFile(String   objectName, OSS ossClient) {

        ByteArrayInputStream byteArrayInputStream   = new ByteArrayInputStream(content.getBytes());

        InputStream contentInputStream =   (InputStream) byteArrayInputStream;

 

        PutObjectRequest putObjectRequest =   new PutObjectRequest(bucketName, objectName, contentInputStream);

        //这里如果不显式设置endpoint,会使用ossclient初始化时设置的值

        PutObjectResult result =   ossClient.putObject(putObjectRequest);

        System.out.println("Put   objectName:" + objectName + " to " + normal_oss_endpoint +   " resultID:" + result.getRequestId());

        putObjectRequest.setEndPoint(normal_oss_endpoint);

 

    }

 

    /*

     *根据objectName的前缀判断需要走的endpoint

     */

    public static Object downloadFile(String   objectName, OSS ossClient) throws IOException {

        String endpoint = "";

        if (objectName.startsWith("normal_data"))   {

            endpoint = normal_oss_endpoint;

        } else if   (objectName.startsWith("hot_data")) {

            endpoint =   acclerator_oss_endpoint;

        }

 

        GetObjectRequest getObjectRequest =   new GetObjectRequest(bucketName, objectName);

        //这里如果不显式设置endpoint,会使用ossclient初始化时设置的值

       getObjectRequest.setEndPoint(endpoint);

        OSSObject ob =   ossClient.getObject(getObjectRequest);

        System.out.println("Get   Object" + objectName + " from " + endpoint + "   resultID" + ob.getRequestId());

        printObjectContent(ob);

 

        return ob;

    }

}

 

 

适用场景
  1. 低延时数据共享

 

需求背景:客户在货柜上购买物品,先通过手机app扫描货柜的货物拍照上传,后台服务接收到图片后通过oss加速器进行存储,后台的子系统随后进行内容安全分析和图片上条码的识别,条码识别后的结果反馈到应用进行扣费等操作。下载图片需要ms级完成,速度要越快越好,才能给客户更快的响应速度和体验。

 

解决方案:采用OSS加速器写时预热的模式。这个场景下面,对客户上传的图片分析会影响到整个交易链路的延时,时间越短约好,这里使用oss加速器能将分析系统加载图片的延时极大的降低,缩短整个交易链路。

   OSS加速器适合对延时敏感,有多次重复读的业务。

 

  1. 大数据分析

 

需求背景:公司的业务数据按照天分区,归档到OSS作为长久的数据存储,,公司分析人员使用hive或spark等计算引擎对数据进行分析,但不确定查询范围,需要尽量减少查询分析时间。

 

解决方案:使用加速器读时预热的模式。这个场景下面,由于是离线查询,数据量大,并且不确定查询的具体范围,无法做到准确预热,所以读时预热是最合适的。A分析人员查询过的数据,数据会缓存在加速集群,B分析人员查询的数据含有A查过的数据,那么访问就会更加快速。

   数据量查询范围不确定,数据量又很大,可以使用加速器读时预热模式,加速分析业务。

 

  1. 模型训练(异步预热开发中)

 

需求背景:模型训练需要拉取训练数据集,将数据从oss加载到训练机器时间长,导致加载数据时计算资源利用率不高。特别是有多个训练任务,都会用相同的数据集,那么多次加载又是漫长的过程。

 

解决方案:这个场景下,需要加载的数据是提前知道的,我们可以使用OSS异步预热,这样在真正执行训练时就能减少数据加载的时间。多个训练任务使用同样的数据集也能享受到加速效果。对于批任务,一般下载流量都有波峰,对于下载任务带宽波峰特别突出的情况,OSS加速器提供极大的弹性扩缩容能力,可以提供秒级修改容量和带宽配额的能力,使用者可以在任务启动前扩大配额,任务完成后缩小配额,节约使用者日常使用成本。

OSS加速器弹性能力强,能做到秒级配额调整,异步预热模式适合数据量大,范围能确定的分析任务。

 

  1. 多级加速

客户端缓存和服务端加速并不是冲突的,根据业务情况合理的结合使用能够达到多级加速的效果。这里我们以Alluxio/jindofs+OSS加速器为例子来说明其结合的优势。

 

 

  

需求背景:结合客户端内存缓存的高性能和OSS加速器的大容量特性,将加速效果达到极致。

解决方案:Alluxio/jindofs推荐co-locate部署形式,和计算集群并置在一起,更加突出其和计算结合的高性能特性。OSS加速设置为读时预热模式。

读取数据时,当Alluxio中缓存未命中时,其会从后端存储来取数据。对于OSS加速器,采用读时预热,其会在第一次获取数据是进行预热。由于客户端主机缓存空间的限制,在alluxio中每个文件和目录都会设置TTL,当TTL到期后缓存会被淘汰,以便节约空间;此时OSS加速器中的数据并不会马上淘汰,其缓存空间可以存放数百TB的数据。当再次用到alluxio未命中的数据时,就可以直接从加速器加载,做到两级加速,达到极致的加速效果。   

OSS加速器可以和客户端缓存搭配使用,做到极致性能。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
2月前
|
负载均衡 Java 对象存储
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
49 2
|
4月前
|
存储 JSON 自然语言处理
OSS数据源一站式RAG最佳实践
本文介绍了如何使用OpenSearch LLM智能问答版通过OSS数据源一站式构建RAG系统。
7161 11
|
6月前
|
存储 Cloud Native Serverless
云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
阿里云OSS对象存储方案利用函数计算FC,在不同终端请求时实时处理OSS中的原图,减少衍生图存储,降低成本。
|
SQL 存储 监控
通过sdk查看oss投递(新版)延迟情况最佳实践
在投递任务中,日志服务会将运行日志写入到给定的logstore中,因而可以使用SDK来查看投递任务的当前状态,并进行批量查询,以了解多个Project和投递任务的状态。下面以查看oss投递的延迟为例,介绍客户提供操作步骤和常见的使用场景,以帮助客户更加方便地监控和管理投递任务。
通过sdk查看oss投递(新版)延迟情况最佳实践
|
6月前
|
存储 运维 监控
运维编排最佳实践:将运维编排任务执行记录投递到OSS/SLS
运维编排服务(Operation Orchestration Service),简称OOS,是全面、免费的云上自动化运维平台,提供运维任务的管理和执行。典型使用场景包括:事件驱动运维,批量操作运维,定时运维任务,跨地域运维等,OOS为重要运维场景提供审批,通知等功能。OOS帮您实现标准化运维任务,从...
运维编排最佳实践:将运维编排任务执行记录投递到OSS/SLS
|
6月前
|
存储 分布式计算 监控
操作审计最佳实践:将阿里云操作日志持续投递到您的 SLS/OSS
操作审计(ActionTrail)帮助您监控并记录阿里云账号的活动,包括通过阿里云控制台、OpenAPI、开发者工具对云上产品和服务的访问和使用行为,记录为操作日志。 操作审计支持所有阿里云账号的免开通服务,默认为所有账号记录并存储近 90 天的日志。但在实际应用中,受法律法规和企业审计标准的要求,...
395 0
|
存储 数据采集 运维
Alibaba Cloud Lens for OSS最佳实践
——其冀 阿里云智能产品专家
Alibaba Cloud Lens for OSS最佳实践
|
对象存储
云速搭部署OSS及资源包最佳实践
本实践通过云速搭设计一个 OSS 的架构,通过 OSS 提供的路径可以下载相应的文件。
云速搭部署OSS及资源包最佳实践
|
SQL 分布式计算 关系型数据库
Hive 数仓迁移 JindoFS/OSS 数据湖最佳实践
Hive 数仓是大多数迁移客户都会遇到的场景。在迁移过程中,不建议同时在新集群进行业务升级(比如从 Hive on MR 迁移到 Hive on Tez 或 Spark SQL等),这些业务升级可以在迁移完成后进行。1. 元数据同步Hive 元数据是对于 Hive 表来说非常关键,除了表结构信息,里面还记录着 Hive 表与底层文件系统的关联关系,许多上层服务都依赖 Hive 元数据提供服务。a.
755 0
|
存储 机器学习/深度学习 缓存
一站式极致读吞吐,加速业务数字化转型 - 阿里云对象存储 OSS加速器解析与实践
阿里云对象存储OSS重磅推出OSS加速器功能,提供高性能、高吞吐量的数据访问服务。
8458 0
一站式极致读吞吐,加速业务数字化转型 - 阿里云对象存储 OSS加速器解析与实践