对象存储

  • 对象存储 > 最佳实践 > 对象存储开源生态建设 > 使用 Hadoop 管理对象存储 Kodo >使用 Hadoop-Kodo 插件管理对象存储 Kodo

    使用 Hadoop-Kodo 插件管理对象存储 Kodo

    最近更新时间: 2023-07-27 17:35:09

    七牛云支持使用 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.jarqiniu-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

    以上内容是否对您有帮助?
  • Qvm free helper
    Close