目录
处理远程数据
在 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、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账户中创建IMA用户。
-
生成访问密钥以接收访问密钥 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存储与Azure HDInsight群集配合使用。
从 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);