对象存储OSS(Object Storage Service)具有海量、可靠、安全、高性能、低成本的特点。OSS提供标准、低频、归档类型,覆盖多种数据从热到冷的存储需求,单个文件的大小从1字节到48.8TB,可以存储的文件个数无限制。OSS已成为互联网、企业级数据应用的基础设施。
通常,获取对象存储数据的通方式为:获取整个对象,或按指定的字节范围来获取数据。杭州云栖大会上,阿里云对象存储OSS商业化发布OSS Select(目前深圳区域已sh),用户可直接使用简单的SQL语句,从OSS的文件中选取所需要的内容。
OSS Select介绍
使用SQL选取OSS文件中的内容
OSS Select(深圳区域已商业化),让开发者可以直接使用SQL语句,从OSS文件中选取需要的内容。
使用OSS Select,只获取应用程序所需的查询结果,并支持并发地分片查询,会大幅提升程序的性能,通常情况下能有400%的提升。
功能说明:
- 支持的文件格式:文件编码为UTF-8,符合RFC 4180标准的CSV文件(包括TSV等类CSV文件,文件的行列分隔符以及Quote字符都可自定义)。
- 支持的文件存储类型:标准型、低频型。
- 支持的加密文件:OSS完全托管、KMS加密-默认KMS主密钥
- 控制台-选取内容:通过控制台,您可以针对128MB以下的文件,提取40MB以下的数据记录。如果您需要处理更大的文件或返回更多的记录,可以使用 OSS API或SDK
- 阿里云DataLakeAnalytics产品已支持使用OSS Select,进一步加速对OSS上数据的交互式查询分析。后续阿里云EMR、MaxCompute、HybridDB等产品都会陆续支持OSS Select
- 了解更多OSS Select使用方法,可以参考OSS API文档
使用方式
使用OSS API/SDK(参考本文示例)
比如,生命科技行业客户,基于OSS Select+函数计算,对测序统计文件进行分析,提升效率
使用OSS控制台(参考示例)
在Spark/Presto等大数据应用中使用OSS Select加速
阿里云DataLakeAnalytics中,使用OSS Select
使用示例
使用示例1(python)
# -*- coding: utf-8 -*-
import os
import oss2
def select_call_back(consumed_bytes, total_bytes = None):
print('Consumed Bytes:' + str(consumed_bytes) + '\n')
# 首先初始化AccessKeyId、AccessKeySecret、Endpoint等信息。
# 通过环境变量获取,或者把诸如“<你的AccessKeyId>”替换成真实的AccessKeyId等。
#
# 以杭州区域为例,Endpoint可以是:
# http://oss-cn-hangzhou.aliyuncs.com
# https://oss-cn-hangzhou.aliyuncs.com
# 分别以HTTP、HTTPS协议访问。
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '<你的AccessKeyId>')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '<你的AccessKeySecret>')
bucket_name = os.getenv('OSS_TEST_BUCKET', '<你的Bucket>')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '<你的访问域名>')
# 确认上面的参数都填写正确了
for param in (access_key_id, access_key_secret, bucket_name, endpoint):
assert '<' not in param, '请设置参数:' + param
# 创建Bucket对象,所有Object相关的接口都可以通过Bucket对象来进行
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
#
csvfile = 'sample.csv'
resultfilename = 'python_select.csv'
csv_meta_params = {'FileHeaderInfo': 'None',
'RecordDelimiter': '\r\n'}
# LineRange(可选参数):表示指定查询行的范围
select_csv_params = {'FileHeaderInfo': 'None',
'LineRange':(100,1000)}
csv_header = bucket.get_csv_object_meta(key, csv_meta_params)
# 将查询结果输出到文件
result = bucket.select_csv_object_to_file(csvfile, resultfile,
"select _1, _3, _4 from ossobject where _4 > 40 and _1 like '%Tom%' ",
select_call_back, input_format)
以上是一个简单的python示例,使用SQL查询OSS的对象,并将结果输出到文件汇总。
除了将查询结果输出到文件,还可以将查询结果直接返回
result = bucket.select_csv_object(csvfile, "select * from ossobject where _4 > 40 and _1 like '%Tom%' ", select_call_back, select_csv_params)
content_got = b''
for chunk in result:
content_got += chunk
print(content_got)
查询结果:
使用示例2(Spark on OSS 使用Select)
您可以使用OSS Select来加速您的各类应用。OSS Select团队,创建了一个Spark的示例,基于OSS Select,实现 Spark Data Source API。假设,您需要从大量的人员名单中,查询符合条件的人员信息。比如查询50岁以上,姓名中包含Tom的目标人员。
使用OSS Select提升应用程序性能
- 启用OSS Select,Spark借助OSS Select仅获取文件中所需要的数据;而禁用OSS Select,Spark获取整个文件
- 不使用OSS Select,查询需要78秒(1.3分钟)。而使用OSS Select,只需要11秒,程序性能提升6倍!
测试配置说明:
Spark测试集群配置:
数量 | 配置 | |
---|---|---|
master | 1 | 4core 8GB |
workers | 2 | 4core 8GB |
Spark配置:
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=6g
export SPARK_WORKER_CORES=3
export SPARK_WORKER_INSTANCES=1
export SPARK_EXECUTOR_CORES=1
export SPARK_EXECUTOR_MEMORY=2g
数据量:
CSV数据量为7GB。
支持区域
目前OSS Select已在华南1(深圳)区域正式商业化,用户在华南1(深圳)区域的Bucket,已可使用OSS Select。
更多信息
DataLakeAnalytics:
OSS Select主要是针对OSS单个文件进行查询分析(当前支持的是CSV),如您有如下场景,建议使用DataLakeAnalytics产品,无服务化查询分析OSS数据,请参考产品介绍。
- 需要对OSS多个文件关联查询分析
- 需要对多张表进行JOIN查询
- OSS上文件不是CSV,而是JSON、Parquet、ORC、AVRO、RCFile等
基于OSS,进行数据查询分析和可视化BI报表
基于OSS+DataLakeAnalytics+QuickBI可以,将日志、交易记录等数据存放到OSS,并进行交互式查询分析,输出可视化BI报表,可以参考实验步骤文档