TUTORIALS
详细教程:Amazon EKS 上部署和运行 Xorbits
Chengjie Li 2023.02.08

Amazon EKS 是一项托管 Kubernetes 服务,用于在 AWS Cloud 和本地数据中心上运行 Kubernetes。 作为一种标准的云原生解决方案,EKS 已经成为部署服务的主流选择。 本篇教程将帮助你快速熟悉如何在 EKS 上部署和运行 Xorbits,进而通过一个有趣的例子对提交的代码进行分析。 话不多说,现在开始~

准备EKS集群

安装 kubectl

kubectl 是一个命令行工具,用于与 Kubernetes API 服务器进行通信,你可以用它方便地管理你的 Kubernetes 集群。

参考 安装教程 来安装 kubectl

安装 eksctl

eksctl 是用于创建和管理 Amazon EKS 上 Kubernetes 集群的简单命令行工具。相较于 AWS 控制台,它提供一些直观的选项以创建和管理你的 EKS 集群。

参考 安装教程 来安装 eksctl

创建 EKS 集群

参考 创建集群 以使用 eksctl 命令行工具创建一个 EKS 集群。

注意,本篇教程中使用 Dockerhub 中的官方镜像,请确保你所创建的 EKS 集群可以访问该命名空间。

默认选项下,由 eksctl 创建的 EKS 集群拥有公共网络的访问权限。关于 eksctl 更多详细的网络配置选项,参阅 eksctl 文档

安装 AWS Load Balancer

最后一步是在 EKS 中安装 AWS Load Balancer, 参考 AWS Load Balancer文档。 Xorbits 基于 Ingress 暴露服务地址,无论你的 EKS 集群资源来自 AWS Fargate 还是 AWS EC2Ingress服务都将为 Xorbits 代理出一个地址。

部署 Xorbits

现在你拥有一个 EKS 集群,下面开始部署 Xorbits。部署过程相当简单:

  1. 安装 Xorbits 0.1.1 或以上版本,以及 Kubernetes SDK 和 S3 相关依赖
    $ pip install 'xorbits[kubernetes,aws]>=0.1.1'
    
  2. 部署代码
    from kubernetes import config
    from xorbits.deploy.kubernetes import new_cluster
    cluster = new_cluster(
     config.new_client_from_config(), 
     worker_num=5, 
     worker_cpu=16, worker_mem='128g', 
     supervisor_cpu=4, supervisor_mem='8g')
    

大功告成!部署代码运行完成,则你能在控制台看到形如 Xorbits endpoint http://<ingress_service_ip>:80 is ready! 的日志。 这表示一个包含 1 个 supervisor 和 5 个 worker 的 Xorbits 集群已存在于你的 EKS 中。

Xorbits 部署接口依赖 Kubernetes API 客户端,它从 config.new_client_from_config() 接口创建而来。 因此,如果你有多个 Kubernetes 环境,请确保当前 kubectl 指向的集群是你要部署的 EKS 集群。运行以下命令可以检查:

$ kubectl config current-context

管理 Xorbits 集群

获取 Xorbits 命名空间

$ kubectl get namespaces

Kubernetes 中的 Xorbits 命名空间以 xorbits-ns- 开头,后接一个随机字符串。例如:

$ kubectl get namespaces
NAME                                          STATUS   AGE
default                                       Active   38d
kube-node-lease                               Active   38d
kube-public                                   Active   38d
kube-system                                   Active   38d
xorbits-ns-cc53e351744f4394b20180a0dafd8b91   Active   4m5s

最后一行就是 Xorbits 的命名空间。每部署一次 Xorbits,都会生成独一无二的命名空间。 所有 Xorbits 相关的资源都将存在于它的命名空间中,方便管理。多个命名空间一般通过第三列 AGE 加以区分,表示存活时间。

检查 Xorbits pods 状态

$ kubectl get po -n <your_namespace>

例如:

$ kubectl get po -n xorbits-ns-cc53e351744f4394b20180a0dafd8b91
NAME                                 READY   STATUS    RESTARTS   AGE
xorbitssupervisor-7589b8ff4b-2kw9j   1/1     Running   0          5m23s
xorbitsworker-5f8db4f798-b9xlk       1/1     Running   0          5m22s
xorbitsworker-5f8db4f798-hx2zx       1/1     Running   0          5m22s
xorbitsworker-5f8db4f798-jzxm6       1/1     Running   0          5m22s
xorbitsworker-5f8db4f798-pr9lc       1/1     Running   0          5m22s
xorbitsworker-5f8db4f798-xlc25       1/1     Running   0          5m22s

对于 supervisorworker,pod 名称分别以 xorbitssupervisorxorbitsworker 开头。

Pod 启动过程中若产生任何错误,则可以通过 kubectl 命令支持的方式查看和调试。 例如,用kubectl describe pod <pod_name> 命令查看 Pod 的状态信息和用 kubectl logs <pod_name> 命令查看 Pod 日志。Xorbits 完全兼容原生 kubectl 的任何使用方式。

检查 Xorbits 地址

$ kubectl get ingress -n <your_namespace>

例如:

$ kubectl get ingress -n xorbits-ns-cc53e351744f4394b20180a0dafd8b91
NAME              CLASS   HOSTS   ADDRESS                                                                  PORTS   AGE
xorbits-ingress   alb     *       k8s-xorbitsn-xorbitsi-25a70c9131-156674448.us-east-2.elb.amazonaws.com   80      5m28s

Xorbits 在 EKS 中的服务地址通过 Ingress 暴露。该地址展示在 ADDRESS 列中。 此地址与上文中部署后控制台上日志中的地址一样。 你可以直接在浏览器中打开它以查看 Xorbits 集群的网页,或在 xorbits.init() 接口中使用以向集群提交任务。例如:

import xorbits

xorbits.init('http://<ingress_service_ip>:80')

# your codes here, for example:
import xorbits.pandas as pd
print(pd.DataFrame({'col': [1, 2, 3]}).sum())

检查 Xorbits 网页

Xorbits 网页的地址即为 Ingress 服务代理出来的地址。网页提供了集群相关信息的总览,如集群状态、CPU和内存资源使用量和总量、会话监控和任务状态等等。例如:

ui_workers

该页面展示了所有 worker 的状态、资源使用量和总量信息。

销毁 Xorbits 集群

你可以简单地将 Xorbits 的命名空间删除,与该 Xorbits 集群相关的所有资源会一并释放。

$ kubectl delete namespace <your_namespace>

运行示例

这里我们提供一个使用 Xorbits 的示例,它从 AWS S3 上读取 MovieLens 数据集, 处理并计算这些数据,最后产生一个简单的数据分析结果。 为此你的 EKS 集群需要能够访问 PyPI,同时 Xorbits 集群需要在部署前需要安装 s3fs 依赖,这可以通过部署接口的pip选项实现。 部署示例代码如下所示,需要 Xorbits v0.1.1 及以上版本。例如:

from kubernetes import config
from xorbits.deploy.kubernetes import new_cluster
cluster = new_cluster(
    config.new_client_from_config(), 
    worker_num=5, 
    worker_cpu=4, worker_mem='16g', 
    supervisor_cpu=4, supervisor_mem='8g', 
    pip=['s3fs'])

数据分析代码如下,请确保你的 EKS 集群能够访问数据所在的 AWS S3 桶。你可以在 这里 下载完整数据集。

import xorbits
import xorbits.pandas as pd

xorbits.init('<your Xorbits endpoint>')

storage_options = {
    "key": "<your AWS access key id>",
    "secret": "<your AWS secret access key>",
}

bucket = "s3://<your S3 bucket>/"

movies = pd.read_csv(
    bucket + "movies.csv", 
    storage_options=storage_options)

ratings = pd.read_csv(
    bucket + "ratings.csv", 
    storage_options=storage_options)

movie_ratings = ratings.groupby(
    'movieId', as_index=False)\
    .agg({'rating': ['mean', 'count']})
movie_ratings.columns = ['movieId', 'rating', 'count']
movie_ratings = movie_ratings[movie_ratings['count'] > 100]
top_100_movies = movie_ratings.sort_values(
    'rating', ascending=False)[:100]
top_100_movies_detail = \
    top_100_movies.merge(movies[['movieId', 'title']])

print(top_100_movies_detail)

此代码对有 100 个及以上打分记录的电影进行了统计,输出评分由高到低的 100 部电影的信息。 输出如下:

    movieId    rating  count                                              title
0    171011  4.483096   1124                             Planet Earth II (2016)
1    159817  4.464797   1747                                Planet Earth (2006)
2       318  4.413576  81482                   Shawshank Redemption, The (1994)
3    170705  4.398599   1356                            Band of Brothers (2001)
4    171495  4.326715    277                                             Cosmos
..      ...       ...    ...                                                ...
95    48516  4.121237  25343                               Departed, The (2006)
96      903  4.120822  15945                                     Vertigo (1958)
97     1280  4.120717   3181  Raise the Red Lantern (Da hong deng long gao g...
98      260  4.120189  68717          Star Wars: Episode IV - A New Hope (1977)
99   191997  4.117021    329                   The Hounds of Baskerville (2012)

[100 rows x 4 columns]

你可以打开 Xorbits 网页来分析刚才执行的示例代码。在 Sessions -> Task ID 页面,你能够看到示例代码的执行图。如果有多个会话和任务,最新生成的总是在页面最下方。如下图:

task_graph

Supervisors / Workers -> endpoint -> LOGS 页面,你能看到 Xorbits 执行过程中的日志。 EKS 中的 Xorbits 默认开启了 DEBUG 级别的日志,你可以通过该页面右上方的 SAVE 按钮下载这些日志。

logs

尽情探索 Xorbits 网页的各个部分和各种功能,我们也会持续增强网页的能力。

总结

本教程对如何在 Amazon EKS 中部署、管理和运行 Xorbits 进行了详细的解释, 同时通过一个简单的数据分析示例展示如何将代码提交至部署后的 Xorbits 集群运行, 进而借助 Xorbits 网页展示诸如执行图和运行日志的集群详细信息。 Xorbits 旨在部署和运行上尽可能友好、直观和高效。我们期待您的使用和反馈!


Copyright © 2024 杭州未来速度科技有限公司