处理远程数据
在 MATLAB® 中,可以与远程位置进行双向数据读写,例如 Amazon S3™(简单存储服务)、Microsoft® Azure® Storage Blob 和 Hadoop® 分布式文件系统 (HDFS™) 中的云存储。
您可以使用数据存储对象访问远程数据。使用数据存储检查来自桌面版本 MATLAB 的部分数据。然后,在本地建立代码原型后,可以再将其扩展到集群或云。扩展提高了执行效率,因为在与数据相同的位置运行大型计算更为高效。要将数据写入到远程位置,可以对 tall 数组或分布式数组使用 write 函数。
Amazon S3
MATLAB 允许使用 Amazon Web Services 提供的 Amazon S3 作为在线文件存储 Web 服务。您可以将 Amazon S3 上存储的数据与数据存储对象(例如 ImageDatastore、FileDatastore、SpreadsheetDatastore 或 TabularTextDatastore)结合使用。当指定数据位置时,必须使用以下格式的统一资源定位器 (URL) 指定文件或文件夹的完整路径:
s3://bucketname/path_to_file
bucketname 是容器的名称,path_to_file 是文件或文件夹的路径。
Amazon S3 通过 Web 服务接口提供数据存储。您可以在 Amazon S3 中使用桶作为容器来存储对象。设置访问权限
要处理 Amazon S3 中的远程数据,必须先设置访问权限:
注册一个 Amazon Web Services (AWS) 根帐户。请参阅 Amazon Web Services:帐户。
使用 AWS 根帐户,创建 IAM(身份识别和访问管理)用户。请参阅在 AWS 帐户中创建 IAM 用户。
生成访问密钥以接收访问密钥 ID 和秘密访问密钥。请参阅管理 IAM 用户的访问密钥。
使用 https://aws.amazon.com/cli/ 上提供的 AWS 命令行界面工具,为机器配置 AWS 访问密钥 ID、访问密钥和地区。或者,通过使用 setenv 来直接设置环境变量:
AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY - 对 Amazon S3 服务进行身份验证并启用服务。(在步骤 3 中生成了这对访问密钥变量。)
AWS_DEFAULT_REGION(可选)- 选择桶的地理区域。此环境变量的值通常自动确定,但桶所有者可能要求手动设置此变量的值。
AWS_SESSION_TOKEN(可选)- 如果您使用的是临时安全凭据,例如 AWS® 联合身份验证,请指定会话令牌。
如果正在使用的是 Parallel Computing Toolbox™,则必须确保已配置集群以访问 S3 服务。可通过在 parpool、batch、createJob 中或在 Cluster Profile Manager 中设置 EnvironmentVariables,将客户端环境变量复制到集群上的工作进程。从 Amazon S3 读取数据
可使用数据存储对象从 Amazon S3 读取数据。例如,创建 ImageDatastore,从数据存储中读取指定的图像,然后将图像显示到屏幕上。
setenv('AWS_ACCESS_KEY_ID', 'YOUR_AWS_ACCESS_KEY_ID');
setenv('AWS_SECRET_ACCESS_KEY', 'YOUR_AWS_SECRET_ACCESS_KEY');
ds = imageDatastore('s3://bucketname/image_datastore/jpegfiles', ...
'IncludeSubfolders', true, 'LabelSource', 'foldernames');
img = ds.readimage(1);
imshow(img)将数据写入到 Amazon S3
要将数据写入到 Amazon S3,请对分布式数组或 tall 数组调用 write 函数,并提供云存储中的文件夹的完整路径。以下示例说明如何将表格数据从 Amazon S3 读入到 tall 数组,通过移除缺失的条目并排序进行预处理,然后将其写回到 Amazon S3。
setenv('AWS_ACCESS_KEY_ID', 'YOUR_AWS_ACCESS_KEY_ID');
setenv('AWS_SECRET_ACCESS_KEY', 'YOUR_AWS_SECRET_ACCESS_KEY');
ds = tabularTextDatastore('s3://bucketname/dataset/airlinesmall.csv', ...
'TreatAsMissing', 'NA', 'SelectedVariableNames', {'ArrDelay'});
tt = tall(ds);
tt = sortrows(rmmissing(tt));
write('s3://bucketname/preprocessedData/',tt);
要读回 tall 数据,请使用 datastore 函数。
ds = datastore('s3://bucketname/preprocessedData/');
tt = tall(ds);Microsoft Azure Storage Blob
MATLAB 允许使用 Windows Azure® Storage Blob (WASB) 作为 Microsoft 提供的在线文件存储 Web 服务。您可以将 Azure 上存储的数据与数据存储对象(例如 ImageDatastore、FileDatastore、SpreadsheetDatastore 或 TabularTextDatastore)结合使用。当指定数据位置时,必须使用以下格式的统一资源定位器 (URL) 指定文件或文件夹的完整路径:
wasbs://container@account/path_to_file/file.ext
container@account 是容器的名称,path_to_file 是文件或文件夹的路径。
Azure 通过 Web 服务接口提供数据存储。可使用 blob 来存储 Azure 中的数据文件。有关详细信息,请参阅 Azure 简介。设置访问权限
要处理 Azure 存储中的远程数据,必须先设置访问权限:
注册一个 Microsoft Azure 帐户,请参阅 Microsoft Azure 帐户。
使用 setenv 设置以下两个环境变量之一,以设置身份验证详细信息:
MW_WASB_SAS_TOKEN - 通过共享访问签名 (SAS) 进行身份验证
获得 SAS。有关详细信息,请参阅使用存储资源管理器管理 Azure Blob 存储资源中的“获取 Blob 容器的 SAS”部分。
在 MATLAB 中,将 MW_WASB_SAS_TOKEN 设置为 SAS 查询字符串。例如,
setenv MW_WASB_SAS_TOKEN '?st=2017-04-11T09%3A45%3A00Z&se=2017-05-12T09%3A45%3A00Z&sp=rl&sv=2015-12-11&sr=c&sig=E12eH4cRCLilp3Tw%2BArdYYR8RruMW45WBXhWpMzSRCE%3D'
您必须将此字符串设置为从 Azure Storage Web UI 或 Explorer 生成的有效 SAS 令牌。
MW_WASB_SECRET_KEY - 通过帐户的两个密钥之一进行身份验证
每个存储帐户都有两个允许管理特权访问权限的密钥。通过设置 MW_WASB_SECRET_KEY 环境变量,无需创建 SAS 令牌即可对 MATLAB 授予相同的访问权限。例如:
setenv MW_WASB_SECRET_KEY '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF'
如果您使用 Parallel Computing Toolbox,则必须通过在 parpool、batch、createJob 中或 Cluster Profile Manager 中设置 EnvironmentVariables,将客户端环境变量复制到集群上的工作进程。从 Azure 读取数据
要从 WASB 位置读取数据,请使用数据存储对象。要生成文件位置,请以文件名 file.ext 开始,并以文件路径 /path_to_file 和您的帐户名称 wasbs://container@account/ 作为其前缀。完整的数据位置使用以下语法:
wasbs://container@account/path_to_file/file.ext
container@account 是容器的名称,path_to_file 是文件或文件夹的路径。
例如,如果您在测试存储帐户 wasbs://blobContainer@storageAccount.blob.core.windows.net/ 上的文件夹 /airline 中有一个文件 airlinesmall.csv,则可以使用以下方式创建数据存储:
location = 'wasbs://blobContainer@storageAccount.blob.core.windows.net/airline/airlinesmall.csv';
ds = tabularTextDatastore(location, 'TreatAsMissing', 'NA', ...
'SelectedVariableNames', {'ArrDelay'});
您可以使用 Azure 进行数据存储支持的所有计算,包括直接读取、mapreduce、tall 数组和深度学习。例如,创建 ImageDatastore,从数据存储中读取指定的图像,然后将图像显示到屏幕上。
setenv('MW_WASB_SAS_TOKEN', 'YOUR_WASB_SAS_TOKEN');
ds = imageDatastore('wasbs://YourContainer@YourAccount.blob.core.windows.net/', ...
'IncludeSubfolders', true, 'LabelSource', 'foldernames');
img = ds.readimage(1);
imshow(img)将数据写入到 Azure
要将数据写入到 Azure,请对分布式数组或 tall 数组调用 write 函数,并提供云存储中的文件夹的完整路径。以下示例说明如何将表格数据从 Azure 读入到 tall 数组,通过移除缺失的条目并排序进行预处理,然后将其写回到 Azure。
setenv('MW_WASB_SAS_TOKEN', 'YOUR_WASB_SAS_TOKEN');
ds = tabularTextDatastore('wasbs://YourContainer@YourAccount.blob.core.windows.net/dataset/airlinesmall.csv', ...
'TreatAsMissing', 'NA', 'SelectedVariableNames', {'ArrDelay'});
tt = tall(ds);
tt = sortrows(rmmissing(tt));
write('wasbs://YourContainer@YourAccount.blob.core.windows.net/preprocessedData/',tt);
要读回 tall 数据,请使用 datastore 函数。
ds = datastore('wasbs://YourContainer@YourAccount.blob.core.windows.net/preprocessedData/');
tt = tall(ds);Hadoop 分布式文件系统指定数据的位置
您也可以使用 tabularTextDatastore 函数为驻留在 Hadoop 分布式文件系统 (HDFS) 上的文本文件或序列文件集合创建数据存储。当指定数据位置时,必须使用以下格式之一的统一资源定位器 (URL) 指定文件或文件夹的完整路径:
hdfs:/path_to_file
hdfs:///path_to_file
hdfs://hostname/path_to_file
hostname 是主机或服务器的名称,path_to_file 是文件或文件夹的路径。指定 hostname 是一个可选操作。未指定 hostname 时,Hadoop 使用与 MATLAB 中的 Hadoop 分布式文件系统 (HDFS) 安装相关联的默认主机名称。
例如,以下两个命令都在主机 myserver 上的文件夹 data 中为文件 file1.txt 创建一个数据存储:
ds = tabularTextDatastore('hdfs:///data/file1.txt')
ds = tabularTextDatastore('hdfs://myserver/data/file1.txt')
如果指定了 hostname,则它必须对应于由 Hadoop 集群的 Hadoop XML 配置文件中的 fs.default.name 属性定义的名称节点。
您还可以在位置中包括端口号。例如,此位置指定了一台名为 myserver 的主机,端口号为 7867,在其文件夹 data 中包含文件 file1.txt:
'hdfs://myserver:7867/data/file1.txt'
指定的端口号必须与在 HDFS 配置中设置的端口号相匹配。设置 Hadoop 环境变量
在从 HDFS 读取数据之前,先使用 setenv 函数将适当的环境变量设置为安装 Hadoop 的文件夹。此文件夹必须可从当前计算机访问。
仅使用 Hadoop v1 - 设置 HADOOP_HOME 环境变量。
仅使用 Hadoop v2 - 设置 HADOOP_PREFIX 环境变量。
如果同时使用 Hadoop v1 和 Hadoop v2,或者未设置 HADOOP_HOME 和 HADOOP_PREFIX 环境变量,则设置 MATLAB_HADOOP_INSTALL 环境变量。
例如,使用此命令设置 HADOOP_HOME 环境变量。hadoop-folder 是安装 Hadoop 的文件夹,/mypath/ 是该文件夹的路径。
setenv('HADOOP_HOME','/mypath/hadoop-folder');Hortonworks 或 Cloudera 上的 HDFS 数据
如果您当前的计算机可以访问 Hortonworks 或 Cloudera® 上的 HDFS 数据,则无需设置 HADOOP_HOME 或 HADOOP_PREFIX 环境变量。MATLAB 会在使用 Hortonworks 或 Cloudera 应用程序边缘节点时自动分配这些环境变量。防止从内存中清除代码
当从 HDFS 读取时或在本地读取序列文件时,datastore 函数调用 javaaddpath 命令。此命令将执行以下操作:
清除动态类路径中的文件定义的所有 Java® 类的定义
从基础工作区中删除所有全局变量和变量
从内存中删除所有编译的脚本、函数和 MEX 函数
要防止清除持久变量、代码文件或 MEX 文件,请使用 mlock 函数。将数据写入到 HDFS
使用 write 函数将 tall 数组和分布式数组写入到 Hadoop 分布式文件系统。当对分布式数组或 tall 数组调用此函数时,必须指定一个 HDFS 文件夹的完整路径。以下示例说明如何将表格数据从 HDFS 读入到 tall 数组,通过移除缺失的条目并排序进行预处理,然后将其写回到 HDFS。
ds = tabularTextDatastore('hdfs://myserver/some/path/dataset/airlinesmall.csv', ...
'TreatAsMissing', 'NA', 'SelectedVariableNames', {'ArrDelay'});
tt = tall(ds);
tt = sortrows(rmmissing(tt));
write('hdfs://myserver/some/path/preprocessedData/',tt);
要读回 tall 数据,请使用 datastore 函数。
ds = datastore('hdfs://myserver/some/path/preprocessedData/');
tt = tall(ds);
另请参阅
相关主题