一、概述
CosN Schema 和 GooseFS Schema 的映射说明如下:
假设 Namespace warehouse 对应的 UFS 路径为 cosn://examplebucket-1250000000/data/warehouse/,则 CosN 到 GooseFS 的路径映射关系如下:
cosn://examplebucket-1250000000/data/warehouse -> /warehouse/cosn://examplebucket-1250000000/data/warehouse/folder/test.txt ->/warehouse/folder/test.txt
GooseFS 到 CosN 的路径映射关系如下:
/warehouse ->cosn://examplebucket-1250000000/data/warehouse//warehouse/ -> cosn://examplebucket-1250000000/data/warehouse//warehouse/folder/test.txt -> cosn://examplebucket-1250000000/data/warehouse/folder/test.txt
CosN Scheme 访问 GooseFS 特性,通过在客户端维持 GooseFS 路径和底层文件系统 CosN 路径之间的映射关系,并将 CosN 路径的请求转换为 GooseFS 的请求。映射关系周期性刷新,你可以通过修改 GooseFS 配置文件 goosefs-site.properties 中的配置项 goosefs.user.client.namespace.refresh.interval 调整刷新间隔,默认值为60s。
注意:如果访问的 CosN 路径无法转换为 GooseFS 路径,对应的 Hadoop API 调用会抛出异常。
二、操作示例
该示例演示了 Hadoop 命令行以及 Hive 中,如何使用 gfs://、 cosn://、ofs:// 三种 Schema 访问 GooseFS。操作流程如下:
三、1. 准备数据和计算集群
·参考 创建存储桶 文档,创建一个测试用途的存储桶。
·参考 创建文件夹 文档,在存储桶根路径下创建一个名为 ml-100k 的文件夹。
·从 Grouplens 下载 ml-100k 数据集,并将文件 u.user 上传到 <存储桶根路径>/ml-100k下。
·参考 EMR 指引文档,购买一个 EMR 集群并配置 HIVE 组件。
四、2. 环境配置
i. 将 GooseFS 的客户端 jar 包(goosefs-1.0.0-client.jar)放入 share/hadoop/common/lib/ 目录下:
cp goosefs-1.0.0-client.jar hadoop/share/hadoop/common/lib/
注意:配置变更和添加 jar 包,需同步到集群上所有节点。
ii. 修改 Hadoop 配置文件 etc/hadoop/core-site.xml,指定 GooseFS 的实现类:
<property> <name>fs.AbstractFileSystem.gfs.impl</name> <value>com.qcloud.cos.goosefs.hadoop.GooseFileSystem</value></property><property> <name>fs.gfs.impl</name> <value>com.qcloud.cos.goosefs.hadoop.FileSystem</value></property>
iii. 执行如下 Hadoop 命令,检查是否能够通过 gfs:// Scheme 访问 GooseFS,其中 <MASTER_IP> 为 Master 节点的 IP:
hadoop fs -ls gfs://<MASTER_IP>:9200/
iv. 将 GooseFS 的客户端 jar 包放到 Hive 的 auxlib 目录下,使得 Hive 能加载到 GooseFS Client 包:
cp goosefs-1.0.0-client.jar hive/auxlib/
v. 执行如下命令,创建 UFS Scheme 为 CosN 的 Namespace,并列出 Namespace。你可将该命令中的 examplebucket-1250000000 替换为你的 COS 存储桶,SecretId 和 SecretKey 替换为你的密钥信息:
goosefs ns create ml-100k cosn://examplebucket-1250000000/ml-100k –secret fs.cosn.userinfo.secretId=SecretId –secret fs.cosn.userinfo.secretKey=SecretKey–attribute fs.cosn.bucket.region=ap-guangzhou –attribute fs.cosn.credentials.provider=org.apache.hadoop.fs.auth.SimpleCredentialProvidergoosefs ns ls
vi. 执行命令,创建 UFS Scheme 为 OFS 的 Namespace,并列出 Namespace。你可将该命令中的 instance-id 替换为你的 CHDFS 实例,1250000000 替换为你的 APPID:
goosefs ns create ofs-test ofs://instance-id.chdfs.ap-guangzhou.myqcloud.com/ofs-test –attribute fs.ofs.userinfo.appid=1250000000goosefs ns ls
五、3. 创建 GooseFS Schema 表和查询数据
通过如下指令执行:
create database goosefs_test;use goosefs_test;CREATE TABLE u_user_gfs (userid INT,age INT,gender CHAR(1),occupation STRING,zipcode STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '|'STORED AS TEXTFILELOCATION 'gfs://<MASTER_IP>:<MASTER_PORT>/ml-100k';select sum(age) from u_user_gfs;
六、4. 创建 CosN Schema 表和查询数据
通过如下指令执行:
CREATE TABLE u_user_cosn (userid INT,age INT,gender CHAR(1),occupation STRING,zipcode STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '|'STORED AS TEXTFILELOCATION 'cosn://examplebucket-1250000000/ml-100k';select sum(age) from u_user_cosn;
七、5. 修改 CosN 的实现为 GooseFS 的兼容实现
修改 hadoop/etc/hadoop/core-site.xml:
<property> <name>fs.AbstractFileSystem.cosn.impl</name> <value>com.qcloud.cos.goosefs.hadoop.CosN</value></property><property> <name>fs.cosn.impl</name> <value>com.qcloud.cos.goosefs.hadoop.CosNFileSystem</value></property>
执行 Hadoop 命令,如果路径无法转换为 GooseFS 中的路径,命令的输出中会包含报错信息:
hadoop fs -ls cosn://examplebucket-1250000000/ml-100k/Found 1 items-rw-rw-rw- 0 hadoop hadoop 22628 2021-07-02 15:27 cosn://examplebucket-1250000000/ml-100k/u.userhadoop fs -ls cosn://examplebucket-1250000000/unknow-pathls: Failed to convert ufs path cosn://examplebucket-1250000000/unknow-path to GooseFs path, check if namespace mounted
重新执行 Hive 查询语句:
select sum(age) from u_user_cosn;
八、6. 创建 OFS Schema 表和查询数据
通过如下命令执行:
CREATE TABLE u_user_ofs (userid INT,age INT,gender CHAR(1),occupation STRING,zipcode STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '|'STORED AS TEXTFILELOCATION 'ofs://instance-id.chdfs.ap-guangzhou.myqcloud.com/ofs-test/';select sum(age) from u_user_ofs;
九、7. 修改 OFS 的实现为 GooseFS 的兼容实现
修改 hadoop/etc/hadoop/core-site.xml:
<property> <name>fs.AbstractFileSystem.ofs.impl</name> <value>com.qcloud.cos.goosefs.hadoop.CHDFSDelegateFS</value></property><property> <name>fs.ofs.impl</name> <value>com.qcloud.cos.goosefs.hadoop.CHDFSHadoopFileSystem</value></property>
执行 Hadoop 命令,如果路径无法转换为 GooseFS 中的路径,则输出结果中会包含报错信息:
hadoop fs -ls ofs://instance-id.chdfs.ap-guangzhou.myqcloud.com/ofs-test/Found 1 items-rw-r–r– 0 hadoop hadoop 22628 2021-07-15 15:56 ofs://instance-id.chdfs.ap-guangzhou.myqcloud.com/ofs-test/u.userhadoop fs -ls ofs://instance-id.chdfs.ap-guangzhou.myqcloud.com/unknown-pathls: Failed to convert ufs path ofs://instance-id.chdfs.ap-guangzhou.myqcloud.com/unknown-path to GooseFs path, check if namespace mounted
重新执行 Hive 查询语句:
select sum(age) from u_user_ofs;