1 简介
前期我们介绍了ozone的基本概念以及Raft的实现、K8S上的部署。这期我们介绍下如何用hadoop的java、python api及命令行去使用ozone。
ozone作为对象存储,它的出现主要是为了解决HDFS的扩展性问题。出于成本考虑,hdfs之前庞大的用户群体中,有的人并不希望改变其原有的用法。其实从ozone设计之初社区就已经考虑该问题,并实现了Ozone FileSystem兼容了hdfs的api。将集群中的hdfs替换成ozone之后用户的应用程序及用法习惯几乎可以不改变。本文主要介绍以下两部分内容:
- Java客户端及shell基于o3fs的配置和使用
- python客户端(pyarrow)的配置和使用
- 社区关于OzoneFS的最新动态
本文使用的各组件版本为:
hadoop-2.7.5(hadoop3.0以上配置有所不同)
ozone-0.5.0
pyarrow-0.15.1
2 Java客户端及shell基于o3fs的配置和使用
2.1 ozone o3fs的配置
ozone的安装部署这里不做单独介绍(可参考官方部署文档)。ozone目前是将hdfs的fs.defaultFS挂载到某个bucket下,该bucket即为用户的根目录。所以首先我们要在ozone中创建对应的volume和bucket。
ozone sh volume create /volume ozone sh bucket create /volume/bucket
然后在原先hadoop项目或客户端的core-site.xml中添加如下内容,将hdfs的文件系统换成o3fs。注意此时需要把ozone-site.xml拷贝至你的项目或者客户端中。
fs.o3fs.impl org.apache.hadoop.fs.ozone.BasicOzoneFileSystem fs.defaultFS o3fs://bucket.volume
需要注意的是各hadoop版本对应的o3fs impl不同,具体对应关系可参考下表:
Hadoop version | OzoneFileSystem implementation |
---|---|
3.2 | org.apache.hadoop.fs.ozone.OzoneFileSystem |
3.1 | org.apache.hadoop.fs.ozone.OzoneFileSystem |
2.9 | org.apache.hadoop.fs.ozone.BasicOzoneFileSystem |
2.7 | org.apache.hadoop.fs.ozone.BasicOzoneFileSystem |
最后需要将依赖的ozone-filessystem.jar文件添加到classpath中:
export HADOOP_CLASSPATH=$OZONE_HOME/share/ozone/lib/hadoop-ozone-filesystem-lib-legacy-$OZONE_VERSION.jar:$OZONE_HOME/share/ozone/lib/hadoop-ozone-datanode-$OZONE_VERSION.jar:$HADOOP_CLASSPATH
2.2 ozone o3fs的使用
配置完成后即可用过原生的hdfs命令及api访问ozone。例如用shell访问如下:
hdfs dfs -ls o3fs://bucket.volume/hdfs dfs -mkdir o3fs://bucket.volume/test
使用api访问时行为也不需要发生改变(可以将配置文件放入工程,或者在代码中手动set对应配置),实例代码操作如下
Configuration conf = new Configuration();//conf.set需要的配置FileSystem fs = FileSystem.get( conf);fs.createNewFile(new Path("o3fs://bucket.volume/test"));
3 python客户端(pyarrow)的配置和使用
3.1 pyarrow部署及配置
pyarrow中使用于python封装了一套操作hdfs的接口,该接口通过调用libhdfs3(使用C实现),而libhdfs3又是通过调用hdfs/ozone FileSystem的java接口实现。因此在部署pyarrow时同样需要配置部署o3fs。整个部署过程与前面2.1 ozone o3fs的配置一致。配置完成后可直接pip安装pyarrow。
pip install pyarrow
3.2 pyarrow示例代
如下示例保存后直接执行python test.py即可,更多pyarrow的接口介绍及用法可以参考文末参考[1].
//test.pyimport pyarrow as paimport pyarrow.parquet as pqfs = pa.hdfs.connect(host='o3fs://bucket.volume', port={your_port}, user={username})rootpath='/'print(fs.ls(rootpath))
4 社区关于OzoneFS的最新动态
目前通过o3fs访问ozone同一时间只能指定一个bucket。如果需要访问其他bucket,则需要手动修改fs.defaultFS中的bucket。当前ozone社区正在实现新的ofs接口(HDDS-2665,当前整体进度60%左右),主要目的是允许用户同时访问到所有的bucket。
欢迎阅读其他Ozone系列文章
Hadoop原生对象存储Ozone
聊一聊Ozone如何高效利用Raft机制
Ozone on K8S
参考
[1]http://arrow.apache.org/docs/python/filesystems_deprecated.html#hdfs-api
[2]https://issues.apache.org/jira/browse/HDDS-2665
[3]https://issues.apache.org/jira/browse/HDDS-2443
[4]https://hadoop.apache.org/ozone/docs/0.4.0-alpha/ozonefs.html
欢迎关注“数据湖技术”公众号,更多精彩待续!