Iceberg在微软云azure上的部署实践

  • 前言
  • 微软云设置
    • 创建存储账号
    • 创建容器
  • hadoop的配置
    • 添加环境变量
    • 配置文件
    • 相关jar包
    • Azure Blob Storage 存储的支持
  • hive的支持
    • 复制jar包
    • 修改配置
  • spark的支持
    • 复制jar包
    • 配置文件
  • flink的支持
  • trino的支持

前言

本文主要讲解一下iceberg数据湖在微软云azure上面的部署方案,采用的方案是通过hadoop的api写入azure,和之前写入hdfs没有太大区别,只需要配置一下hadoop的配置文件即可。iceberg这里不需要做任何改动。目前支持Azure Blob StorageAzure Data Lake Storage Gen2。此外着重说明一下,azure仅支持hadoop 3.2 以上的版本,否则的会报错 java.io.ioexception no filesystem for scheme : abfss.

微软云设置

创建存储账号

首先我们需要去创建一个微软云的存储账号,具体的方法可以参考官方文档,https://docs.microsoft.com/zh-cn/azure/storage/common/storage-account-create?tabs=azure-portal ,如果我们需要Azure Data Lake Storage Gen2,则需要在创建账户的过程中启用分层命名空间, 具体参考这个 https://docs.microsoft.com/zh-cn/azure/storage/blobs/create-data-lake-storage-account

由于Azure Data Lake Storage Gen2专门针对大数据分析做了优化,并且Azure Data Lake Storage Gen2集成了Azure Blob Storage 的功能,所以我们这里采用了Azure Data Lake Storage Gen2来讲解相关的配置。其相关介绍参考 :https://docs.microsoft.com/zh-cn/azure/storage/blobs/data-lake-storage-introduction

创建容器

接下来创建一个容器,这个容器我个人理解有点namespace的意思,我们可以逻辑上和物理上对数据进行相关的划分,比如我们可以每个业务或者每个数据库指定使用一个容器,用于区分。

比如我这里创建了一个叫做mydatalake的容器.

hadoop的配置

添加环境变量

在${HADOOP_HOME}/etc/hadoop/hadoop-evn.sh中添加

代码语言:javascript
复制
HADOOP_OPTIONAL_TOOLS="hadoop-azure,hadoop-azure-datalake"

配置文件

目前使用的hadoop-3.2.2版本,我们使用最简单的配置,只配置core-site.xml,其实在配置文件只需要配置存储账号和access key就可以了,它会自动访问azure的地址进行读写,

代码语言:javascript
复制
<property>
<name>fs.azure.account.key.${youraccount}.dfs.core.windows.net</name>
<value>${YOUR ACCESS KEY}</value>
</property>

其中youraccount就是你申请的微软云存储的账号,比如我上面申请的baidudatalake , ACCESS KEY也就是帐户访问密钥,如果获取可以参考 :https://docs.microsoft.com/zh-cn/azure/storage/common/storage-account-keys-manage?tabs=azure-portal

但是这个access key是没有受保护的,直接配置在core-site.xml里面,一旦泄露是很危险的,所以我们在生产上需要加密存储。

加密方式如下:我们使用hadoop的命令创建一个加密的文件.

代码语言:javascript
复制

hadoop credential create fs.azure.account.key.youraccount.dfs.core.windows.net -value 123
-provider localjceks://file/home/lmccay/wasb.jceks

其中create后面的参数中,youraccount替换成你的存储账号,--value后面的参数值(比如示例中的123) 替换成你的 access key.之后就会在/home/lmccay/目录下生成一个wasb.jceks文件.

然后在配置文件core-site.xml添加配置。不要明文的在core-site.xml中配置fs.azure.account.key.youraccount.dfs.core.windows.net,上述讲解只是为了增加理解。

代码语言:javascript
复制
<property>
<name>hadoop.security.credential.provider.path</name>
<value>localjceks://file/home/lmccay/wasb.jceks</value>
<description>Path to interrogate for protected credentials.</description>
</property>

为了方便的通过hdfs命令行管理,我们可以配置fs.defaultFS,这样就不用每次都写全路径了.

示例如下:

代码语言:javascript
复制
    <property>
<name>fs.defaultFS</name>
<value>abfss://{your container}@{your account }.dfs.core.windows.net/</value>
</property>

相关jar包

为了方便,我们把azure相关的jar包全部拷贝到 ${HADOOP_HONE}/share/hadoop/common 下面,azure相关的jar包有azure相关的包和wildfly-openssl-1.0.7.Final.jar

Azure Blob Storage 存储的支持

Azure Blob Storage存储我们这暂时不用,不过有用的话可以参考下,其实和Azure Data Lake Storage Gen2配置差不多.

示例如下:

代码语言:javascript
复制

<property>
<name>fs.azure.account.key.{your account}.blob.core.windows.net</name>
<value>{access key}</value>
</property>

&lt;property&gt;
        &lt;name&gt;fs.defaultFS&lt;/name&gt;
    &lt;value&gt;wasbs://{your container}@{your account}.blob.core.windows.net/&lt;/value&gt;
&lt;/property&gt;

线上环境也是用加密的密钥来替换access key。

hive的支持

目前我们并没涉及到相关的hive任务,但是由于在生产中iceberg的元数据是存储到hive的,所以还是需要讲一下.

复制jar包

和hadoop中的配置一样,将上面的jar包复制到hive的${HIVE_HOME}/lib下面。

修改配置

代码语言:javascript
复制
<property>
<name>hive.metastore.warehouse.dir</name>
<value>abfss://{your container}@{your account }.dfs.core.windows.net/user/hive3/warehouse</value>
<description>location of default database for the warehouse</description>
</property>

spark的支持

spark我这里使用的是spark-3.1.2-bin-hadoop3.2版本,请注意需要hadoop的最低版本要求是3.2.

复制jar包

和hadoop中的配置一样,将azure需要的jar包复制到spark的{SPARK_HOME}/jars下面。</p><h3 id="cvmk1" name="%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6">配置文件</h3><p>配置文件和以前操作hdfs一样,不需要特殊修改.我这里给一个示例 在{SPARK_HOME}/conf/spark-defaults.conf中添加

代码语言:javascript
复制
spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.iceberg = org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.iceberg.type = hive
spark.sql.catalog.iceberg.uri = thrift://localhost

flink的支持

flink的集成主要是再通过hadoop api操作的时候,需要集成一下flink-shaded-hadoop的jar包,目前没有合适的hadoop 3.2版本的包,需要自己打包编译一个,具体的地址是 https://github.com/apache/flink-shaded.git ,目前最新版已经移除了hadoop的模块,需要切换到以前的旧的分支,我这里是切换到原来的release-10.0分支,修改hadoop的版本为hadoop 3.2 ,然后重新打包编译,最后得到一个flink-shaded-hadoop-2-uber-3.2.2-10.0.jar的包,替换掉原来的即可。

trino的支持

目前对于trino来说,相对于以前查询hdfs没任何改动,就是配置iceberg connecter的时候,指定的core-site.xml需要从hadoop集群复制过来一份即可。