本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

处理远程数据

在 MATLAB® 中,可以与远程位置进行双向数据读写,例如 Amazon S3™(简单存储服务)、Microsoft® Azure® Storage Blob 和 Hadoop® 分布式文件系统 (HDFS™) 中的云存储。

可使用 datastore 对象访问远程数据。使用数据存储检查来自桌面版本 MATLAB 的部分数据。然后,在本地建立代码原型后,可以再将其扩展到群集或云。扩展提高了执行效率,因为在与数据相同的位置运行大型计算更为高效。要将数据写入到远程位置,可以对 tall 数组或分布式数组使用 write 函数。

Amazon S3

MATLAB 允许使用 Amazon S3 作为亚马逊 Web 服务提供的在线文件存储 Web 服务。可以将 Amazon S3 上存储的数据与 datastore 函数或特定的 datastore 对象(例如 ImageDatastoreFileDatastoreSpreadsheetDatastoreTabularTextDatastore)配合使用。当指定数据的位置时,必须使用以下格式的国际化资源标识符 (IRI) 指定文件或文件夹的完整路径:

s3://bucketname/path_to_file

bucketname 是容器的名称,path_to_file 是文件或文件夹的路径。

Amazon S3 通过 Web 服务接口提供数据存储。您可以在 Amazon S3 中使用作为容器来存储对象。

设置访问权限

要处理 Amazon S3 中的远程数据,必须先设置访问权限:

  1. 注册一个亚马逊 Web 服务 (AWS) 根帐户。请参阅亚马逊 Web 服务:帐户

  2. 使用 AWS 根帐户,创建 IAM(身份识别和访问管理)用户。请参阅在 AWS 帐户中创建 IAM 用户

  3. 生成访问密钥以接收访问密钥 ID 和秘密访问密钥。请参阅管理 IAM 用户的访问密钥

  4. 使用 https://aws.amazon.com/cli/ 上提供的 AWS 命令行界面工具,为机器配置 AWS 访问密钥 ID、访问密钥和地区。或者,通过使用 setenv 来直接设置环境变量:

    • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY - 对 Amazon S3 服务进行身份验证并启用服务。(在步骤 3 中生成了这对访问密钥变量。)

    • AWS_REGION(可选)- 选择桶的地理区域。此环境变量的值通常自动确定,但桶所有者可能要求手动设置此变量的值。

如果正在使用的是 Parallel Computing Toolbox™,则必须确保已配置群集以访问 S3 服务。可通过在 parpoolbatchcreateJob 中或在 Cluster Profile Manager 中设置 EnvironmentVariables,将客户端环境变量复制到群集上的工作进程。

Amazon S3 读取数据

可使用 datastore 对象从 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 上存储的数据与 datastore 函数或特定的 datastore 对象(例如 ImageDatastoreFileDatastoreSpreadsheetDatastoreTabularTextDatastore)配合使用。当指定数据的位置时,必须使用以下格式的国际化资源标识符 (IRI) 指定文件或文件夹的完整路径:

wasbs://container@account/path_to_file/file.ext

container@account 是容器的名称,path_to_file 是文件或文件夹的路径。

Azure 通过 Web 服务接口提供数据存储。可使用 blob 来存储 Azure 中的数据文件。有关详细信息,请参阅 Azure 简介

设置访问权限

要处理 Azure 存储中的远程数据,必须先设置访问权限:

  1. 注册一个 Microsoft Azure 帐户,请参阅 Microsoft Azure 帐户

  2. 使用 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,则必须通过在 parpoolbatchcreateJob 中或 Cluster Profile Manager 中设置 EnvironmentVariables,将客户端环境变量复制到群集上的工作进程。

有关详细信息,请参阅将 Azure 存储与 Azure HDInsight 群集配合使用

Azure 读取数据

要从 WASB 位置读取数据,请使用 datastore 对象。要生成文件位置,请以文件名 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 进行 datastore 支持的所有计算,包括直接读取、 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 分布式文件系统

指定数据的位置

您也可以使用 datastore 函数为驻留在 Hadoop 分布式文件系统 (HDFS) 上的文本文件或序列文件集合创建数据存储。当指定数据的位置时,必须使用下列格式之一的国际化资源标识符 (IRI) 指定文件或文件夹的完整路径:

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 = datastore('hdfs:///data/file1.txt') 
  • ds = datastore('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_HOMEHADOOP_PREFIX 环境变量,则设置 MATLAB_HADOOP_INSTALL 环境变量。

例如,使用此命令设置 HADOOP_HOME 环境变量。hadoop-folder 是安装 Hadoop 的文件夹,/mypath/ 是该文件夹的路径。

setenv('HADOOP_HOME','/mypath/hadoop-folder');

Hortonworks 或 Cloudera 上的 HDFS 数据

如果您当前的计算机可以访问 Hortonworks 或 Cloudera® 上的 HDFS 数据,则无需设置 HADOOP_HOMEHADOOP_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);

另请参阅

| | | | | | |

相关主题