暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Amoro 0.6.0 前瞻,全面适配 Kubernetes 与 S3

Amoro Community 2023-10-27
1280
点击上方蓝字关注我们,了解更多内容

Amoro 是一个构建在 Apache Iceberg 等开放数据湖表格之上的湖仓管理系统,提供了一套可插拔的数据自优化机制和管理服务,旨在为用户带来开箱即用的湖仓使用体验。

01 背景
在 Amoro 0.5.0 版本中,Amoro 对云原生环境的重要组成部分——S3 和 Kubernetes 进行了初步的适配,实现了对云上 Iceberg 表的托管和优化。随后,我们在社区中进行试用推广活动,这些新功能得到了广泛的关注和反馈,社区同学们给出了宝贵的生产环境下的使用经验与建议。
在即将发布的 Amoro 0.6.0 版本中,我们根据社区反馈和生产环境的具体需求,全面优化了在 Kubernetes 和 S3 场景下的使用体验。在接下来的文章中,我们将深入探讨这些改进和优化,以期帮助用户更好地在云原生环境中应用 Amoro,同时也期待读者的宝贵意见和反馈,一起推动 Amoro 在云原生之路上更进一步。

02 Amoro 0.6.0 新功能介绍
## Catalog 注册页面全面支持 S3 存储
在 0.5.0 版本中,Catalog 注册页面是按照 Hadoop + Hive 的应用场景设计的,在注册Catalog 时,Hadoop 配置文件为必选参数,并且必须提供 Hadoop Username 或者配Keytab 文件和 Principal,然而在与 S3 兼容存储的应用场景中,这些都不是必填项。并且 S3 的认证信息只能配置在 Catalog Properties 中,这会导致敏感信息以明文显示。
在 0.6.0 版本中我们优化了 Catalog 注册页面,可以选择不同的存储类型,目前支持 Hadoop/S3 两种选项。

新版登记页面针对 S3 类型的存储登记更加简单,并且对于 SecretKey 做了加密显示。
## 默认二进制分发包支持 s3 与 s3a 协议
在 0.5.0 版本中, release 分发包分为 Hadoop2 和 Hadoop3 两个版本,但是无论哪个分发包都默认不带有 S3 的相关的依赖,如果需要与 S3 存储一起使用,需要从源码添加 -Paws 选项重新编译。但是即使使用 -Paws 编译,也只支持 s3 协议,对于使用 Hive Metastore + Iceberg + S3 的场景,需要使用 s3a 协议,这是一种基于 Hadoop API 访问 S3 兼容的存储系统的方式,如果是这种使用场景,需要额外手动添加 hadoop-aws.jar 到 Classpath 中。
在 0.6.0 版本,默认分发包将附带 AWS S3, Glue 以及 Hadoop-AWS 等相关依赖,用户可以直接基于默认的二进制安装包实现包括但不限于以下S3兼容场景的使用:
  • 对接云上 AWS Glue + Iceberg + S3 方案,为云上湖仓提供管理与自动优化能力。

  • 对接 Hive Metastore + Iceberg + S3 方案, 为基于 Hive Metastore 的云原生湖仓提供管理与自动优化能力。

  • 使用 AMS 作为 Iceberg 元数据中心,直接对接 S3 或 Hadoop 数据湖,构建与云厂商无关的云原生湖仓。

0.6.0 版本将极大的降低 S3 兼任存储系统的使用门槛,帮助用户更好的实现开箱即用的云原生数据湖目标。
## 支持管理 Kubernetes 集群上的 Flink Optimizer
Amoro 一直推荐在生产场景下使用 Flink Optimizer 作为 Amoro Optimizing 任务的执行引擎。但是在 0.5.0 及以前的版本, Amoro 的 Flink Optimizer Container 只提供了 Yarn 上 Optimizer 资源的调度能力,并且只能以 Yarn-Pre-Job 的模式启动  Optimizer。如果需要在 Kubernetes 下使用,需要用户手动向 Kubernetes 集群提交 Flink Optimizer 以 external resource 的方式注册到 AMS。如果用户没有比较易用的 Flink 任务提交平台,这种使用模式还是有一定的门槛的,并且会带来资源管理方面的麻烦。
在 0.6.0 版本中, Amoro 的 Flink Optimizer Container 实现了 Kubernetes 集群上 Flink Optimizer 资源调度能力。通过将 Flink Optimizer Container 的配置项 target 配置为 kubernetes-application , 在AMS的 Optimizer Group 页面 Scala-out 时即可以 kubernetes-application 模式向 Kubernetes 集群提交 Flink Optimizer。
一个 Kubernetes 集群上的 FlinkOptimizerContainer 的配置如下:
    containers:
    - name: flinkContainer
    container-impl: com.netease.arctic.server.manager.FlinkOptimizerContainer
    properties:
    flink-home: opt/flink/ #flink install home
    target: kubernetes-application #flink run as native kubernetes
    job-uri: "local:///opt/flink/usrlib/optimizer-job.jar" #optimizer job location in image
    ams-optimizing-uri: thrift://ams.amoro.service.local:1261 #AMS optimizing uri
    export.FLINK_CONF_DIR: opt/flink/conf/ #flink config dir
    flink-conf.kubernetes.container.image: "arctic163/optimizer-flink:latest" #image ref
    flink-conf.kubernetes.service-account: flink #kubernetes service account


    FlinkOptimizerContainer 的其他优化:
    除了支持 Kubernetes-application 模式外,Flink Optimizer Container 的实现还有一些其他优化可以更好的优化用户的使用体验。
    1.flink-conf 的多级配置的支持
    0.6.0 版本开始,支持在 Optimizer Group 或 Optimizer Container 中以 flink-conf. 前缀配置 Flink 相关参数,并覆盖 FLINK_CONF_DIR/flink-conf.yaml 中的值。优先级为 Optimizer Group 配置 > Optimizer Container 配置> flink-conf.yaml 中的值,这将使得 Flink 的参数配置更加灵活,用户可以很方便的为不同的 Optimizer Group 配置不同的 Flink 配置,比如为每个 Optimizer Group 独立配置 Kubernetes Namespace 以及 Service Account 。
    2.支持 AMS Optimizer URI 配置
    在 0.6.0 版本之前,Optimizer 注册地址是由 AMS 根据 server-expose-host 自动生成的,除了在 Kubernetes 场景下无法使用外,在使用域名的情况下也无法使用,导致 AMS Flink Optimizer 的在线管理能力在生产场景下十分受限。

    从 0.6.0 版本开始,可以直接在 Optimizer Group 中配置独立的 Regiester URI ,除了在 Kubernetes 环境下,在一些其他生产场景中也十分有用。比如在跨 region 调动 Optimizer 资源的情况下,从其他 region 访问 AMS 可能需要使用网关的 IP 地址和端口。

    ## 正式推出官方镜像

    在 0.6.0 版本之前,很多用户在使用 Docker 或 Kubernetes 部署时使用 arctic163/ams 这个镜像部署 AMS 进程。然而这个镜像只是用于在 QuickDemo 中演示 Amoro 的基本功能的,作为生产镜像有两个问题:
    1. 镜像体积过大,为了演示 QuickDemo 镜像中还额外添加了 Flink 分发包以及 Iceberg 和 Mixed-Iceberg Format 的 Flink connector, 整体镜像体积达到了 2.3GB 。

    2. 基础镜像已经被 Deprecated ,Openjdk 镜像官方已经不再维护,并不建议在生产中继续使用。

    从 0.6.0 版本开始,Amoro 将正式开始维护生产可用的镜像 arctic163/amoro ,同时原来的 arctic163/ams 镜像将改名为arctic163/quickdemoarctic163/quickdemo 将会维护以下 tag :
    • 版本tag:如  arcitc163/amoro:0.6.0arctic163/amoro:0.6.0-rc1 ,版本 tag 与 git tag 保持一致,使用默认的 profile 编译。

    • Hadoop 版本 tag:非默认的 Hadoop 版本编译出来的将使用 -hadoop{version} 后缀标识。比如 arctic163/amoro:0.6.0-hadoop2  表示这个镜像使用 -Dhadoop=v2 参数编译。

    • master-snapshot tag:每天会自动拉取 master 分支最新代码构建镜像,如想尝试最新的 feature,可以使用该 tag 获取最新的代码构建镜像。使用方式为  arctic163/amoro:master-snapshot 。master-snapshot 镜像只提供默认的 hadoop 版本编译。

    除了 amoro 镜像外,还额外提供了 arctic163/optimizer-flink 镜像,作为 Flink Optimizer 的官方镜像。其 tag 维护方式为 ${amoro-version}-flink${flink-version}  ,比如:arctic163/optimizer-flink:0.6.0-flink1.15

    此外 quickdemo 的镜像会维护和 amoro 镜像一致的 Tag。

    ## 支持通过 Helm 在 Kubernetes 上部署 AMS 与 Flink Optimizer

    Kubernetes 部署涉及多种 Kubernetes 资源的管理,在 0.6.0 版本之前 Kubernetes 的部署需要用户手动维护这些资源的 yaml 文件,而在 0.6.0 版本中,我们提供了 Helm 部署的 Charts ,可以通过 Helm 在 Kubernetes 一键部署、管理 AMS 服务。

    Helm 是一个 Kubernetes 包管理器,它允许你定义、安装和升级 Kubernetes 应用程序。Helm 允许你将 Kubernetes 应用程序打包成称为 Helm Chart 的可重用组件,并将其共享到 Chart 存储库中以供其他人使用。Helm Chart 包含了一组 Kubernetes 资源定义和值文件,可以配置这些资源定义的参数。使用 Helm,你可以轻松地部署、升级和管理 Kubernetes 应用程序。更多关于 Helm 的信息以及安装方式可以查看 Helm 官方文档 https://helm.sh/docs/

    在安装了 Helm3 客户端后,通过以下命令添加并查看 Amoro 的 Helm Repo。

      $ helm repo add amoro https://netease.github.io/amoro/charts
      $ helm repo list
      NAME URL
      amoro https://netease.github.io/amoro/charts

      通过以下命令搜索 amoro charts,出现以下结果表明添加成功。

        $ helm search repo amoro 
        NAME CHART VERSION APP VERSION DESCRIPTION
        amoro/amoro 0.1.0 master-snapshot A Helm chart for Amoro

        在本文的后续章节,将演示如何通过 Helm Charts 在 Kubernetes 安装 Amoro 实例。


        03 新功能演示:Amoro 与 Kubernetes 集成

        在本章节,将演示如何通过 Helm 部署 Amoro ,并配置 Flink optimizer 和使用新的 Catalog 注册页面等 Amoro 0.6.0 新功能。

        ## 前置环境准备

        为了完成演示,需要完成以下环境准备:

        • 一个 Kubernetes 集群:可以是基于云服务的比如AWS EKS 集群,也可以是基于物理机部署的生产标准的 K8S 集群,或在基于 minikube 在开发机上搭建的 develop 集群。基于 minikube 搭建 Kubernetes 测试集群可以参考这里 https://minikube.sigs.k8s.io/docs/start/

        • Helm3 客户端:Helm 是 Kubernetes 的包管理器,通过 Helm 脚本可以轻易的将一组 Kubernetes 底层资源组织为应用服务。Helm 的安装可以参考这里 https://helm.sh/docs/intro/install/

        • 需要为 Kubernetes 集群准备好 StorageClass 和 IngressClass:如果使用 minikube 部署,默认安装了基于 HostPath 的 StorageClass ,可以通过命令  minikube addons enable ingress   安装基于 Nginx 的 IngressClass, 更多使用方法参考文档 https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/ingress-minikube/ 这里不过多赘述。

        • 数据湖存储服务:可以是基于 Helm 部署的 minio 集群,或是云厂商提供的兼容的 S3 协议的存储服务。
        ## 获取 Amoro Helm Charts

        以通过以下命令从 Amoro 官方仓库获取稳定版本的 Helm charts 。

          # 添加 Amoro 官方 Repo 
          $ helm repo add amoro https://netease.github.io/amoro/charts
          $ helm repo list
          NAME URL
          amoro https://netease.github.io/amoro/charts


          # 搜索 Amoro charts
          $ helm search repo amoro
          NAME CHART VERSION APP VERSION DESCRIPTION
          amoro/amoro 0.1.0 master-snapshot A Helm chart for Amoro


          # 获取 Amoro charts 到本地
          $ helm pull amoro/amoro
          $ tar zxvf amoro-*.tgz

          可以直接从项目源码直接编译 charts.

            $ git clone https://github.com/NetEase/amoro.git
            $ cd amoro/charts
            $ helm dependency build ./amoro

            ## 配置 Amoro 应用

            Amoro Helm Charts 的配置入口是 amoro/values.yaml文件。编辑该文件并修改以下配置:

              $ vim ./amoro/values.yaml


              # 修改 image,默认拉取 latest 镜像,这里编辑tag为 "master-snapshot" 以使用 master 分支的构建镜像
              image:
              repository: arctic163/amoro
              pullPolicy: IfNotPresent
              tag: "master-snapshot"

              # 修改 metastore database 配置,默认配置为 derby 会在容器重启后丢失数据,
              # 生产环境建议改成 MySQL database,并配置正确的连接方式
              amoroConf:
              database:
              type: mysql
              driver: com.mysql.cj.jdbc.Driver
              url: <jdbc-uri>
              username: <mysql-user>
              password: <mysql-password>

              # optimizer 部分会配置可用的 optimizer container. 这里开启 FlinkOptimizer 的配置
              optimizer:
              flink:
              enabled: true
              ## AMS 页面展示的 Optimizer Container Name,这里默认值将会展示为 flink
              name: ~
              ## Flink Optimizer 使用的 Image 相关配置,这里使用官方镜像 arctic163/optimizer-flink
              image:
              repository: arctic163/optimizer-flink
              ## tag 默认值与 amoro 镜像 tag 一致
              tag: ~
              jobUri: "local:///opt/flink/usrlib/optimizer-job.jar"
              # optimizer properties 相关配置,这里推荐将 tm 的堆外内存配置为 32mb
              # 具体配置请参考 https://amoro.netease.com/docs/latest/managing-optimizers/#flink-container
              properties: {
              "flink-conf.taskmanager.memory.managed.size": "32mb",
              "flink-conf.taskmanager.memory.netwrok.max": "32mb",
              "flink-conf.taskmanager.memory.netwrok.nin": "32mb"
              }

              # 配置 Ingress,使得可以从集群外部访问 AMS Dashboard.
              ingress:
              enabled: true
              # ingressClassName,取决于Kubernetes集群安装的 IngressClass,如果有默认实现,可以不配置
              ingressClassName: ""
              # 集群外访问该 Ingress 的域名.
              hostname: amoro.ingress.cluster.local

              注:如果使用的是 minikube 并且配置的 nginx-ingress,需要将 ingress hostname 配置的域名配置到 /etc/hosts, IP 地址为本机地址。

              ## 安装 Amoro 实例

              完成上述配置后,执行以下命令安装 Amoro

                $ helm install amoro-instance ./amoro


                NAME: amoro-instance
                LAST DEPLOYED: Tue Oct 17 19:39:51 2023
                NAMESPACE: default
                STATUS: deployed
                REVISION: 1
                TEST SUITE: None
                NOTES:
                The Amoro Helm chart has been installed!


                If you want to go ams web ui,you can use this cmd forward to local:




                http://amoro.ingress.cluster.local/




                Additional Resources Docs


                ================================================================================================================




                * Documentation: https://amoro.netease.com/docs/0.6.0/
                * Version build Info : https://github.com/NetEase/amoro/releases/tag/v0.6.0




                ================================================================================================================

                执行完成后,可以通过 kubectl 命令观察 kubernetes 资源

                  $ kubectl get all


                  NAME READY STATUS RESTARTS AGE
                  pod/amoro-instance-6bc7fcf866-qdvvg 1/1 Running 0 50s


                  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                  service/amoro-instance-optimizing ClusterIP 10.104.58.41 <none> 1261/TCP 50s
                  service/amoro-instance-rest ClusterIP 10.100.197.15 <none> 1630/TCP 50s
                  service/amoro-instance-table ClusterIP 10.105.33.126 <none> 1260/TCP 50s


                  NAME READY UP-TO-DATE AVAILABLE AGE
                  deployment.apps/amoro-instance 1/1 1 1 50s


                  NAME DESIRED CURRENT READY AGE
                  replicaset.apps/amoro-instance-6bc7fcf866 1 1 1 50s


                  # 查看 ingress 状态
                  $ kubectl get ingress
                  NAME CLASS HOSTS ADDRESS PORTS AGE
                  amoro-instance nginx amoro.ingress.cluster.local 192.168.49.2 80 114s


                  pod 进入running 状态后,访问 ingress 配置的域名,即可查看 Amoro Dashboard 页面。

                  ## 添加 Flink Optimizer

                  进入 Optimizing -> Optimizer Groups 管理页面,点击 Add Group 创建一个新的 Optimizer Group , 在 Container 的下拉框中可以看到 Helm Charts 已经部署好了 Flink Container。这里新增一个 Group 名字为 default。

                  在新增的 Optimizer Group 中,通过 flink-conf 前缀的 Properties 配置 Flink Optimizer 相关的参数。所有 Flink native Kubernetes 相关参数均可以通过此方式配置,具体支持的参数列表请参考:

                  https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/deployment/config/#kubernetes

                  这里通过 flink-conf.jobmanager.memory.process.size 和  flink-conf.taskmanager.memory.process.size  限制 JM 内存和 TM 上每个并发内存大小不超过 1GB 。

                  添加Group 成功后,点击 Scala-out 扩容,设置并发为2,然后通过 kubectl 客户端观察 Kubernetes 上资源。

                    $ kubectl get all


                    NAME READY STATUS RESTARTS AGE
                    pod/amoro-instance-6bc7fcf866-qdvvg 1/1 Running 0 16m
                    pod/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00-6476fbbf5f-hszjt 1/1 Running 0 30s
                    pod/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00-taskmanager-1-1 1/1 Running 0 17s
                    pod/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00-taskmanager-1-2 1/1 Running 0 17s


                    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                    service/amoro-instance-optimizing ClusterIP 10.104.58.41 <none> 1261/TCP 16m
                    service/amoro-instance-rest ClusterIP 10.100.197.15 <none> 1630/TCP 16m
                    service/amoro-instance-table ClusterIP 10.105.33.126 <none> 1260/TCP 16m
                    service/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00 ClusterIP None <none> 6123/TCP,6124/TCP 30s
                    service/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00-rest LoadBalancer 10.103.247.238 <pending> 8081:30909/TCP 30s




                    NAME READY UP-TO-DATE AVAILABLE AGE
                    deployment.apps/amoro-instance 1/1 1 1 16m
                    deployment.apps/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00 1/1 1 1 30s


                    NAME DESIRED CURRENT READY AGE
                    replicaset.apps/amoro-instance-6bc7fcf866 1 1 1 16m
                    replicaset.apps/amoro-optimizer-1nul8hvg269h5qqt83rfkt4c00-6476fbbf5f 1 1 1 30s

                    可以看到 Amoro 通过 Flink native kubernetes 的方式提交了一个任务,flink-cluster-id 为 amoro-optimizer-${optimizer-id} ,  该 Flink Application 包括一个 JM 和 2个 TM 。等待 optimizer 向 AMS 注册成功,即可在 Amoro Dashboard 页面 Optimizing -> Optimizers 子页面查看刚启动的 Optimizer 信息。

                    ## 注册 Catalog

                    直接基于 S3 使用 Iceberg 使用 AMS 作为元数据中心

                    进入 Catalog Tab,点击 + 按钮新增 Catalog ,在 Catalog Type 选择 Internal Catalog , Storage Type 选择 S3, Authentication 选择 AK/SK 。按下图填写相关信息,即可完成 基于 S3 存储的 Iceberg Catalog 注册。

                    使用 Iceberg + Hive Metastore 通过 s3a 协议使用 S3 存储

                    在使用 Hive Metastore 做元数据中心时,可以通过 s3a 协议访问 S3 存储系统。关于 s3a 协议的信息可以参考: https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html

                    在这种方式下,需要在 Hadoop 配置文件中配置 S3 相关的信息。

                    core-site.xml 文件中需要添加如下配置:

                      <?xml version="1.0" encoding="UTF-8"?>
                      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
                      <configuration>
                      <property>
                      <name>fs.s3a.access.key</name>
                      <value> ${access-key} </value>
                      </property>
                      <property>
                      <name>fs.s3a.secret.key</name>
                      <value>${secret-key}</value>
                      </property>
                      <property>
                      <name>fs.s3a.path.style.access</name>
                      <value>true</value>
                      </property>
                      <property>
                      <name>fs.s3a.endpoint</name>
                      <value>https://${s3-api-host}:${s3-api-port}</value>
                      </property>
                      <property>
                      <name>fs.s3a.impl</name>
                      <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
                      </property>
                      <property>
                      <name>fs.s3a.endpoint.region</name>
                      <value>${region}</value>
                      </property>
                      <property>
                      <name>fs.defaultFS</name>
                      <value>s3a://${s3-bucket}/</value>
                      </property>
                      </configuration>

                      在 hive-site.xml 中需要通过 S3A 协议配置 Warehouse 地址

                         <property>
                        <name>hive.metastore.warehouse.dir</name>
                        <value>s3a://${s3-bucket}/user/hive/warehouse</value>
                        </property>

                        并且需要将 hadoop-aws.jar 和 aws-java-sdk-bundle.jar 放置到 HADOOP_HOME/share/hadoop/common/lib/ 目录下。这两个依赖的下载地址为:

                        aws-java-sdk-bundle.jar : https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk-bundle/

                        hadoop-aws.jar : https://repo.maven.apache.org/maven2/org/apache/hadoop/hadoop-aws/

                        其中 hadoop-aws.jar 注意下载与你 Hadoop 版本相匹配的版本。

                        在注册 Catalog 时,Catalog Type 选择 ExternalCatalog ,在 Metastore 中选择 HiveMetastore,Storage Type 选择 Hadoop,上传上述配置了 S3A 协议的 site.xml 文件即可。


                        04 致谢

                        0.6.0 版本的开发过程离不开社区同学的支持,尤其是 Kubernetes 和 S3 相关的功能基本均来自社区开发者的贡献。在此感谢以下同学对 Amoro 云原生功能的贡献。



                        Amoro 新版本试用活动正在进行中。社区在专门的试用群安排 mentor 全程进行一对一辅导,还为试用和贡献的小伙伴精心准备了社区礼包和 Air pods。欢迎大家试用体验 Amoro!

                        END

                        看到这里记得关注、点赞、转发 一键三连哦~

                        精彩回顾:

                        Amoro 0.5.1 版本发布

                        Amoro Mixed Format 上海钢联的构建实时湖仓实践

                        Apache Iceberg + Arctic 构建云原生湖仓实战
                        企查查基于 Apache Iceberg 与 Arctic 构建实时湖仓实践

                        关于 Amoro 的更多资讯可查看:
                        官网:https://amoro.netease.com/
                        源码:https://github.com/NetEase/amoro
                        社群:后台回复【社群】或扫描下方二维码↓,邀你进群


                        点击下方【阅读原文】直达 Amoro 官网


                        文章转载自Amoro Community,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论