社区案例 | 如何在大数据/机器学习语言 MLSQL 中集成 JuiceFS

2021-03-09
RespectM

MLSQL 是一个开源项目,是一种大数据/机器学习语言,语法类似 SQL,计算内核是 Spark,内嵌了 Python 计算引擎和 Spark 交互,用大家熟悉的 SQL 提供出强大的机器学习能力,在大数据和 AI 领域有着广泛的用户。

JuiceFS 是一个开源的分布式 POSIX 文件系统,采用云原生架构设计,通过对 POSIX 和 HDFS 接口的完全兼容,可以完美将大数据和 AI 场景的 Data Pipeline 结合在一起。

今天分享的这篇文章来自 MLSQL 社区贡献者 RespectM,他在 JuiceFS 发布后的第一时间里就完成了 MLSQL 与 JuiceFS 的集成、测试工作,并将详细的教程分享给大家。

通过集成 JuiceFS,可以为 MLSQL 在云原生环境下提供更方便使用、更高性能表现的存储选择。

JuiceFS 分为商业版本和社区版本(使用场景请访问官网),有一些差别,这篇文章讲解社区版 JuiceFS 如何使用,以及 MLSQL 如何与 JuiceFS 集成。社区版需要自行从源码编译。编译 JuiceFS 和 SDK。要求编译环境与运行环境一致,SDK 是这样的,笔者用 Mac 编译,然后放在 Linux 跑会报类库的错。为了方便,笔者在 Linux 上构建了一个 go1.15+java1.8+maven3.3.9 的编译环境(JuiceFS 要求 Go 版本 1.14+,jdk1.8+),备注:本测试只是一个测试 Demo。

  • Github地址:https://github.com/juicedata/juicefs(0.10.0)
  • 文档地址:https://juicefs.com/docs/zh/community/introduction/

构建 Go 环境:

docker run -it --name go1.15 -v /opt/local/:/juicefs golang:1.15 /bin/bash

把 JDK 的包和 mvn 的包放到 /opt/local 下(因为笔者 Linux 环境的 JDK 和 mvn 的包就在 /opt/local 下),然后配置环境变量。这样一个 JuiceFS 的编译环境就建好了。

编译JuiceFS:

$ git clone https://github.com/juicedata/juicefs.git
$ cd juicefs
$ make

# make报错:
# go: cloud.google.com/[email protected]: Get "https://proxy.golang.org/cloud.google.com/go/@v/v0.39.0.mod": dial tcp 172.217.160.81:443: i/o timeout
# make执行前先执行:
$ export GOPROXY=https://goproxy.io
# 在当前目录生成JuiceFs客户端可执行文件:juicefs

编译 SDK(官方建议用 SDK 方式访问 JuiceFS):

$ cd juicefs/sdk/java
$ make

# 生成jar位置:sdk/java/target/juicefs-hadoop-0.10.0.jar

JuiceFS 用 Redis 存储元数据,要求版本>=2.2,下面用 Docker 快速构建一个 Redis:

$ cat docker-compose.yml 
version: '2'
services:
    redis:
      image: redis:5.0.0
      container_name: redis
      command: redis-server --requirepass 123456
      ports:
        - "16379:6379"
      volumes:
        - ./data:/data

$ docker-compose up -d

JuiceFS 可以 format 多个 volume,通过指定不同的 Redis 库。现在以 Redis 库2,format 一个 HDFS volume:

$ ./juicefs format --storage hdfs --bucket  172.16.2.119:8020 redis://:[email protected]:16379/2 mhdfs

#会在hdfs根目录创建/mhdfs目录

如何让 HDFS shell支持JuiceFS 呢,很简单,把 juicefs-hadoop-0.10.0.jar 放到 HDFS 安装包的 lib 下,然后在 conf/core-site.xml 中增加如下配置:

<property>
  <name>juicefs.test.meta</name>
  <value>redis://:[email protected]:16379/2</value>
</property>
<property>
  <name>fs.jfs.impl</name>
  <value>io.juicefs.JuiceFileSystem</value>
</property>
<property>
  <name>fs.AbstractFileSystem.jfs.impl</name>
  <value>io.juicefs.JuiceFS</value>
</property>
<property>
  <name>juicefs.cache-dir</name>
  <value>/tmp/juicefs/jfs</value>
</property>
<property>
  <name>juicefs.cache-size</name>
  <value>1024</value>
</property>
<property>
  <name>juicefs.access-log</name>
  <value>/tmp/juicefs/juicefs.access.log</value>
</property>

# juicefs.test.meta中的test为JuiceFs的文件系统的名字,HDFS可以通过jfs://test访问这个文件系统。

不需要重启 HDFS,来做个测试:

$ echo 'hello,word' > hw
$ hadoop fs -put hw jfs://test/

# 可以看到JuiceFs文件系统会生成文件
$ hadoop fs -ls /mhdfs/chunks/0/0
Found 1 items
-rwxr-xr-x   3 hdfs hdfs         12 2021-03-01 19:11 /mhdfs/chunks/0/0/26_0_11

$ hadoop fs -cat jfs://test/hw
2021/03/01 19:12:27.082513 juicefs[30813] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly.
hello,word

那如何通过 MLSQL 使用呢,也很简单,把 HDFS conf 下的 core-site.xml 文件拷贝到 Spark conf 下,然后启动脚本的 --jars 后面增加 juicefs-hadoop-0.10.0.jar,启动MLSQL:

load csv.`jfs://test/hw` as t;
save overwrite t as json.`jfs://test/whw`;
load json.`jfs://test/whw` as t1;

-----------------
_c0    |  _c1
hello  |  word

JuiceFS 是一个虚拟文件系统,可以挂载到多台机器,下面把这个 mhdfs 文件系统挂载到本地,就可以像操作本地文件一样操作 HDFS 文件:

$ ./juicefs mount -d redis://:[email protected]:16379/2 ~/jfsh

$ ls ~/jfsh
hw  whw

$ cat ~/jfsh/whw/*
{"_c0":"hello","_c1":"word"}

源码地址:https://github.com/latincross/mlsqlwechat

最新博客

一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

2024-07-26
本文将详细解析这些策略的工作原理,并分享我们在特定场景下的测试结果,以便读者深入理解 JuiceFS 的性能优势及一些相关的限制,从而更有效地应用于各种使用场景。

MemVerge:小文件写入性能 5 倍于 S3FS,JuiceFS 加速生信研究

2024-07-24
在详细评估了 NFS、S3FS、EFS 和 FusionFS 等多种存储解决方案之后,MemVerge 最终选择了 JuiceFS。JuiceFS 不仅确保了高性能的共享存储解决方案,特别是在处理大…

JuiceFS 直连 NFS 新功能介绍,赋能 NAS 进行 AI 训练

2024-07-19
JuiceFS v1.2.0 版本新增的直连 NFS 存储功能,让 JuiceFS 可以更好的与 NAS 配合使用,提升了 JuiceFS 对 NFS 的兼容性,同时也为企业提供了更简易的存储解决方…

SeaweedFS + TiKV 部署保姆级教程

2024-07-12
在使用 JuiceFS 时,我们选择了 SeaweedFS 作为对象存储,以及 TiKV 作为元数据存储,目前在 SeaweedFS 上已经存储了近1.5PB 的数据。本文将为社区各位用户提供我们的…