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
#卸载已有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
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 |
使用范围最广,对象:可任何对象 |
hadoop dfs |
只HDFS文件系统相关 |
|
|
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.单击确定。
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"}
创建自定义策略的具体操作,请参见创建自定义权限策略。
- 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 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(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
新建文件
利用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
查看文件或者目录信息
在文件或者目录创建完之后,可以查看指定路径下的文件/目录信息。hdfs dfs没有进入某个目录下的概念。在查看目录和文件的信息的时候需要给出文件/目录的绝对路径。指令:ls用例:hdfs dfs -ls oss://./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://./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://./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/