Ozone实践|如何用Hadoop的用法来玩转Ozone

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.py

import pyarrow as pa

import pyarrow.parquet as pq


fs = 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
欢迎关注“数据湖技术”公众号,更多精彩待续!