fsspec-bosfs
更新时间:2025-04-07
概述
fsspec-bosfs (以下简称 bosfs) 是一个基于 Python 接口的文件系统实现,用以便捷访问百度云对象存储 BOS 服务。通过 bosfs,用户可以使用标准的 fsspec 接口操作存储于 BOS 中的数据。
安装
使用 pip 安装 pyftpdlib
$ pip install bosfs
查看是否安装成功
$ pip show bosfs
快速开始
配置访问凭证
两种方式,优先级如下:
-
初始化 BOSFileSystem 时通过参数指定
Shell1import bosfs 2fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='{your ak}', secret_key='{your sk}', sts_token=None)
-
配置环境变量
Shell1export BCE_ACCESS_KEY_ID=xxx 2export BCE_SECRET_ACCESS_KEY=xxx 3export BOS_ENDPOINT=xxx
示例:基本读写
-
通过 bosfs 列举 BOS 上的数据
Shell1import bosfs 2fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='xxx', secret_key='xxx') 3res = fs.ls('/mybucket/') 4print(res)
-
通过 bosfs 读取 BOS 上的数据
Shell1import bosfs 2 3fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='xxx', secret_key='xxx') 4with fs.open('/mybucket/README.md') as f: 5 print(f.readline())
-
通过 bosfs 写入数据到 BOS
Shell1import bosfs 2import os 3 4fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='xxx', secret_key='xxx') 5object_name = "file1" 6data = os.urandom(10 * 2**20) 7with bosfs.open(object_name, "wb") as f_wb: 8 f_wb.write(data)
更多使用方法可参考 fsspec 文档。
示例:Ray
Ray是一个分布式的Python开源库,能帮助用户将自己的程序快速分布式化。在Ray之上运行的PyTorch、TensorFlow等训练器可以利用Ray的特性,在异构集群上做数据预处理、分布式训练,还可以使用Ray Data并行化进行数据加载、预处理和训练。
在Ray上,通过fsspec接口可以直接访问bos上的数据并解析。
- 生成两个csv文件,上传到bos
Csv
1Name,Age,Gender,Grade
2Alice,14,F,88
3Bob,15,M,92
4Charlie,14,M,85
5David,15,M,90
6Eva,14,F,95
Csv
1Name,Age,Gender,Grade
2Fiona,15,F,89
3George,14,M,87
4Hannah,15,F,91
5Ian,14,M,84
6Julia,15,F,93
- 使用ray.data去取csv文件
Python
1import bosfs
2import ray
3import pyarrow
4from pyarrow._fs import PyFileSystem
5
6fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='xxx', secret_key='xxx')
7
8# 读取mybucket的csv_dir/目录下的多个csv文件
9ds = ray.data.read_csv(paths="bos://mybucket/csv_dir/", filesystem=fs)
10
11# 输出数据集的schema
12print(ds.schema())
13
14# 输出数据集的记录数
15print(ds.count())
16
17# 输出前3行
18ds.show(3)
- 输出
Shell
12025-04-03 21:43:28,551 INFO worker.py:1752 -- Started a local Ray instance.
2Column Type
3------ ----
4Name string
5Age int64
6Gender string
7Grade int64
810
9'Name': 'Alice', 'Age': 14, 'Gender': 'F', 'Grade': 88}
10{'Name': 'Bob', 'Age': 15, 'Gender': 'M', 'Grade': 92}
11{'Name': 'Charlie', 'Age': 14, 'Gender': 'M', 'Grade': 85}
示例:PyArrow
PyArrow是Apache Arrow库的一个python实现,通过提供高性能的内存列存储格式,可以让应用程序和数据无缝连接。 它实现了不同数据处理系统之间的高效数据交换。 通过将其存储接口委托给fsspec,PyArrow可以通过统一的接口访问各种存储后端。
当然,PyArrow也可以通过bosfs来便捷地访问BOS。
示例1:
Python
1import bosfs
2import pyarrow
3from pyarrow._fs import PyFileSystem
4import pyarrow.dataset as ads
5
6fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='xxx', secret_key='xxx')
7
8# 读取mybucket的student.parquet文件
9ds = ads.dataset("bos://mybucket/student.parquet", filesystem=fs)
10
11# 输出数据集的schema
12print(ds.schema)
13
14# 输出数据集的记录数
15print(ds.count_rows())
16
17# 输出第一条记录
18print(ds.take([0]))
示例2:
Python
1import bosfs
2import pyarrow
3from pyarrow._fs import PyFileSystem
4from pyarrow.fs import FSSpecHandler
5
6fs = bosfs.BOSFileSystem(endpoint='http://bj.bcebos.com', access_key='xxx', secret_key='xxx')
7
8# 生成一个PyArrow filesystem
9py_fs = PyFileSystem(FSSpecHandler(fs))
10
11# 通过PyArrow filesystem接口读取BOS数据
12with py_fs.open_input_file("bos://mybucket/student.parquet") as f:
13 f.read()
读写性能
测试环境
- 测试机器:16 核 32G 内存, 3Gbps 网络带宽
性能测试结果
单文件顺序读写性能
file_size_mb | write_speed_mbps | read_speed_mbps | write_time_s | read_time_s |
---|---|---|---|---|
1 | 9.672178 | 4.640667 | 0.104893 | 0.216561 |
4 | 24.867180 | 15.987999 | 0.160897 | 0.250713 |
10 | 30.681564 | 30.890233 | 0.343196 | 0.325457 |
128 | 75.634190 | 93.547005 | 1.692568 | 1.369047 |
512 | 80.359467 | 97.840121 | 6.371391 | 5.233074 |
多文件并发读写性能
file_nums | file_size_mb | threads_nums | write_speed_mbps | read_speed_mbps | write_time_s | read_time_s |
---|---|---|---|---|---|---|
1000 | 4 | 16 | 381.91 | 301.56 | 10.47 | 13.26 |
使用限制
- 当前 bosfs 暂不支持 async 模式