Azure 存储文件数据 JavaScript 的湖客户端库
Azure Data Lake存储(ADLS)包括所有必要的能力,使开发者,数据科学家和分析人员能够方便地存储任何大小,形状和速度的数据,并跨平台和语言进行各种类型的处理和分析. 它消除了摄取和存储您所有数据的复杂性,同时使得它更快地与批量,流体,交互分析一起起起跑.
这个项目提供了JavaScript的客户端库,方便于使用微软Azure存储数据湖服务.
使用此软件包中的客户端库 :
- 创建/列表/删除文件系统
- 创建/读取/列表/更新/删除路径、目录和文件
密钥链接 :
开始
目前得到支持的环境
- 节点.js的LTS版本
- Safari,Chrome,Edge,和Firefox的最新版本.
看我们的 支助政策 更多细节.
先决条件
安装软件包
为JavaScript安装Azure存储数据湖客户端库的首选方法是使用npm包管理器. 键入下列终端窗口:
npm install @azure/storage-file-datalake
认证客户端
Azure存储器支持几种认证方法. 为了与Azure Data Lake存储服务互动,您需要创建存储客户端实例- DataLakeServiceClient, (中文(简体) ), DataLakeFileSystemClient,或 DataLakePathClient 举个例子 见 用于创建 DataLakeServiceClient 学习更多关于认证.
Azure 活动目录
Azure Data Lake存储服务支持使用Azure Active Directory来验证其API的请求. 这个 @azure/identity 软件包提供了各种证书类型,应用程序可用来做到这一点。 请看 读取 @azure/identity 需要更多的细节和样本来启动.
兼容性
这个库与Node.js和浏览器兼容,并与LTS Node.js版本(QQ8.16.0)和Chrome,Firefox和Edge等最新版本进行验证.
网络工人
这个库要求某些DOM对象在浏览器中使用时可以全局取用,而网页工人默认不会提供. 您需要多填这些, 才能让这个图书馆在网络工作人员中工作 .
详情请参见我们 在网络工人中使用Azure SDK的文档
此库依赖于在网络工人使用时需要加载外部多填充的 DOM API :
节点J和浏览器之间的差异
节点(Node.js)和浏览器运行时间有差异. 启动此库时, 请注意 API 或 标有 "绝对是无处可逃" 或者说 "绝对是活在丛生"。 。 。 .
- 如果一个文件持有压缩数据
gzip或者说deflate格式及其内容编码相应设定,下载行为在Node.js和浏览器之间有所不同. 在Node.js存储客户端会以压缩格式下载文件,而浏览器中的数据则会以去压缩格式下载.
特性、界面、类或函数仅可用于节点.js
- 基于账户名称和账户密钥的共享密钥授权
StorageSharedKeyCredential
- 共享访问签名( SAS) 生成
generateAccountSASQueryParameters()generateDataLakeSASQueryParameters()
- 平行上传和下载. 请注意:
DataLakeFileClient.upload()可在Node.js和浏览器中找到.DataLakeFileClient.uploadFile()DataLakeFileClient.uploadStream()DataLakeFileClient.readToBuffer()DataLakeFileClient.readToFile()
特性、 界面、 类别或函数仅可用于浏览器
- 不详
Java 脚本套装
要在浏览器中使用此客户端库,首先需要使用捆绑器. 关于如何做到这一点的详情,请参见我们 捆绑文件。 。 。 .
(简体中文)
你需要设置 跨欧林资源共享 用于浏览器的存储账户规则。 到 Azure 门户网站和 Azure 存储探索器, 找到您的存储账户, 为 blob/ queue/ file/ table 服务创建新的 CORS 规则 .
例如,您可以按照 CORS 设置创建调试程序。 但请根据生产环境的要求,精心定制设置.
- 允许来源: *
- 允许动词: DELETE, GET, HEAD, MERGE, POST, OPTIONS, PUT
- 允许的标题 : *
- 已曝光标题 : *
- 最大年龄(秒):86400
通知:数据 Lake目前共享 CORS 设置用于 blob 服务 .
关键概念
Azure Data Lake 存储 Gen2设计为:
- 在维持数百千兆吨的吞吐量的同时, 提供多个字节的信息
- 允许您轻松管理大量数据
DataLake 存储 Gen2 的关键特性包括:
- Hadoop 兼容访问
- POSIX 权限的超级集
- 低成本储存能力和交易的成本效益
- 大数据分析优化驱动程序
数据湖存储Gen2的一个基本部分是在Blob存储中添加了分级命名空间. 分级命名空间将对象/文件组织成目录的分级,以便高效地访问数据.
过去,以云为基础的分析不得不在业绩、管理和安全领域作出妥协。 Data Lake Survey Gen2 以下列方式处理所有这些方面:
- 性能被优化,因为不需要复制或转换数据作为分析的先决条件. 分级命名空间大大提高了目录管理业务的性能,提高了整体的工作性能.
- 管理比较容易,因为可以通过目录和子目录来组织和操纵文件.
- 安全是可执行的,因为可以在目录或个人文件中定义POSIX权限.
- 由于在低成本的Azure Blob存储之上建造了Data Lake存储Gen2,使得成本效益成为可能. 附加的特征进一步降低了Azure上运行大数据分析的总所有权成本.
数据 湖库提供三种资源:
- 这个 存储账户 通过
DataLakeServiceClient - A 类 文件系统 通过使用的存储账户中
DataLakeFileSystemClient - A 类 路径 在通过的文件系统中
DataLakeDirectoryClient或者说DataLakeFileClient
| Azure 数据湖 Gen2 | 块 |
|---|---|
| 文件系统 | 集装箱 |
| 路径( 文件或目录) | 块 |
说明: 这个客户端库只支持带有等级命名空间(HNS)启用的存储账户.
实例
- 导入软件包
- 创建数据湖服务客户端
- 创建新文件系统
- 列出文件系统
- 创建并删除目录
- 创建文件
- 列出文件系统中的路径
- 下载一个文件并将其转换为字符串( Node.js)
- 下载一个文件并转换为字符串( 浏览器)
导入软件包
要使用客户端, 请导入软件包到您的文件中 :
import * as AzureStorageDataLake from "@azure/storage-file-datalake";
或者,有选择地仅导入所需的类型:
import { DataLakeServiceClient, StorageSharedKeyCredential } from "@azure/storage-file-datalake";
创建数据湖服务客户端
这个 DataLakeServiceClient 需要数据湖服务的URL和访问证书。 也可以选择接受 options 参数.
与 DefaultAzureCredential 从 @azure/identity 软件包
建议的即兴演奏方式a DataLakeServiceClient
通知,长官 Azure 数据 Lake目前在AAD OAuth认证之后重复使用"Storage Blob Data Owide"等与blob相关的角色.
设置: 引用 - 授权从客户端应用程序中访问 blobs( 数据湖) 和与 Azure Active 目录的队列 - https://learn.microsoft.com/azure/storage/common/storage-auth-aad-app 互联网档案馆的存檔,存档日期2013-12-22
-
注册一个新的 AAD 应用程序,并授权代表已签名的用户访问 Azure 存储 .
- 在 Azure 活动目录( azure-portal) 中注册新的应用程序 - https://learn.microsoft.com/azure/活出-指导/develop/quickstart-register-app. 互联网档案馆的存檔,存档日期2013-12-21
- 在那个
API permissions区域,选择Add a permission选择Microsoft APIs。 。 。 . - 选择
Azure Storage并选择旁边的复选框user_impersonation然后单击Add permissions。这将使应用程序能够代表登录用户访问Azure存储器.
-
与RBAC在Azure门户网站上访问Azure Data Lake数据的许可
- 非洲区域局在blobs(数据湖)和队列中的作用 - https://learn.microsoft.com/azure/storage/common/storage-auth-aad-rbac-portal 互联网档案馆的存檔,存档日期2013-12-21。 。 。 .
- 在Azure门户网站,去你的存储账户 并分配 存储 Blob 数据贡献器 角色到注册的 AAD 应用程序
Access control (IAM)选项卡(在azure-portal中您存储账户的左侧导航栏).
-
样本的环境设置
- 从您的 AAD 应用程序的概览页面中,请注意
CLIENT ID财务报告和审定财务报表TENANT ID。在“证书和机密”标签中,创建一个机密,并将此记下. - 请确定您有 AZURE TENANT ID, AZURE CLIENT ID, AZURE CLIENT SECRET 作为环境变量来成功执行样本(可以杠杆进程.env).
- 从您的 AAD 应用程序的概览页面中,请注意
import { DefaultAzureCredential } from "@azure/identity";
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
// Enter your storage account name
const account = "<account>";
const defaultAzureCredential = new DefaultAzureCredential();
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
defaultAzureCredential,
);
见 Azure AD Auth 样本 对于使用这种方法的完整示例.
[注 -- -- 以上步骤只针对节点.js]
使用连接字符串
或者,你可以即时 DataLakeServiceClient 使用 fromConnectionString() 以全连接字符串作为参数的静态方法。 (连接字符串可以从Azure门户网站获得
[完全可以在 代码.JS运行]
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
const connectionString = "<connection string>";
const dataLakeServiceClient = DataLakeServiceClient.fromConnectionString(connectionString);
与 StorageSharedKeyCredential
或者,你即兴表演 DataLakeServiceClient 带有 StorageSharedKeyCredential 以传递账户名称和账户键作为参数。 (账户名称和账户钥匙可从Azure门户网站获取. )
[完全可以在 代码.JS运行]
import { StorageSharedKeyCredential, DataLakeServiceClient } from "@azure/storage-file-datalake";
// Enter your storage account name and shared key
const account = "<account>";
const accountKey = "<accountkey>";
// Use StorageSharedKeyCredential with storage account and account key
// StorageSharedKeyCredential is only available in Node.js runtime, not in browsers
const sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey);
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
sharedKeyCredential,
);
与 SAS Token 连接
还有... 你可以即兴表演 DataLakeServiceClient 带有共享访问签名(SAS). 您可以从 Azure 端口获得 SAS 令牌或使用 generateAccountSASQueryParameters()。 。 。 .
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
const account = "<account name>";
const sas = "<service Shared Access Signature Token>";
const serviceClientWithSAS = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net${sas}`,
);
创建新文件系统
使用 DataLakeServiceClient.getFileSystemClient() 然后创建新的文件系统资源.
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
// Create a file system
const fileSystemName = `newfilesystem${new Date().getTime()}`;
const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);
const createResponse = await fileSystemClient.create();
console.log(`Create file system ${fileSystemName} successfully`, createResponse.requestId);
列出文件系统
使用 DataLakeServiceClient.listFileSystems() 函数可以对文件系统进行迁移,
与新的 for-await-of 语法 :
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
let i = 1;
const fileSystems = datalakeServiceClient.listFileSystems();
for await (const fileSystem of fileSystems) {
console.log(`File system ${i++}: ${fileSystem.name}`);
}
或者不使用 for-await-of数字 :
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
let i = 1;
const fileSystems = datalakeServiceClient.listFileSystems();
let { value, done } = await fileSystems.next();
while (!done) {
console.log(`File system ${i++}: ${value.name}`);
({ value, done } = await fileSystems.next());
}
此外,还支持通过Pagination将它列入清单 byPage()数字 :
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
let i = 1;
for await (const response of datalakeServiceClient.listFileSystems().byPage({ maxPageSize: 20 })) {
if (response.fileSystemItems) {
for (const fileSystem of response.fileSystemItems) {
console.log(`File System ${i++}: ${fileSystem.name}`);
}
}
}
创建并删除目录
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
const fileSystemName = "<file system name>";
const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);
const directoryClient = fileSystemClient.getDirectoryClient("directory");
await directoryClient.create();
await directoryClient.delete();
创建文件
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
const fileSystemName = "<file system name>";
const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);
const content = "Hello world!";
const fileName = `newfile${+new Date()}`;
const fileClient = fileSystemClient.getFileClient(fileName);
await fileClient.create();
await fileClient.append(content, 0, content.length);
await fileClient.flush(content.length);
console.log(`Create and upload file ${fileName} successfully`);
列出文件系统中的路径
类似于列出文件系统.
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
const fileSystemName = "<file system name>";
const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);
let i = 1;
const paths = fileSystemClient.listPaths();
for await (const path of paths) {
console.log(`Path ${i++}: ${path.name}, is directory: ${path.isDirectory}`);
}
下载一个文件并将其转换为字符串( Node.js)
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
import { DefaultAzureCredential } from "@azure/identity";
import { buffer } from "node:stream/consumers";
const account = "<account>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net`,
new DefaultAzureCredential(),
);
const fileSystemName = "<file system name>";
const fileName = "<file name>";
const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);
const fileClient = fileSystemClient.getFileClient(fileName);
// Get file content from position 0 to the end
// In Node.js, get downloaded data by accessing downloadResponse.readableStreamBody
const downloadResponse = await fileClient.read();
if (downloadResponse.readableStreamBody) {
// Download the raw bytes of the file. Use `text` from "node:stream/consumers"
// instead if you want to read the content as a string directly.
const downloaded = await buffer(downloadResponse.readableStreamBody);
console.log("Downloaded file content:", downloaded.toString());
}
下载一个文件并转换为字符串( 浏览器)
import { DataLakeServiceClient } from "@azure/storage-file-datalake";
const account = "<account>";
const sas = "<sas token>";
const datalakeServiceClient = new DataLakeServiceClient(
`https://${account}.dfs.core.windows.net${sas}`,
);
const fileSystemName = "<file system name>";
const fileName = "<file name>";
const fileSystemClient = datalakeServiceClient.getFileSystemClient(fileSystemName);
const fileClient = fileSystemClient.getFileClient(fileName);
// Get file content from position 0 to the end
// In browsers, get downloaded data by accessing downloadResponse.contentAsBlob
const downloadResponse = await fileClient.read();
if (downloadResponse.contentAsBlob) {
const blob = await downloadResponse.contentAsBlob;
const downloaded = await blob.text();
console.log(`Downloaded file content ${downloaded}`);
}
解决问题
允许伐木可能有助于发现有关失败的有用信息。 为了查看 HTTP 请求和回复的日志,设置 AZURE_LOG_LEVEL 环境变量改为 info。或者,可以在运行时拨打 setLogLevel 输入 @azure/logger数字 :
import { setLogLevel } from "@azure/logger";
setLogLevel("info");
今后的步骤
更多代码样本 :
捐款
如果您想为图书馆捐钱 请读一下 贡献指南 学习如何构建和测试密码.