Amazon EMR 与 SQL 数据引擎结合,跨入更灵活的数据分析新境界!

542e27e952a6f5fb74f0f4021d6228b3.gif

背景

outside_default.png

Data on Kubernetes

在现代化数据策略的推动下,我们看到越来越多的客户将大数据工作负载从传统的虚拟机迁移到容器化环境。客户被 Kubernetes 所带来的动态扩展、快速构建和资源编排能力所吸引。同时,流行的大数据流和批处理引擎如 Apache Spark、Apache Flink 等也开始支持 Kubernetes 作为资源管理器。

outside_default.png

Amazon EMR on EKS

Amazon EMR on EKS 为 Amazon EMR 提供了部署选项,可让您在 Amazon Elastic Kubernetes Service (Amazon EKS) 上运行开源大数据框架。借助此部署选项,您可以专注于运行分析工作负载,同时 Amazon EMR on EKS 为开源应用程序构建、配置和管理容器。截止至 2024 年 4 月,Amazon EMR on EKS 已经支持 Apache Spark 和 Apache Flink 引擎。

outside_default.png

Apache Kyuubi

Apache Kyuubi 的目标是提供一个高度并发、可扩展且支持多租户的 SQL 引擎,以满足大数据分析的需求。它由 Apache Spark、Apache Flink 和 Trino 等流行计算框架提供支持,提供高效的查询功能。用户可以通过 JDBC/ODBC 访问 Kyuubi,从而能够直接或通过 BI 工具运行 SQL 查询。 Kyuubi 促进资源共享并提供快速响应。它与各种来源无缝集成,包括 Apache Hive/HDFS 等传统数据仓库和 Apache Iceberg、Apache Hudi 和 Delta Lake 等现代 Lakehouse 标准。

Kyuubi 与不同的资源管理器 (包括 K8s 和 YARN) 集成开箱即用,因此这使我们能够轻松地与 EKS 上的 EMR 和 EC2 上的 EMR 集成。在此之前,我们通过《使用 EMR Hue 整合 Apache Kyuubi 提升 Spark SQL 开发效率》一文,来介绍 Apache Kyuubi 和 EMR on EC2 的集成,在此文中,我们会继续探索 Apache Kyuubi 和 EMR on EKS 集成的方式和体验。

8b4c798c5f9217f96d632eb509c89d2e.png

使用 EMR Hue 

整合 Apache Kyuubi 

提升 Spark SQL 开发效率

扫码了解更多

方案搭建步骤

outside_default.png

预置 EMR on EKS 环境

git clone https://github.com/aws-samples/aws-emr-utilities.git
cd aws-emr-utilities/utilities/emr-on-eks-kyuubi

左右滑动查看更多

使用脚本进行工具预置。

使用脚本进行 EMR on EKS 环境预置:

该脚本在 emr 命名空间中设置了一个 EMR on EKS virtual cluster,Kyuubi 组件安装在名为 kyuubi 的单独命名空间中。为了允许 Kyuubi 跨不同命名空间 emr 创建 Spark 集群,该脚本在 emr 命名空间中构建了一个服务帐户 emr-kyuubi,该帐户映射到预构建的 EMR on EKS role emr-containers-role-spark-driver。

使用 kubectl get role -n emr 查看,若环境中没有 emr-containers-role-spark-driver 存在,请将此文件下载, 并运行 kubectl apply -f emr-containers-driver-role.yaml -n emr。

f06a230a92d1775d269a380f29e6cadf.png

 EMR on EKS

环境预置脚本

扫码了解更多

0967129a791fd36ff63485c5d98afd75.png

emr-containers-role-spark-driver文件

扫码了解更多

左右滑动查看更多

outside_default.png

构建包含 Apache Kyuubi 的

EMR on EKS 自定义镜像

注意:下述以 us-east-1 区域为例,其他区域要注意更改到对应 Amazon ECR 镜像仓库的账号,扫描下方二维码获取列表。

800c3251c8dbb2e8a45674e427c08995.png

列表

扫码了解更多

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
AWS_REGION=us-east-1
ECR_URL=$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com


aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 755674844232.dkr.ecr.us-east-1.amazonaws.com
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_URL


# create a new repository in your ECR, **ONE-OFF task**
aws ecr create-repository --repository-name kyuubi-emr-eks --image-scanning-configuration scanOnPush=true


docker buildx build --platform linux/amd64,linux/arm64 \
-t $ECR_URL/kyuubi-emr-eks:emr6.15_kyuubi1.8 \
-f dockers/kyuubi/Dockerfile \
--build-arg SPARK_BASE_IMAGE=755674844232.dkr.ecr.us-east-1.amazonaws.com/spark/emr-6.15.0 \
--build-arg KYUUBI_VERSION=1.8.0 \
--build-arg SPARK_VERSION=3.4.1 \
--build-arg RANGER_VERSION=2.4.0 \
--push .

左右滑动查看更多

从 Docker Engine 23.0 和 Docker Desktop 4.19 开始,Buildx 是默认的构建客户端。但是,如果您使用的是旧版本,可通过扫描下面二维码获取完整的设置说明:docker buildx 完整命令及 Dockerfile 内容。

b849cf9a2923c42433f2f6f2a1c7680a.png

docker buildx 完整命令

扫码了解更多

a79806ae6d97ad16897badd00b3c83ab.png

Dockerfile 内容

扫码了解更多

左右滑动查看更多

outside_default.png

安装 Apache Kyuubi

git clone https://github.com/aws-samples/aws-emr-utilities.git
cd aws-emr-utilities/utilities/emr-on-eks-kyuubi
helm install kyuubi charts/kyuubi -n kyuubi --create-namespace -f charts/my-kyuubi-values.yaml --debug
# check the installation progress
kubectl get all -n kyuubi

左右滑动查看更多

my-kyuubi-values.yaml 文件模板可以通过扫描下方二维码下载。

注意配置 cross namespace service account,如下述文件模板中 17 行开始的示例:

c30aa6575554069265a1f080f5585ec6.png

my-kyuubi-values.yaml 文件模板

扫码了解更多

serviceAccount:
create: false
name: cross-ns-kyuubi

my-kyuubi-values.yaml 文件需要修改的配置项。

repository 的内容改成推送到自己 ECR 仓库的 kyuubi-emr-eks 镜像地址:

replicaCount: 2
image:
  repository: 02173xxx.dkr.ecr.us-west-2.amazonaws.com/kyuubi-emr-eks
  tag: "6.15"

左右滑动查看更多

spark.kubernetes.container.image 参数修改成和上述一样的 kyuubi-emr-eks 镜像地址。

spark.kubernetes.container.image=02173xxx.dkr.ecr.us-west-2.amazonaws.com/kyuubi-emr-eks:6.15

左右滑动查看更多

修改 spark.kubernetes.file.upload.path 参数到您的 Amazon S3 桶下。

outside_default.png

查看 kyuubi namespaces 下的资源

kubectl get all -n kyuubi
NAME           READY   STATUS    RESTARTS   AGE
pod/kyuubi-0   1/1     Running   0          15d
pod/kyuubi-1   1/1     Running   0          134m


NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                  AGE
service/kyuubi-headless        ClusterIP   None             <none>        3309/TCP,10099/TCP,10009/TCP,10010/TCP   16d
service/kyuubi-rest            ClusterIP   10.100.88.166    <none>        10099/TCP                                16d
service/kyuubi-thrift-binary   ClusterIP   10.100.239.139   <none>        10009/TCP                                16d


NAME                      READY   AGE
statefulset.apps/kyuubi   2/2     16d




kubectl describe rolebinding kyuubi-emr -n emr
Name:         kyuubi-emr
............
Role:
  Kind:  Role
  Name:  kyuubi-emr
Subjects:
  Kind            Name             Namespace
  ----            ----             ---------
  ServiceAccount  cross-ns-kyuubi  kyuubi

左右滑动查看更多

outside_default.png

功能验证

1. 登录 Kyuubi Server

kubectl exec -it pod/kyuubi-0 -n kyuubi -- bash

左右滑动查看更多

2. 从 Kyuubi Server 提交任务到 EMR on EKS namespace

/usr/lib/spark/bin/spark-submit \
--master k8s://https://kubernetes.default.svc:443 \
--deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
 local:///usr/lib/spark/examples/jars/spark-examples.jar 100

左右滑动查看更多

查看 SparkPi 的资源运行情况。

kubectl get pod -namespace emr -w
NAME                                                        READY   STATUS    RESTARTS   AGE
org-apache-spark-examples-sparkpi-1dc1958e8b4c5001-driver   1/1     Running   0          8s
spark-pi-0672778e8b4c63ed-exec-1                            1/1     Running   0          3s
spark-pi-0672778e8b4c63ed-exec-2                            1/1     Running   0          3s
spark-pi-0672778e8b4c63ed-exec-3                            1/1     Running   0          3s
spark-pi-0672778e8b4c63ed-exec-4                            1/1     Running   0          3s
spark-pi-0672778e8b4c63ed-exec-5                            1/1     Running   0          3s

左右滑动查看更多

3. 通过 Thrift (HiveServer2 Compatible) 连接到 Kyuubi

./bin/beeline -u 'jdbc:hive2://kyuubi-0.kyuubi-headless.kyuubi.svc.cluster.local:10009?spark.app.name=testdelta' -n hadoop

左右滑动查看更多

成功连接后,可以进行简单的 SQL 验证。

查看库:

0: jdbc:hive2://kyuubi-thrift-binary.kyuubi:10009> show databases;

左右滑动查看更多

ca453e48243d317573f1b6ebf0c1faaf.png

查看表:

0: jdbc:hive2://kyuubi-0.kyuubi- headless.kyuu>SHOW TABLES IN ods;

左右滑动查看更多

ac3a1543722518d75e0d12b10baf19fd.png

查询数据:

select * from customer limit 10;

025047f96c1fba021f1ff038928c745b.png

outside_default.png

配置 Hue 访问 Kyuubi

本文使用 EMR (on EC2) 的 Hue 访问 EKS 部署的 Kyuubi (也可进行额外搭建 Hue) 。首先给 Kyuubi 配置一个负载均衡器,用来建立公网访问方式。

cat <<EOF > kyuubi-loadbalance.yaml
apiVersion: v1
kind: Service
metadata:
  name: kyuubi-loadbalance
  namespace: kyuubi
spec:
  ports:
  - name: thrift-binary
    port: 10009
    protocol: TCP
    targetPort: 10009
  selector:
    app.kubernetes.io/instance: kyuubi
    app.kubernetes.io/name: kyuubi
  type: LoadBalancer
EOF


kubectl apply -f kyuubi-loadbalance.yaml -n kyuubi
kubectl get svc -n kyuubi

左右滑动查看更多

7b378597a27ae64de86a542cbdc0443d.png

SSH 到 EMR on EC2 的 master node 更新 Hue 的 Spark 访问配置 (/etc/hue/conf/hue.ini) ,将 sql_server_host 的地址配置为负载均衡器的地址,将 sql_server_port 配置为 10009。

25d73fede5b689c37503204b402bffae.png

重启 Hue 服务。

sudo systemctl restart hue

访问 Hue 的 SparkSql 时会出现异常。

d141d2733f9a7acf3403ab52021b096c.png

此时 Spark driver 的 pod 状态如下图所示。

33011e3ea4608ffd78562dfe77851ddb.png

进一步查看 Spark driver pod 的 log 会发现如下错误信息。

5f11efeb5684bd83a752abfe4ffa4bf9.png

针对上述问题,Kyuubi 官方提供了两个参数来解决,具体描述请参考配置介绍。这两个参数是在 Kyuubi 1.8.1 版本开始支持。

1.kyuubi.kubernetes.spark.forciblyRewriteDriverPodName.enabled  2.kyuubi.kubernetes.spark.forciblyRewriteExecutorPodNamePrefix.enabled 

0ab10c7a0e750650c1c41186d53dfd36.png

配置介绍

扫码了解更多

7fd1242522be8eabac9451ba636829da.png

更新为:

kyuubi.kubernetes.spark.forciblyRewriteDriverPodName.enabled    true    

kyuubi.kubernetes.spark.forciblyRewriteExecutorPodNamePrefix.enabled    true    

完成后,再次访问 Hue 的 SparkSql 页面,可以正常加载 Database 信息:

50d1229bf88b05409100946aea7c426b.png

查询数据:

select * from customer limit 10;

0fd6420125a45cae97703da822a07575.png

总结

本文探讨了如何将 Apache Kyuubi 和 EMR on EKS 结合,发掘其在数据处理和分析领域的潜力。通过将它们结合起来,我们可以利用 Kyuubi 作为统一的多租户 JDBC 接口,同时充分发挥 EMR on EKS 在大规模数据处理和分析方面的优势。这种结合不仅仅能够提供更强大、更灵活的数据分析平台,同时也为企业提供了更高效的解决方案。

本篇作者

2715cb93aceb2e09e47a6ca91abbea9a.jpeg

张尹

亚马逊云科技技术客户经理,负责企业级客户的架构和成本优化、技术支持等工作。有多年的大数据架构设计、数仓建模等实战经验。

80daa30ae624810b53c6a0300fbac1ad.jpeg

Sunny Fang

亚马逊云科技资深数据分析产品经理,负责亚马逊云科技战略客户的云上数据分析体验,并专注在大数据容器化技术方向的产品定位、推广和项目落地。拥有 10 年以上虚拟化与公有云领域的大数据、机器学习和容器等技术方向的架构优化和技术支持经验。

fbd9adca8c3989f27a44c9f1446c4b29.jpeg

施俊

亚马逊云科技解决方案架构师,主要负责数字金融客户和企业级客户在亚马逊云科技上的架构设计与实施。拥有 10 年以上的金融软件研发和机器学习经验。

d460a3985a7564e6a6524a13cfffe1ca.png

e40c6c271dbb885143989b13d12ea8d5.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

听说,点完下面4个按钮

就不会碰到bug了!

01615a850b1816a920f737d4c3dc072d.gif

点击阅读原文查看博客!获得更详细内容!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值