OSS-HDFS服务是一款云原生数据湖存储产品。基于统一的元数据管理能力,在完全兼容HDFS文件系统接口的同时,提供充分的POSIX能力支持,能更好地满足大数据和AI等领域的数据湖计算场景。本文介绍自建Hadoop如何通过JindoSDK访问OSS-HDFS服务。

前提条件

已开通并授权访问OSS-HDFS服务。具体操作,请参见 开通并授权访问OSS-HDFS服务

什么是OSS-HDFS服务

通过OSS-HDFS服务,无需对现有的Hadoop、Spark大数据分析应用做任何修改。通过简单的配置即可像在原生HDFS中那样管理和访问数据,同时获得OSS无限容量、弹性扩展、更高的安全性、可靠性和可用性支撑。

作为云原生数据湖基础,OSS-HDFS在满足EB级数据分析、亿级文件管理服务、TB级吞吐量的同时,全面融合大数据存储生态,除提供对象存储扁平命名空间之外,还提供了分层命名空间服务。分层命名空间支持将对象组织到一个目录层次结构中进行管理,并能通过统一元数据管理能力进行内部自动转换。对Hadoop用户而言,无需做数据复制或转换就可以实现像访问本地HDFS一样高效的数据访问,极大提升整体作业性能,降低了维护成本。

关于OSS-HDFS服务的应用场景、服务特性、功能特性等更多信息,请参见OSS-HDFS服务概述

步骤一:创建专有网络VPC并添加云服务器ECS实例

  1. 创建允许内网访问OSS-HDFS服务的专有网络VPC。
    1. 登录专有网络管理控制台
    2. 专有网络页面,单击创建专有网络
      创建专有网络VPC时,需确保创建的VPC与待开启OSS-HDFS服务的Bucket位于相同的地域(Region)。创建VPC的具体操作,请参见 创建专有网络和交换机
  2. 添加云服务器ECS实例。
    1. 单击已创建的VPC ID,然后单击资源管理页签。
    2. 包含基础云资源区域,单击云服务器(ECS)右侧的序号
    3. 实例页面,单击创建实例
      创建ECS实例时,需确保该ECS实例与已创建的专有网络VPC位于相同地域。创建ECS实例的具体操作,请参见 选购ECS实例

步骤二:创建Hadoop运行环境

  1. 安装Java环境。
    1. 在已创建的ECS示例右侧,单击远程连接
      关于远程连接ECS实例的具体操作,请参见 连接方式概述
    2. 检查JDK版本。
      java -version
    3. 可选:如果JDK为1.8.0以下版本,请卸载已有的JDK。如果JDK为1.8.0或以上版本,请跳过此步骤。
      rpm -qa | grep java | xargs rpm -e --nodeps
    4. 安装Java。
      yum install java-1.8.0-openjdk* -y
    5. 配置环境变量。
      vim /etc/profile
    6. 添加环境变量。
      如果提示当前JDK Path不存在,请前往 /usr/lib/jvm/查找 java-1.8.0-openjdk
      export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
      export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
      export PATH=$PATH:$JAVA_HOME/bin
  2. 启用SSH服务。
    1. 安装SSH服务。
      yum install -y openssh-clients openssh-server
    2. 启用SSH服务。
      systemctl enable sshd && systemctl start sshd
    3. 生成SSH密钥,并将生成的密钥添加到信任列表。
      ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      chmod 0600 ~/.ssh/authorized_keys
  3. 安装Hadoop。
    1. 下载Hadoop安装包。
      wget https://mirrors.sonic.net/apache/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
    2. 解压安装包。
      tar xzf hadoop-3.3.1.tar.gz
    3. 将安装包移动到常用位置。
      mv hadoop-3.3.1 /usr/local/hadoop
    4. 配置环境变量。
      1. 配置Hadoop环境变量。
        vim /etc/profile
        export HADOOP_HOME=/usr/local/hadoop
        export PATH=$HADOOP_HOME/bin:$PATH
      2. 更新Hadoop配置文件中的HADOOP_HOME
        cd $HADOOP_HOME
        vim etc/hadoop/hadoop-env.sh
      3. ${JAVA_HOME}替换为实际路径。
        export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
    5. 可选:如果提示目录不存在,请执行以下命令,使环境变量生效。
      cd $HADOOP_HOME/etc/hadoop
    6. 更新配置文件core-site.xml以及hdfs-site.xml
      • 更新配置文件core-site.xml并添加属性。
        <configuration>
          <!-- 指定HDFS中NameNode的地址。-->
          <property>
              <name>fs.defaultFS</name>
              <!--替换为主机名或localhost。-->
              <value>hdfs://localhost:9000</value>
          </property>
        
          <!--将Hadoop临时目录修改为自定义目录。-->
          <property>
              <name>hadoop.tmp.dir</name>
              <!--admin操作时完成目录授权sudo chown -R admin:admin /opt/module/hadoop-3.3.1-->
              <value>/opt/module/hadoop-3.3.1/data/tmp</value>
          </property>
        </configuration>
      • 更新配置文件hdfs-site.xml并添加属性。
        <configuration>
          <!-- 指定HDFS副本的数量。-->
          <property>
              <name>dfs.replication</name>
              <value>1</value>
          </property>
        </configuration>
    7. 格式化文件结构。
      hdfs namenode -format
    8. 启动HDFS。
      启动HDFS分为启动NameNode、DataNode和Secondary NameNode三个步骤。
      1. 启动HDFS。
        cd /usr/local/hadoop/
        sbin/start-dfs.sh
      2. 查看进程。
        jps

        返回结果如下:

        hdfs

        完成上述步骤后,即可建立HDFS守护进程。由于HDFS本身具备HTTP面板,您可以通过浏览器访问http://{ip}:9870,查看HDFS面板以及详细信息。

  4. 测试Hadoop是否安装成功。
    执行 hadoop version命令,如果正常返回版本信息,表明安装成功。 version

步骤三:切换本地HDFS到云上OSS-HDFS服务

  1. 下载JindoSDK JAR包。
    1. 切换至目标目录。
      cd /usr/lib/
    2. 下载最新版本的JindoSDK JAR包。下载地址,请参见GitHub
    3. 解压JindoSDK JAR包。
      tar -zxvf jindosdk-x.x.x.tar.gz
      说明 x.x.x表示JindoSDK JAR包版本号。
  2. 配置环境变量。
    1. 切换至目标目录。
      vim /etc/profile
    2. 解压下载的安装包。
      export JINDOSDK_HOME=/usr/lib/jindosdk-x.x.x
    3. 配置HADOOP_CLASSPATH
      export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${JINDOSDK_HOME}/lib/*
    4. 执行以下命令使环境变量配置生效。
      . /etc/profile
  3. 配置JindoSDK DLS实现类及AccessKey。
    1. 将JindoSDK DLS实现类配置到Hadoop的core-site.xml中。
      <configuration>
          <property>
              <name>fs.AbstractFileSystem.oss.impl</name>
              <value>com.aliyun.jindodata.oss.JindoOSS</value>
          </property>
      
          <property>
              <name>fs.oss.impl</name>
              <value>com.aliyun.jindodata.oss.JindoOssFileSystem</value>
          </property>
      </configuration>
    2. 将已开启HDFS服务的Bucket对应的accessKeyId、accessKeySecret预先配置在Hadoop的core-site.xml中。
      <configuration>
          <property>
              <name>fs.oss.accessKeyId</name>
              <value>xxx</value>
          </property>
      
          <property>
              <name>fs.oss.accessKeySecret</name>
              <value>xxx</value>
          </property>
      </configuration>
  4. 配置OSS-HDFS服务的Endpoint。
    访问OSS-HDFS服务时需要配置Endpoint。推荐访问路径格式为 oss://<Bucket>.<Endpoint>/<Object>,例如 oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/exampleobject.txt。配置完成后,JindoSDK会根据访问路径中的Endpoint访问对应的OSS-HDFS服务接口。

    除上述提到的在访问路径中指定Endpoint的方式以外,您还可以通过其他配置OSS-HDFS服务的Endpoint。更多信息,请参见配置Endpoint的其他方式

步骤四:访问OSS-HDFS服务

  • 新建目录

    在目标存储空间examplebucket下创建名为dir/的目录,示例如下:

    hdfs dfs -mkdir oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/dir/
  • 上传文件

    将本地examplefile.txt文件上传至目标存储空间examplebucket,示例如下:

    hdfs dfs -put /root/workspace/examplefile.txt oss://examplebucket.cn-hangzhou.oss-dls.aliyuncs.com/examplefile.txt
  • 查看目录信息

    查看目标存储空间examplebucket下目录dir/的信息,示例如下:

    hdfs dfs -ls oss://examplebucket.oss-dls.aliyuncs.com/dir/
  • 查看文件信息

    查看目标存储空间examplebucket下文件examplefile.txt的信息,示例如下:

    hdfs dfs -ls oss://examplebucket.oss-dls.aliyuncs.com/examplefile.txt
  • 查看文件内容

    查看目标存储空间examplebucket下文件examplefile.txt的内容,示例如下:

    重要 执行以下命令后,文件内容将以纯文本形式打印在屏幕上。如果文件存在特定格式的编码,请使用HDFS的Java API读取文件内容,然后进行解码操作后即可获取对应的文件内容。
    hdfs dfs -cat oss://examplebucket.oss-dls.aliyuncs.com/examplefile.txt
  • 拷贝目录或文件

    将目标存储空间examplebucket下根目录subdir1拷贝到目录subdir2下,且根目录subdir1所在的位置、根目录下的文件和子目录结构和内容保持不变,示例如下:

    hdfs dfs -cp oss://examplebucket.oss-dls.aliyuncs.com/subdir1/  oss://examplebucket.oss-dls.aliyuncs.com/subdir2/subdir1/
  • 移动目录或文件

    将目标存储空间根目录srcdir及其包含的文件或者子目录移动至另一个根目录destdir下,示例如下:

    hdfs dfs -mv oss://examplebucket.oss-dls.aliyuncs.com/srcdir/  oss://examplebucket.oss-dls.aliyuncs.com/destdir/
  • 下载文件

    将目标存储空间examplebucket下的exampleobject.txt下载到本地根目录文件夹/tmp下,示例如下:

    hdfs dfs -get oss://examplebucket.oss-dls.aliyuncs.com/exampleobject.txt  /tmp/
  • 删除目录或文件
    删除目标存储空间examplebucket下目录destfolder/及其目录下的所有文件,示例如下:
    hdfs dfs -rm oss://examplebucket.oss-dls.aliyuncs.com/destfolder/