说明
个人理解JuiceFS的定位是一个建立在S3, OSS 等存储系统之上的一个抽象文件系统。因为使用Redis来做文件的元数据管理,所以减少了远程调用 S3, OSS API的开销;内部有对数据的Cache功能,所以当重复访问数据时,速度也会得到明显提升。
JuiceFS作为虚拟文件系统层,底层文件是自己管理的,其定位不是其他文件存储系统的读写Proxy。
Juicefs编译
Juice编译设计到的go,java,maven等组件,而且go的编译还需要在对应的平台上进行编译,才能使用,所以参考大佬的做法,使用基础软件 + Go Docker 镜像的方式进行编译。
首先准备好,编译需要的绿色版Java,Maven以及对应的juicefs代码
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
tar -zxvf jdk-8u141-linux-x64.tar.gz
/Users/wankun/Applications/jdk1.8.0_141
使用docker镜像编译,注意,golang的镜像版本最高只能用1.15, 使用1.16 会报一些包找不到的错
# 启动docker golang镜像
docker run -it \
-v /Users/wankun/Applications/jdk1.8.0_141:/java8 \
-v /Users/wankun/Applications/maven:/maven \
-v /Users/wankun/.m2:/root/.m2 \
-v /Users/wankun/ws/wankun/juicefs-0.11.0:/root/juicefs \
--env JAVA_HOME=/java8 \
--env PATH=/java8/bin:/maven/bin:/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
golang:1.15.2 /bin/bash
# 编译juicefs
export GOPROXY=https://goproxy.io
make
# 编译hadoop SDK
$ cd sdk/java
$ make
启动 Redis 服务来管理JuiceFS元数据
- 20210330 当前redis版本更新也比较快,所以直接使用了redis的latest version
- redis取消IP bind,改为密码连接校验,参考这里
- docker镜像启动后很奇怪,默认的6379端口无法外部连接,所以使用了26379端口对外提供服务
redis.conf 中相关配置更改
appendonly yes
# bind -- 注释掉bind,改为密码校验
requirepass xxxx
将OSS存储挂载为本地目录读写
Juice通过reformat来初始化底层存储系统,然后将该存储系统挂载到本地,就可以通过JuiceFS 的虚拟文件系统来管理文件了。
# 注意 这里bucket参数实际上是 https://[bucket].[endpoint] 格式, 最后一个参数是该bucket下的目录名; redis的连接地址如果需要密码的话,注意把密码补上
./juicefs format \
--storage oss \
--bucket https://[bucket].[endpoint] \
--access-key [ACC_KEY] \
--secret-key [SEC_KEY] \
redis://:{PASSWORD}@{HOST}:26379/0 \
test-wankun
# 挂载juicefs到本地目录
./juicefs mount -d redis://:{PASSWORD}@{HOST}:26379/0 ~/test-wankun
Hadoop 访问 JuiceFS 存储
将前面的hadoop SDK 放到Hadoop的lib目录( /opt/cloudera/parcels/CDH/lib/hadoop/lib/juicefs-hadoop-0.11.0.jar
),然后修改hadoop配置文件,使hadoop支持对juiceFS的访问。
注意: 官方文档中的 juicefs.accesskey
和 juicefs.secretkey
可以无需配置
<xml>
<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.meta</name>
<value>redis://{PASSWORD}:{HOST}:{PORT}/{DB}</value>
</property>
<property>
<name>juicefs.cache-dir</name>
<value>/data*/jfs</value>
</property>
<property>
<name>juicefs.cache-size</name>
<value>1024</value>
</property>
<property>
<name>juicefs.access-log</name>
<value>/tmp/juicefs.access.log</value>
</property>
</xml>