Main Content

处理远程数据

您可以使用 MATLAB® 函数和对象(例如文件 I/O 函数和一些数据存储对象)从远程位置读写数据。这些示例说明如何设置、读取和写入以下云存储平台上的远程位置:

  • Amazon S3™(简单存储服务)

  • Azure® Blob 存储(以前称为 Windows Azure® 存储 Blob (WASB))

  • Hadoop® 分布式文件系统 (HDFS™)

Amazon S3

MATLAB 允许使用 Amazon Web Services 提供的 Amazon S3 作为在线文件存储 Web 服务。当指定数据位置时,必须使用以下格式的统一资源定位器 (URL) 指定文件或文件夹的完整路径:

s3://bucketname/path_to_file

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

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

设置访问权限

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

  1. 注册一个 Amazon Web Services (AWS) 根帐户。请参阅 Amazon Web Services:帐户

  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_DEFAULT_REGION(可选)- 选择桶的地理区域。此环境变量的值通常自动确定,但桶所有者可能要求手动设置此变量的值。

    • AWS_SESSION_TOKEN(可选)- 如果您使用的是临时安全凭据,例如 AWS® 联合身份验证,请指定会话令牌。

如果您的 Amazon S3 位置被授权可公共访问,则您不需要设置环境变量或配置身份验证。有关如何配置公共访问的详细信息,请参阅阻止对您的 Amazon S3 存储的公共访问

Amazon S3 还允许多个用户访问一个帐户。有关 Amazon S3 访问的详细信息,请参阅 AWS 身份和访问管理 (IAM)

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

Amazon S3 读取数据

以下示例说明如何使用 ImageDatastore 对象从 Amazon S3 中读取指定的图像,然后将图像显示到屏幕上。

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

以下示例说明如何使用 tabularTextDatastore 对象将表格数据从 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);

Azure Blob 存储

MATLAB 允许您使用 Azure Blob 存储进行在线文件存储。当指定数据位置时,必须使用以下格式的统一资源定位器 (URL) 指定文件或文件夹的完整路径:

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'

如果您的 Azure 存储位置被授权可公共访问,则不需要设置环境变量或配置身份验证。有关对 Azure 存储的公共访问的详细信息,请参阅配置匿名公共读取访问权限

Azure 存储还允许多个用户访问一个帐户。有关管理多个用户的详细信息,请参阅 Azure Active Directory 身份和访问管理操作参考指南

如果您使用 Parallel Computing Toolbox,则必须通过在 parpoolbatchcreateJob 中或 Cluster Profile Manager 中设置 EnvironmentVariables,将客户端环境变量复制到集群上的工作进程。

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

Azure 读取数据

要从 Azure Blob 存储位置读取数据,请使用以下语法指定位置:

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

以下示例说明如何使用 tabularTextDatastore 对象将表格数据从 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 分布式文件系统

指定数据的位置

MATLAB 允许将 Hadoop 分布式文件系统 (HDFS) 用作在线文件存储 Web 服务。当指定数据位置时,必须使用以下格式之一的统一资源定位器 (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_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

此示例说明如何使用 tabularTextDatastore 对象将数据写入 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);

另请参阅

| | | | | | | |

相关主题