手把手教你使用OSS-HDFS服务平替自建HDFS

简介: 本文主要介绍了OSS-HDFS服务以及使用OSS-HDFS服务平替自建HDFS。

1. 服务介绍


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


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

image.png

数据湖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”

image.png

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

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

image.png


2.1.2 创建云服务器(ECS)

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

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

image.png

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

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

image.png


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

2.2.1 安装Java 环境

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

image.png

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

#卸载已有jdkrpm -qa | grep java | xargs rpm -e--nodeps#安装javayum 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 exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
exportPATH=$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
chmod0600 ~/.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环境变量exportHADOOP_HOME=/usr/local/hadoop
exportPATH=$HADOOP_HOME/bin:$PATH# 更新hadoop配置文件中JAVA_HOMEcd$HADOOP_HOMEvim etc/hadoop/hadoop-env.sh 
# 将JAVA_HOME由原来${JAVA_HOME}换成具体路径,这样在集群环境中才不会出现问题exportJAVA_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
exportHDFS_DATANODE_USER=root 
exportHADOOP_SECURE_DN_USER=hdfs 
exportHDFS_NAMENODE_USER=root 
exportHDFS_SECONDARYNAMENODE_USER=root 
# 查看进程jps

image.png


2.2.4 Hadoop测试

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

image.png

运行一个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

使用范围最广,对象:可任何对象

hadoop dfs

只HDFS文件系统相关

hdfs fs

只HDFS文件系统相关(包括与Local FS间的操作),已经Deprecated

hdfs dfs

只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.单击确定。
image.png

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.单击确定

  1. c. 为角色授予自定义权限策略。
  1. i.在左侧导航栏,选择身份管理>角色
  2. ii.单击RAM角色AliyunOSSDlsDefaultRole右侧的精确授权。
  3. iii.在添加权限页面,选择权限类型为自定义策略,输入已创建的自定义权限策略名称AliyunOSSDlsRolePolicy
  4. iv.单击确定
  1. 2.授权RAM用户访问已开通HDFS服务的Bucket。如果您使用服务角色(例如EMR服务角色AliyunEMRDefaultRole)访问已开通HDFS服务的Bucket,请参见上述为RAM用户授权的步骤完成服务角色授权。
  1. a.创建RAM用户。具体操作,请参见创建RAM用户
  2. b.创建自定义策略,策略内容如下:
{
"Statement": [
        {
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:*/.dlsdata",
"acs:oss:*:*:*/.dlsdata*"            ]
        },
        {
"Effect": "Allow",
"Action": [
"oss:GetBucketInfo",
"oss:PostDataLakeStorageFileOperation"            ],
"Resource": "*"        }
    ],
"Version": "1"}

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

  1. c. 为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
# 文件末尾添加配置后保存exportJINDOSDK_HOME=/usr/lib/jindosdk-4.1.0
exportHADOOP_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 IDAccess 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(cn-xxx.oss-dls.aliyuncs.com),与 OSS 对象接口的 Endpoint(oss-cn-xxx.aliyuncs.com)不同。JindoSDK 会根据配置的 Endpoint 访问 JindoFS 服务 或 OSS 对象接口。

使用 JindoFS 服务时,推荐访问路径格式为:

oss://./

如:oss://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://./Test/subdir

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

image.png


新建文件

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

用例:hdfs dfs -put  oss://./Test

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

image.png


查看文件或者目录信息

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

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

image.png


查看文件的内容

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

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

image.png

复制目录/文件

有时候我们需要将JindoFS服务的一个文件/目录拷贝到另一个位置,并且保持源文件和目录结构和内容不变。用例:hdfs dfs -cp oss://./Test/subdir oss://./TestTarget/sudir2


移动目录/文件

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


下载文件到本地文件系统

某些情况下,我们需要将OSS文件系统中的某些文件下载到本地,再进行处理或者查看内容。这个可以用下面的命令完成。用例:hdfs dfs -get oss://./Test/helloworld.txt


删除目录/文件

在很多情况下,我们在完成工作后,需要删除在JindoFS服务上的某些临时文件或者废弃文件。这些可以通过下面的命令完成。用例:hdfs dfs -rm oss://./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/



3. 更多参考


作者介绍
目录

相关产品

  • 对象存储