更新时间:2024-09-04 GMT+08:00

HDFS对接OBS业务应用开发样例说明

对接原理介绍

  • HDFS创建FileSystem的代码会根据uri的scheme查找对应的实现类,即针对不同底层提供的实现类,在HDFS的配置文件中进行配置,HDFS就会根据fs.AbstractFileSystem.%s.impl创建对应的实现类。如下所示:
    *Create a file system instance for the specified uri using the conf. The conf is used to find the class name that implements the file system. The conf is also passed to the file system for its configuration.
    *
    *@param uri URI of the file system
    *@param conf Configuration for the file system
    *
    *@return Returns the file system for the given URI
    *
    *@throws UnsupportedFileSystemException file system for <code>uri</code> is not found
    */
    public static AbstractFileSystem createFileSystem(URI uri, Configuration conf)
        throws UnsupportedFileSystemException {
      final String fsImplConf = String.format("fs.AbstractFileSystem.%s.impl", uri.getScheme());
    
      Class<?> clazz = conf.getClass(fsImplConf, null);
      if (clazz == null) {
        throw new UnsupportedFileSystemException(String.format(
            "%s=null: %s: %s",
            fsImplConf, NO_ABSTRACT_FS_ERROR, uri.getScheme()));
      }
      return (AbstractFileSystem) newInstance(clazz, uri, conf);
    }
  • HDFS的core-default中已经针对adl、hdfs、file等不同的url添加了对应的实现,如下所示:
    <property>
      <name>fs.AbstractFileSystem.adl.impl</name>
      <value>org.apache.hadoop.fs.adl.Adl</value>
    </property>
    <property>
      <name>fs.AbstractFileSystem.hdfs.impl</name>
      <value>org.apache.hadoop.fs.Hdfs</value>
      <description>The FileSystem for hdfs: uris.</description>
    </property>
    <property>
      <name>fs.AbstractFileSystem.file.impl</name>
      <value>org.apache.hadoop.fs.local.LocalFs</value>
      <description>The AbstractFileSystem for file: uris.</description>
    </property>
    
    <property>
      <name>fs.AbstractFileSystem.har.impl</name>
      <value>org.apache.hadoop.fs.HarFs</value>
      <description>The AbstractFileSystem for har: uris.</description>
    </property>
  • MRS服务的默认配置文件中已经添加了OBS的实现类来对接OBS,如下所示:
    <property>
    <name>fs.AbstractFileSystem.obs.impl</name>
    <value>org.apache.hadoop.fs.obs.OBS</value>
    </property>

获取集群的配置文件

  1. 参考安装MRS集群客户端,下载并解压客户端。
  2. 获取下载的HDFS客户端配置文件(下载路径/HDFS/hadoop/etc/hadoop)中的“core-site.xml”、“hdfs-site.xml”。获取Yarn客户端配置文件(下载路径/Yarn/config)中的“core-site.xml”。

    用于替换原有代码的中的使用的配置文件。

  3. 分别在HDFS和Yarn的“core-site.xml”文件中增加访问OBS的信息,具体如下:
    <property>
      <name>fs.obs.endpoint</name>
      <value>obs endpoint</value>
    </property>
    <property>
      <name>fs.obs.access.key</name>
      <value>xxx</value>
      <description>huaweicloud access key</description>
    </property>
    <property>
      <name>fs.obs.secret.key</name>
      <value>xxx</value>
      <description>huaweicloud secret key</description>
    </property>
    • 配置文件中包含认证密码信息可能存在安全风险,建议当前场景执行完毕后删除相关配置文件或加强安全管理。
  4. 修改HDFS客户端“core-site.xml”文件中的“fs.defaultFS”参数值:
    例如:修改前“fs.defaultFS”参数值为“hdfs://hacluster”
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://hacluster</value>
    </property>

    修改为:“obs://桶名

    <property>
      <name>fs.defaultFS</name>
      <value>obs://桶名</value>
    </property>
  5. 为了减少OBS的日志,log4j.properties文件中增加如下配置:
    log4j.logger.org.apache.hadoop.fs.obs=WARN
    log4j.logger.com.obs=WARN 

    OBS文件系统打印大量日志可能导致读写性能受影响,可通过调整OBS客户端日志级别优化,日志调整方式如下:

    cd ${client_home}/HDFS/hadoop/etc/hadoop

    vi log4j.properties

    在文件中添加OBS日志级别配置:

    log4j.logger.org.apache.hadoop.fs.obs=WARN
    log4j.logger.com.obs=WARN

业务程序添加依赖包

在MRS HDFS客户端安装包中获取jar包:hadoop-huaweicloud-xxx-hw-xx.jar、mrs-obs-provider-xxx.jar,并放到程序的classpath路径下,并修改jar包文件权限和属主。