对接Hadoop

CubeFS兼容Hadoop FileSystem接口协议,用户可以使用CubeFS来替换Hadoop 文件系统( HDFS )。

本章描述了 CubeFS在 Hadoop 存储生态的安装和配置过程。

依赖项

注意

当前CubeFS Hadoop不支持HDFS的文件权限管理

编译资源包

编译libcfs.so

git clone https://github.com/cubefs/cubefs.git
cd cubefs
make libsdk

注意

由于编译的包依赖 glibc,因此需要编译环境和运行环境的glibc版本一致

编译cfs-hadoop.jar

git clone https://github.com/cubefs/cubefs-hadoop.git
mvn package -Dmaven.test.skip=true

安装

以上依赖包必须安装到 Hadoop 集群的各节点、且必须能从 CLASSPATH 里找到。

Hadoop 集群内的各参与节点都必须安装原生 CubeFS Hadoop客户端。

资源包名称安装路径
cfs-hadoop.jar$HADOOP_HOME/share/hadoop/common/lib
jna-5.4.0.jar$HADOOP_HOME/share/hadoop/common/lib
libcfs.so$HADOOP_HOME/lib/native

修改配置

正确放置上述资源包之后,需要对core-site.xml配置文件进行简单修改,其路径为:$HADOOP_HOME/etc/hadoop/core-site.xml

core-site.xml中添加以下配置内容:

<property>
	<name>fs.cfs.impl</name>
	<value>io.cubefs.CubefsFileSystem</value>
</property>

<property>
	<name>cfs.master.address</name>
	<value>your.master.address[ip:port,ip:port,ip:port]</value>
</property>

<property>
	<name>cfs.log.dir</name>   
	<value>your.log.dir[/tmp/cfs-access-log]</value>
</property>

<property>
	<name>cfs.log.level</name> 
	<value>INFO</value>
</property>

<property>
    <name>cfs.access.key</name>
    <value>your.access.key</value>
</property>

<property>
    <name>cfs.secret.key</name>
    <value>your.secret.key</value>
</property>

<property>
    <name>cfs.min.buffersize</name>
    <value>67108864</value>
</property>
<property>
    <name>cfs.min.read.buffersize</name>
    <value>4194304</value>
</property>
<property>

配置参数说明:

PropertyValueNotes
fs.cfs.implio.cubefs.CubefsFileSystem指定scheme为cfs://的存储实现类
cfs.master.addressCubeFS master地址,可以是ip+port格式,ip:port,ip:port,ip:port,也可以是域名
cfs.log.dir/tmp/cfs-access-log日志路径
cfs.log.levelINFO日志级别
cfs.access.keyCubeFS 文件系统的所属用户的 accessKey
cfs.secret.keyCubeFS 文件系统的所属用户的 secretKey
cfs.min.buffersize8MB写缓存区大小,对于副本卷按默认值就行,EC卷建议64MB
cfs.min.read.buffersize128KB读缓冲区大小,对于副本卷按默认值就行,EC卷建议4MB

环境验证

配置完成后,可以通过ls命令简单验证配置是否成功:

hadoop fs -ls cfs://volumename/

没有错误信息既表示成功

其他大数据组件配置

  • Hive的场景:在yarn集群的所有nodemanager,hive server, metastore进行拷贝jar包和修改配置的动作
  • Spark的场景:在Spark计算集群的所有执行节点(Yarn nodemanager)以及Spark客户端进行拷贝jar包和修改配置的动作;
  • Presto的场景:在Presto的所有worker节点和Coordinator节点进行拷贝jar包和修改配置的动作;
  • Flink的场景: 在Flink的所有JobManager节点进行拷贝jar包和修改配置的动作;

HDFS Shell、YARN、Hive

cp cfs-hadoop.jar $HADOOP_HOME/share/hadoop/common/lib
cp jna-5.4.0 $HADOOP_HOME/share/hadoop/common/lib 
cp libcfs.so $HADOOP_HOME/lib/native

提示

hive server, hive metastore, presto worker和Coordinator配置变更后需要服务端进行服务进程重启后才能生效

Spark

cp cfs-hadoop.jar $SPARK_HOME/jars/ 
cp libcfs.so $SPARK_HOME/jars/ 
cp jna-5.4.0 $SPARK_HOME/jars/

Presto/Trino

cp cfs-hadoop.jar $PRESTO_HOME/plugin/hive-hadoop2 
cp libcfs.so $PRESTO_HOME/plugin/hive-hadoop2 
cp jna-5.4.0.jar $PRESTO_HOME/plugin/hive-hadoop2 

ln -s $PRESTO_HOME/plugin/hive-hadoop2/libcfs.so /usr/lib
sudo ldconfig
cp cfs-hadoop.jar $FLINK_HOME/lib 
cp jna-5.4.0.jar $FLINK_HOME/lib 
cp libcfs.so $FLINK_HOME/lib
ln -s $FLINK_HOME/lib/libcfs.so /usr/lib
sudo ldconfig

Iceberg

cp cfs-hadoop.jar $TRINO_HOME/plugin/iceberg 
cp jna-5.4.0.jar $TRINO_HOME/plugin/iceberg

常见问题

部署之后最常见的问题在于缺包,缺包问题对照安装步骤检查资源包是否拷贝到对应位置,常见报错信息如下:

缺少cfs-hadoop.jar

java.lang.RuntimeException: java.lang.ClassNotFoundException: Class io.cubefs.CubeFSFileSystem not found 
 at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2349)   
 at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2790)   
 at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2810)    
 at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:98)   
 at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2853)  
 at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2835)   
 at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:387)

缺少libcfs.so

Suppressed: java.lang.UnsatisfiedLinkError: libcfs.so: cannot open shared object file: 
No such file or directory    
at com.sun.jna.Native.open(Native Method)    
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:191)    
... 21 more Suppressed: java.lang.UnsatisfiedLinkError: libcfs.so: 
cannot open shared object file: No such file or directory    
at com.sun.jna.Native.open(Native Method)    
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:204)  
  ... 21 more

缺少jna.jar

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Library   
 at java.lang.ClassLoader.defineClass1(Native Method)   
 at java.lang.ClassLoader.defineClass(ClassLoader.java:763)   
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)   
 at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)   
 at java.net.URLClassLoader.access$100(URLClassLoader.java:74)`

volume name is required

volume名称不能包含“_”划线

在github上编辑