使用 Hadoop-Kodo 插件管理对象存储 Kodo
七牛云支持使用 Hadoop-Kodo 插件将 Hadoop 对接至对象存储 Kodo,并由此轻松管理 Kodo 对象存储。
- 支持 Hadoop MapReduce 和 Spark 在 Kodo 上的读写操作
- 实现了 Hadoop 文件系统的接口,通过模拟分级目录结构提供了和 HDFS 相同的使用体验
- 支持大文件分片上传,最高支持 10TB 的单个文件
- 使用了 Kodo 的 batch api,具有高性能的文件系统操作能力
- 支持文件的内存块级缓存和磁盘块级缓存,提高了文件的读取性能
使用说明
对象存储不是文件系统
由于对象存储并不是文件系统,因此在使用上存在一些限制:
- 对象存储是基于 key-value 的存储,不支持分层目录结构,因此需要使用路径分隔符模拟分层目录结构
- 不跟踪目录的修改和访问时间
- Kodo 对象存储暂不支持文件的追加写入,因此不能在已有文件的末尾追加写入数据
- 不跟踪文件的修改时间,因此在文件系统中,文件的修改时间为文件的创建时间
- delete 和 rename 的操作是非原子的,这意味着如果操作被意外中断,文件系统可能处于不一致的状态
- 对象存储并不支持 unix-like 的权限管理,因此为了模拟文件系统,需要提供以下规则:
- 目录权限为 715
- 文件权限为 666
- 文件所有者为本地当前用户
- 文件所有组为本地当前用户
 
- 单次请求的最大文件数量为 1000
- 支持大文件分片上传,但分片数量限制为 10000,由于单个分片的最大大小为 1GB,因此最大支持 10TB 的单个文件
目录最后访问时间不被跟踪
- 依赖此特性的 Hadoop 特性可能会有意外的行为
- 例如:YARN 的 AggregatedLogDeletionService 将无法删除相应的日志文件
七牛凭证非常非常有价值
- 通过您的七牛凭证使用服务将生成相关费用
- 使用您的七牛凭证还可以读写您的数据,即任何拥有您凭证的人都可以读取您的空间 (Bucket),他们也可以删除这些空间
安装
获取 hadoop-kodo 分发包及其依赖
根据您的 Hadoop 版本,从以下地址获取 hadoop-kodo 分发包及其依赖:hadoop-kodo release
若 Release 中不存在您需要的 hadoop 版本,可自行编译打包,过程如下:
# 打包 hadoop-kodo 分发包,其中 <hadoop.version> 为您的目标 hadoop 版本
mvn package -DskipTests -Dhadoop.version=<hadoop.version>
# 提取其所有依赖包到 target/dependency 目录下
mvn dependency:copy-dependencies
# 拷贝其依赖的 qiniu-java-sdk 到 target 目录下
cp target/dependency/qiniu-* target/
安装 hadoop-kodo
将 hadoop-kodo-<hadoop.version>-x.x.x.jar 和 qiniu-java-sdk-x.x.x.jar 拷贝到 $HADOOP_HOME/share/hadoop/tools/lib 目录下。
注意:请根据您的 Hadoop 版本选择对应的 hadoop-kodo 的 jar 包,若找不到对应版本的 jar 包,请自行编译。
编辑文件 $HADOOP_HOME/etc/hadoop/hadoop-env.sh,增加如下配置:
for f in $HADOOP_HOME/share/hadoop/tools/lib/*.jar; do
  if [ "$HADOOP_CLASSPATH" ]; then
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
  else
    export HADOOP_CLASSPATH=$f
  fi
done
配置
core-site.xml
修改 $HADOOP_HOME/etc/hadoop/core-site.xml,增加 Kodo 相关的用户配置与实现类相关信息。在公有云环境下通常仅需配置如下即可正常工作:
<configuration>
    <property>
        <name>fs.qiniu.auth.accessKey</name>
        <value>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</value>
        <description>Qiniu Access Key</description>
    </property>
    <property>
        <name>fs.qiniu.auth.secretKey</name>
        <value>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</value>
        <description>Qiniu Secret Key</description>
    </property>
    <property>
        <name>fs.kodo.impl</name>
        <value>org.apache.hadoop.fs.qiniu.kodo.QiniuKodoFileSystem</value>
    </property>
    <property>
        <name>fs.AbstractFileSystem.kodo.impl</name>
        <value>org.apache.hadoop.fs.qiniu.kodo.QiniuKodo</value>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>kodo://example-bucket-name/</value>
    </property>
</configuration>
更多配置请参考文档:config.md。 对于私有云用户可参考文档:private-cloud.md。
运行 mapreduce 示例程序 wordcount
put 命令
mkdir testDir
touch testDir/input.txt
echo "a b c d ee a b s" > testDir/input.txt
hadoop fs -put testDir kodo:///testDir
ls 命令
hadoop fs -ls -R kodo://example-bucket/
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/user
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/user/root
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/testDir
-rw-rw-rw-   0 root root         17 2023-01-18 15:54 kodo://example-bucket/testDir/input.txt
get 命令
$ hadoop fs -get kodo:///testDir testDir1
$ ls -l -R testDir1
total 8
-rw-r--r--  1 root  staff  17 Jan 18 15:57 input.txt
运行 wordcount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-{version}.jar wordcount kodo://example-bucket/testDir/input.txt kodo://example-bucket/testDir/output
执行成功后返回统计信息如下:
2023-01-18 16:00:49,228 INFO mapreduce.Job: Counters: 35
	File System Counters
		FILE: Number of bytes read=564062
		FILE: Number of bytes written=1899311
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		KODO: Number of bytes read=34
		KODO: Number of bytes written=25
		KODO: Number of read operations=3
		KODO: Number of large read operations=0
		KODO: Number of write operations=0
	Map-Reduce Framework
		Map input records=1
		Map output records=8
		Map output bytes=49
		Map output materialized bytes=55
		Input split bytes=102
		Combine input records=8
		Combine output records=6
		Reduce input groups=6
		Reduce shuffle bytes=55
		Reduce input records=6
		Reduce output records=6
		Spilled Records=12
		Shuffled Maps =1
		Failed Shuffles=0
		Merged Map outputs=1
		GC time elapsed (ms)=31
		Total committed heap usage (bytes)=538968064
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=17
	File Output Format Counters 
		Bytes Written=25
$ hadoop fs -ls -R kodo://example-bucket/
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/user
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/user/root
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/testDir
-rw-rw-rw-   0 root root         17 2023-01-18 15:54 kodo://example-bucket/testDir/input.txt
drwx--xr-x   - root root          0 1970-01-01 08:00 kodo://example-bucket/testDir/output
-rw-rw-rw-   0 root root          0 2023-01-18 16:00 kodo://example-bucket/testDir/output/_SUCCESS
-rw-rw-rw-   0 root root         25 2023-01-18 16:00 kodo://example-bucket/testDir/output/part-r-00000
cat 命令
$ hadoop fs -cat kodo://example-bucket/testDir/output/part-r-00000
a	2
b	2
c	1
d	1
ee	1
s	1
测试
请参考文档:test.md
    文档反馈
    (如有产品使用问题,请 提交工单)