1. 引入
云上对象存储的廉价让不少公司将其作为主要的存储方案,而Hudi作为数据湖解决方案,支持对象存储也是必不可少。之前AWS EMR已经内置集成Hudi,也意味着可以在S3上无缝使用Hudi。当然国内用户可能更多使用阿里云OSS作为云上存储方案,那么如果用户想基于OSS构建数据湖,那么Hudi是否支持呢?随着Hudi社区主分支已经合并了支持OSS的PR,现在只需要基于master分支build版本即可,或者等待下一个版本释出便可直接使用,经过简单的配置便可将数据写入OSS。
2. 配置
2.1 pom依赖
需要额外添加的主要pom依赖如下
<dependency>
<groupId>
org.apache.hadoop
</groupId>
<artifactId>
hadoop-aliyun
</artifactId>
<version>
3.2.1
</version>
</dependency>
<dependency>
<groupId>
com.aliyun.oss
</groupId>
<artifactId>
aliyun-sdk-oss
</artifactId>
<version>
3.8.1
</version>
</dependency>
2.2 core-site.xml配置
若需访问OSS,需要修改core-site.xml,关键配置如下
<property>
<name>
fs.defaultFS
</name>
<value>
oss://bucketname/
</value>
</property>
<property>
<name>
fs.oss.endpoint
</name>
<value>
oss-endpoint-address
</value>
<description>
Aliyun OSS endpoint to connect to.
</description>
</property>
<property>
<name>
fs.oss.accessKeyId
</name>
<value>
oss_key
</value>
<description>
Aliyun access key ID
</description>
</property>
<property>
<name>
fs.oss.accessKeySecret
</name>
<value>
oss-secret
</value>
<description>
Aliyun access key secret
</description>
</property>
<property>
<name>
fs.oss.impl
</name>
<value>
org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem
</value>
</property>
3. 源码
示例源码如下
import
org
.
apache
.
hudi
.
QuickstartUtils
.*;
import
org
.
apache
.
spark
.
api
.
java
.
JavaSparkContext
;
import
org
.
apache
.
spark
.
sql
.
Dataset
;
import
org
.
apache
.
spark
.
sql
.
Row
;
import
org
.
apache
.
spark
.
sql
.
SparkSession
;
import
java
.
io
.
IOException
;
import
java
.
util
.
List
;
import
static
org
.
apache
.
hudi
.
QuickstartUtils
.
convertToStringList
;
import
static
org
.
apache
.
hudi
.
QuickstartUtils
.
getQuickstartWriteConfigs
;
import
static
org
.
apache
.
hudi
.
config
.
HoodieWriteConfig
.
TABLE_NAME
;
import
static
org
.
apache
.
spark
.
sql
.
SaveMode
.
Overwrite
;
public
class
OssHudiDemo
{
public
static
void
main
(
String
[]
args
)
throws
IOException
{
SparkSession
spark
=
SparkSession
.
builder
().
appName
(
"Hoodie Datasource test"
)
.
master
(
"local[2]"
)
.
config
(
"spark.serializer"
,
"org.apache.spark.serializer.KryoSerializer"
)
.
config
(
"spark.io.compression.codec"
,
"snappy"
)
.
config
(
"spark.sql.hive.convertMetastoreParquet"
,
"false"
)
.
getOrCreate
();
JavaSparkContext
jsc
=
new
JavaSparkContext
(
spark
.
sparkContext
());
String
tableName
=
"hudi_trips_cow"
;
String
basePath
=
"/tmp/hudi_trips_cow"
;
DataGenerator
dataGen
=
new
DataGenerator
();
List
<
String
>
inserts
=
convertToStringList
(
dataGen
.
generateInserts
(
10
));
Dataset
<
Row
>
df
=
spark
.
read
().
json
(
jsc
.
parallelize
(
inserts
,
2
));
df
.
write
().
format
(
"org.apache.hudi"
).
options
(
getQuickstartWriteConfigs
()).
option
(
TABLE_NAME
,
tableName
).
mode
(
Overwrite
).
save
(
basePath
);
Dataset
<
Row
>
roViewDF
=
spark
.
read
().
format
(
"org.apache.hudi"
).
load
(
basePath
+
"/*/*/*"
);
roViewDF
.
registerTempTable
(
"hudi_ro_table"
);
spark
.
sql
(
"select * from hudi_ro_table"
).
show
(
false
);
spark
.
stop
();
}
}
即先写入OSS,下图可以看到OSS的Bucket中已经成功写入了数据,然后再通过spark查询写入的结果。
部分查询结果如下
|20200421205942 |20200421205942_2_10 |6fd496f8-ebee-4f67-8f86-783ff3fed3ab|asia/india/chennai |1f71bed9-833b-4fca-8b4b-4cd014bdf88a-0_2-22-30_20200421205942.parquet|0.40613510977307 |0.5644092139040959 |driver-213|0.798706304941517 |0.02698359227182834|17.851135255091155|asia/india/chennai |rider-213|0.0|6fd496f8-ebee-4f67-8f86-783ff3fed3ab|
所有源代码已经上传至https://github.com/leesf/oss-hudi-demo
4. 最后
本篇文章很简单,只用作展示如何通过Hudi将数据写入OSS。当数据写入OSS后,便可打通阿里云上几乎所有产品,这使得基于阿里云技术栈进行数据湖分析将变得非常简单,比如使用DLA(Data Lake Analytics),对标AWS的Athena,对Hudi数据集进行分析查询,一体化的流程会让分析变得异常简单。