1.服务介绍

OSS-HDFS服务是一款基于对象存储OSS之上的云原生数据湖3.0存储产品,基于统一的元数据管理能力,在完全兼容 HDFS 文件系统接口的同时,提供充分的 POSIX 能力支持,能更好的满足大数据和 AI 领域丰富多样的数据湖计算场景。

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

图片

$$ 数据湖HDFS演进路径 $$

您可以通过云起实验室,快速体验存算分离架构下的EMR集群结合OSS-HDFS服务进行数据湖分析。更多信息,请参见使用EMR+DLF+OSS-HDFS进行数据湖分析。

1.1 主要特性

1.1.1 HDFS 兼容访问

OSS-HDFS服务(JindoFS服务)完全兼容HDFS接口,同时支持目录层级的操作,只需集成JindoSDK做简单的配置,即可为Apache Hadoop的计算分析应用(例如MapReduce、Hive、Spark、Flink等)提供了访问HDFS服务的能力,像使用 Hadoop 分布式文件系统 (HDFS) 一样管理和访问数据,使用详情请参考OSS-HDFS服务快速入门;

1.1.2 POSIX 能力支持

OSS-HDFS服务可以通过JindoFuse提供POSIX支持。可以把OSS-HDFS服务上的文件挂载到本地文件系统中,能够像操作本地文件系统一样操作JindoFS服务中的文件,使用详情请参考使用JindoFuse访问OSS-HDFS服务

1.1.3 高性能、高弹性、低成本

使用自建Haddop集群,严重依赖硬件资源,很难做到资源的弹性伸缩,成本和效益上捉襟见肘,比如规模超过数百台,文件数达到4亿/10亿左右时NameNode基本达到瓶颈。随着元数据规模的上涨,其QPS存在下降的趋势。而OSS-HDFS服务是专为多租户、海量数据存储服务设计,元数据管理能力可弹性扩容,可支持更高的并发度、吞吐量和低时延,即使超过10亿文件数依然可以保持服务稳定,提供高性能、高可用的服务。同时采用统一元数据管理能力,可轻松应对超大文件规模,并支持多种分层分级策略,系统的资源利用率更高,更节约成本,能充分满足业务体量快速变化的需求。

1.1.4 数据持久性和服务可用性

OSS-HDFS服务中数据存储在对象存储OSS上,而OSS作为阿里巴巴全集团数据存储的核心基础设施,多年支撑双11业务高峰,历经高可用与高可靠的严苛考验。

1.服务可用性不低于99.995%。

2.数据设计持久性不低于99.9999999999%(12个9)。

3.规模自动扩展,不影响对外服务。

4.数据自动多重冗余备份。

1.2 典型适用场景

OSS-HDFS 服务提供全面的大数据和 AI 生态支持,典型场景如下概述,相关文档请参考链接:阿里云 OSS-HDFS 服务(JindoFS 服务) 用户文档。

1.2.1 Hive/Spark 离线数仓

OSS-HDFS服务原生支持文件/目录语义和操作,支持毫秒级和原子性目录 rename,在能力上对齐 HDFS,擅长和适合用于开源 Hive/Spark 离线数仓。

1.2.2 OLAP

OSS-HDFS服务提供 append、truncate、flush、pwrite 等基础文件操作,通过 JindoFuse 充分支持 POSIX,可以为 ClickHouse 这类 OLAP 场景替换本地磁盘做存/算分离方案,再借助于缓存系统进行加速,达到最佳性价比。

1.2.3 AI 训练/推理

OSS-HDFS服务提供 append、truncate、flush、pwrite 等基础文件操作,通过 JindoFuse 充分支持 POSIX,无缝对接 AI 生态和已有的 Python 训练/推理程序。

1.2.4 HBase 存/算分离

OSS-HDFS服务原生支持文件/目录语义和操作,支持 flush 操作,在能力上对齐 HDFS,可以用于替代 HDFS 做 HBase 存/算分离方案。相较于 HBase + OSS(标准 bucket)方案,HBase + OSS-HDFS服务方案不依赖 HDFS 来存放 WAL 日志,大幅简化整体方案架构。

1.2.5 实时计算

OSS-HDFS服务高效支持 flush 和 truncate 操作,可以用来无缝替代 HDFS 在 Flink 实时计算应用场景下做 sink/checkpoint 存储。

1.2.6 数据迁移

OSS-HDFS 服务作为新一代云原生数据湖存储,支持 IDC HDFS/云上自建HDFS 平迁,保证和优化 HDFS 使用体验,同时享受弹性伸缩、按需付费的成本效益,大幅优化存储成本。

JindoDistCp 工具提供高效方式支持将 HDFS 文件数据(包括文件属性等元数据)无缝迁入 OSS-HDFS 服务,并基于 HDFS Checksum 支持提供快速比对。

OSS-HDFS 服务作为 JindoFS Block 模式的服务化升级版本,提供升级方案,支持将 EMR 集群内的 JindoFS Block 模式文件元数据(存放于 header 节点上的本地 RocksDB)快速迁入 OSS-HDFS 服务 bucket,保持 OSS 上已有的 JindoFS 文件数据块不变(无须转换、迁移)。

OSS-HDFS 服务支持将 OSS 现有 bucket 数据通过元数据转换功能快速转危为HDFS数据,方便OSS 用户体验更高的文件场景应用性能优势。

2.使用步骤

2.1 创建内网访问OSS-HDFS服务的VPC 环境

2.1.1 创建VPC环境

登陆阿里云官网,点击“产品与服务”中的“专有网络VPC”

图片

切换到与即将使用的OSS-HDFS 服务Bucket相同的地域后,点击“创建专有网络”

图片

填入必要信息后点击“确定”

图片

2.1.2 创建云服务器(ECS)

进入新建的vpc管理页面,切换到“资源管理” ,添加云服务器(ECS)

图片

在打开的页面中点击“创建实例”

图片

根据需要填写配置等侯提交确认

图片

如需要访问外网,请选择分配工网IP

图片

2.2 创建Hadoop运行环境(已有环境请直接跳转到2.3)

2.2.1 安装Java 环境

ECS创建完成后进入该实例控制台点击远程连接,进入系统

图片

安装JDK并配置环境变量,JDK版本不低于1.8

#卸载已有jdk
rpm -qa | grep java | xargs rpm -e --nodeps 
#安装java
yum install java-1.8.0-openjdk* -y

# 配置环境变量
## 临时生效直接export;
## 当前用户生效更新到 ~/.bashrc;
## 所有用户生效更新到/etc/profile 使配置生效; 编辑完. /etc/profile使其生效
vim /etc/profile
# 添加环境变量, 如果提示当前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.2.2 安装SSH

# 安装
yum install -y openssh-clients openssh-server

# 启用服务
systemctl enable sshd && systemctl start sshd

生成 SSH 密钥,并将生成的密钥添加到信任列表:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

2.2.3 安装Hadoop

# 下载
wget https://mirrors.sonic.net/apache/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz

# 解压
tar xzf hadoop-3.3.1.tar.gz

# 移动到常用位置
mv hadoop-3.3.1 /usr/local/hadoop

配置环境变量

# 临时生效直接export;
# 当前用户生效更新到 ~/.bashrc;
# 所有用户生效更新到/etc/profile 使配置生效; 编辑完. /etc/profile使其生效
vim /etc/profile

# 设置hadoop环境变量
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$PATH

# 更新hadoop配置文件中JAVA_HOME
cd $HADOOP_HOME
vim etc/hadoop/hadoop-env.sh 
# 将JAVA_HOME由原来${JAVA_HOME}换成具体路径,这样在集群环境中才不会出现问题
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

更新配置文件

更新两个文件:core-site.xml 和 hdfs-site.xml

#如果提示目录不存在,则执行. /etc/profile,使环境变量生效
cd $HADOOP_HOME/etc/hadoop

更新vim 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>

格式化文件结构

hdfs namenode -format

启动HDFS

然后启动 HDFS, 启动分三个步骤,分别启动 NameNode、DataNode 和 Secondary NameNode

cd /usr/local/hadoop/

# 启动
sbin/start-dfs.sh

export HDFS_DATANODE_USER=root 
export HADOOP_SECURE_DN_USER=hdfs 
export HDFS_NAMENODE_USER=root 
export HDFS_SECONDARYNAMENODE_USER=root 

# 查看进程
jps

图片

2.2.4 Hadoop测试

执行hadoop version命令,如能正常返回version信息表示安装成功

图片

运行一个hadoop 官方示例 - 单词次数计算

#  /hello 为输入目录; /hi 为输出目录,必须不存在
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /hello /hi

2.2.5 HDFS 测试

示例

# 显示根目录 / 下的文件和子目录,绝对路径
hadoop fs -ls -R /

# 新建文件夹,绝对路径
hadoop fs -mkdir /hello

# 上传文件
hadoop fs -put hello.txt /hello/

# 下载文件
hadoop fs -get /hello/hello.txt

# 输出文件内容
hadoop fs -cat /hello/hello.txt

2.3 切换本地HDFS到云上OSS-HDFS服务

2.3.1 创建OSS Bucket并开通HDFS服务

  1. 登录OSS管理控制台。
  2. 单击Bucket列表,然后单击创建Bucket,此处以北京为例。
  3. 在创建Bucket面板中,切换到支持HDFS服务地域,选择开通HDFS服务
  4. 单击确定。

图片

2.3.2 授权访问

1.授权服务端管理已开通HDFS服务的Bucket。首次使用HDFS功能时,需要先在RAM控制,完成以下授权,以便OSS服务账号能够管理Bucket中的数据。

a.创建名为AliyunOSSDlsDefaultRole的角色。

i.登录RAM控制台。

ii.在左侧导航栏,选择身份管理 > 角色。

iii.单击创建角色,选择可信实体类型为阿里云服务,单击下一步。

iv.角色类型选择普通服务角色,角色名称填写为AliyunOSSDlsDefaultRole,选择受信服务为对象存储。

v.单击完成。角色创建完成后,单击关闭。

b. 新建名为AliyunOSSDlsRolePolicy的自定义权限策略。

i.在左侧导航栏,选择权限管理 > 权限策略。

ii.单击创建权限策略。

iii.在新建自定义权限策略页面,填写策略名称为AliyunOSSDlsRolePolicy,配置模式选择脚本配置,并在策略内容中填写以下权限策略。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:ListObjects",
      "Resource": [
        "acs:oss:*:*:*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "oss:*",
      "Resource": [
        "acs:oss:*:*:*/.dlsdata",
        "acs:oss:*:*:*/.dlsdata*"
      ]
    }
  ]
}

iv.单击确定。

c. 为角色授予自定义权限策略。

i.在左侧导航栏,选择身份管理 > 角色。
ii.单击RAM角色AliyunOSSDlsDefaultRole右侧的精确授权。
iii.在添加权限页面,选择权限类型为自定义策略,输入已创建的自定义权限策略名称AliyunOSSDlsRolePolicy。
iv.单击确定。

2.授权RAM用户访问已开通HDFS服务的Bucket。如果您使用服务角色(例如EMR服务角色AliyunEMRDefaultRole)访问已开通HDFS服务的Bucket,请参见上述为RAM用户授权的步骤完成服务角色授权。

a.创建RAM用户。具体操作,请参见创建RAM用户。
b.创建自定义策略,策略内容如下:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:*/.dlsdata",
                "acs:oss:*:*:*/.dlsdata*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:GetBucketInfo",
                "oss:PostDataLakeStorageFileOperation"
            ],
            "Resource": "*"
        }
    ],
    "Version": "1"
}

创建自定义策略的具体操作,请参见创建自定义权限策略。

为RAM用户授权已创建的自定义策略。具体步骤,请参见为RAM用户授权。

2.3.3 下载JindoSDK并配置

下载最新的 tar.gz 包 jindosdk-x.x.x.tar.gz (下载页面)。

# 切换到目标目录
cd /usr/lib/

# 下载jdk 包
wget https://jindodata-binary.oss-cn-shanghai.aliyuncs.com/release/4.1.0/jindosdk-4.1.0.tar.gz

# 解压
tar xzf jindosdk-4.1.0.tar.gz

配置环境变量

# 切换到目标目录
vim /etc/profile

# 文件末尾添加配置后保存
export JINDOSDK_HOME=/usr/lib/jindosdk-4.1.0
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${JINDOSDK_HOME}/lib/*

# 使配置生效
. /etc/profile

配置 OSS-HDFS 服务实现类及 Access Key,基本配置方式如下,除此之外JindoSDK还支持更多的 AccessKey 的配置方式,详情参考 JindoSDK Credential Provider 配置。

cd $HADOOP_HOME/etc/hadoop

将 JindoSDK OSS 实现类配置到 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>

将已开启 HDFS 服务的 Bucket 对应的Access Key ID、Access Key Secret等预先配置在 Hadoop 的core-site.xml中。

<configuration>
    <property>
        <name>fs.oss.accessKeyId</name>
        <value>xxxx</value>
    </property>

    <property>
        <name>fs.oss.accessKeySecret</name>
        <value>xxxx</value>
    </property>
</configuration>

2.3.4 配置 OSS-HDFS 服务 Endpoint

访问 OSS Bucket 上 OSS-HDFS服务需要配置 Endpoint(http://cn-xxx.oss-dls.aliyuncs.com),与 OSS 对象接口的 Endpoint(http://oss-cn-xxx.aliyuncs.com)不同。JindoSDK 会根据配置的 Endpoint 访问 JindoFS 服务 或 OSS 对象接口。

使用 JindoFS 服务时,推荐访问路径格式为:oss://<Bucket>.<Endpoint>/<Object>

如: oss://http://dls-chenshi-test.cn-shanghai.oss-dls.aliyuncs.com/Test

这种方式在访问路径中包含 OSS-HDFS 服务的 Endpoint,JindoSDK 会根据路径中的 Endpoint 访问对应的 OSS-HDFS 服务接口。 JindoSDK 还支持更多的 Endpoint 配置方式,详情参考JindoFS 服务 Endpoint 配置。

2.3.5 开始使用

新建目录

在JindoFS服务上创建目录
用例: hdfs dfs -mkdir oss://<Bucket>.<Endpoint>/Test/subdir

hdfs dfs -mkdir oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/Test

图片

新建文件

利用hdfs dfs -put命令上传本地文件到JindoFS服务

用例:hdfs dfs -put <localfile> oss://<Bucket>.<Endpoint>/Test

hdfs dfs -put /root/workspace/hello.txt oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/Test

图片

查看文件或者目录信息

在文件或者目录创建完之后,可以查看指定路径下的文件/目录信息。hdfs dfs没有进入某个目录下的概念。在查看目录和文件的信息的时候需要给出文件/目录的绝对路径。
指令:ls

用例:hdfs dfs -ls oss://<Bucket>.<Endpoint>/Test

hdfs dfs -ls oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/Test

图片

查看文件的内容

有时候我们需要查看一下在JindoFS服务文件的内容。hdfs dfs命令支持我们将文件内容打印在屏幕上。(请注意,文件内容将会以纯文本形式打印出来,如果文件进行了特定格式的编码,请使用HDFS的JavaAPI将文件内容读取并进行相应的解码获取文件内容)

用例:hdfs dfs -cat oss://<Bucket>.<Endpoint>/Test/helloworld.txt

hdfs dfs -cat /root/workspace/hello.txt oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/Test/hello.txt

图片

复制目录/文件

有时候我们需要将JindoFS服务的一个文件/目录拷贝到另一个位置,并且保持源文件和目录结构和内容不变。

用例:hdfs dfs -cp oss://<Bucket>.<Endpoint>/Test/subdir oss://<Bucket>.<Endpoint>/TestTarget/sudir2

移动目录/文件

在很多大数据处理的例子中,我们会将文件写入一个临时目录,然后将该目录移动到另一个位置作为最终结果。源文件和目录结构和内容不做保留。下面的命令可以完成这些操作。

用例:hdfs dfs -mv oss://<Bucket>.<Endpoint>/Test/subdir oss://<Bucket>.<Endpoint>/Test/subdir1

下载文件到本地文件系统

某些情况下,我们需要将OSS文件系统中的某些文件下载到本地,再进行处理或者查看内容。这个可以用下面的命令完成。

用例:hdfs dfs -get oss://<Bucket>.<Endpoint>/Test/helloworld.txt <localpath>

删除目录/文件

在很多情况下,我们在完成工作后,需要删除在JindoFS服务上的某些临时文件或者废弃文件。这些可以通过下面的命令完成。

用例:hdfs dfs -rm oss://<Bucket>.<Endpoint>/Test/helloworld.txt

参考事例

'''
使用方式:拷贝本脚本到VPC内ECS中目录/root/workspace, 然后执行sh test_hdfs.sh,查看结果是否报错
'''
echo -e "\n\n创建目录lz-test...."
hdfs dfs -mkdir oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/lz-test

echo -e "\n\n查看根目录...."
hdfs dfs -ls oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/

echo -e "\n\n上传文件test.txt...."
echo "hello jack" >> test.txt
hdfs dfs -put test.txt oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/lz-test/test.txt

echo -e "\n\n删除本地测试文件test.txt...."
rm test.txt

echo -e "\n\n查看上传到bucket的文件内容...."
hdfs dfs -cat oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/lz-test/test.txt

echo -e "\n\n下载文件到本地...."
hdfs dfs -get oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/lz-test/test.txt

echo -e "\n\n查看下载到本地的文件内容...."
cat test.txt

echo -e "\n\n删除本地测试文件...."
rm test.txt

echo -e "\n\n删除测试目录lz-test...."
hdfs dfs -rm -R oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/lz-test

echo -e "\n\n查看根目录与子目录...."
hdfs dfs -ls -R oss://luanzhi-hdfs-test-hz.cn-hangzhou.oss-dls.aliyuncs.com/
  1. 更多参考
  • OSS-HDFS服务概述
  • OSS-HDFS服务快速入门

点击立即免费试用云产品 开启云上实践之旅!

原文链接

本文为阿里云原创内容,未经允许不得转载。


数据库知识分享者
27.8k 声望35.7k 粉丝

数据库知识分享