使用Spark和Zeppelin在Kubernetes 1.2上处理大数据

编者注:这是 系列深入帖子 Kubernetes 1.2的新功能 

随着大数据使用量呈指数级增长,许多Kubernetes客户已经表示有兴趣运行 Apache Spark 在其Kubernetes集群上使用容器的可移植性和灵活性。幸运的是,有了Kubernetes 1.2,您现在可以拥有一个可同时运行Spark和Zeppelin以及其他应用程序的平台。

为什么选择齐柏林飞艇? 

阿帕奇·齐柏林 是基于Web的笔记本,可进行交互式数据分析。 Zeppelin作为其后端之一,连接到Spark。 Zeppelin允许用户以简单的方式与Spark集群进行交互,而无需处理命令行解释器或Scala编译器。

为什么选择Kubernetes? 

在Kubernetes之外有很多方法可以运行Spark:

  • 您可以在独立模式下使用专用资源运行它 
  • 您可以在 集群,与Hadoop和HDFS共同驻留 
  • 您可以在 梅索斯 与其他Mesos应用程序一起集群 

那么,为什么要在Kubernetes上运行Spark?

  • 一个单一,统一的集群接口:Kubernetes可以管理各种工作负载;无需处理YARN / HDFS进行数据处理,也不需要处理其他应用程序的单独容器协调器。 
  • 提高服务器利用率:在Spark和云原生应用程序之间共享节点。例如,您可能正在运行一个流应用程序来运行流Spark管道,或一个Nginx Pod来提供Web流量-无需静态分区节点。 
  • 工作负载之间的隔离:Kubernetes 服务质量 该机制使您可以在与延迟敏感的服务器相同的节点上安全地共同调度批处理工作负载(例如Spark)。 

启动Spark 

在本演示中,我们将使用 Google容器引擎 (GKE),但这在您安装Kubernetes集群的任何地方都可以使用。首先,创建具有完整存储范围的Container Engine集群。这些Google Cloud Platform作用域将使集群能够写入私有Google Cloud Storage Bucket(稍后我们将介绍为什么需要这样做): 

$ gcloud container clusters create spark  - scopes storage-full
--machine-type n1-standard-4

注意 :我们使用n1-standard-4(大于默认节点大小)来演示“水平Pod自动缩放”功能。但是,Spark在默认节点大小为n1-standard-1的情况下工作得很好。

创建集群后,您就可以使用Kubernetes GitHub存储库中的配置文件在Kubernetes上启动Spark:

$ git clone //github.com/kubernetes/kubernetes.git
$ kubectl create -f kubernetes/examples/spark

‘kubernetes/examples/spark’ 是一个目录,因此此命令告诉kubectl创建该目录中所有YAML文件中定义的所有Kubernetes对象。您不必克隆整个存储库,但这使此演示的步骤稍微容易一些。

吊舱(尤其是Apache Zeppelin)有些大,因此Docker可能需要一些时间来提取图像。一旦一切运行起来,您应该会看到类似以下内容的内容:

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
spark-master-controller-v4v4y 1/1 Running 0 21h
spark-worker-controller-7phix 1/1 Running 0 21h
spark-worker-controller-hq9l9 1/1 Running 0 21h
spark-worker-controller-vwei5 1/1 Running 0 21h
zeppelin-controller-t1njl 1/1 Running 0 21h

您会看到Kubernetes正在运行一个Zeppelin实例,一个Spark主数据库和三个Spark工作者。

设置Zeppelin的安全代理 

接下来,您将设置从本地计算机到Zeppelin的安全代理,以便可以从计算机访问群集中运行的Zeppelin实例。 (注意:您需要将此命令更改为在集群上创建的实际Zeppelin吊舱。)

$ kubectl port-forward zeppelin-controller-t1njl 8080:8080

This establishes a secure link to the Kubernetes cluster and pod (zeppelin-controller-t1njl) and then forwards the port in question (8080) to local port 8080, which will allow you to use Zeppelin safely.

现在,我已经启动并运行了齐柏林飞艇,该怎么办? 

对于我们的示例,我们将向您展示如何建立一个简单的电影推荐模型。这是基于代码的 在Spark网站上,对其进行了稍微的修改,使其对Kubernetes变得有趣。 

现在安全代理已启动,请访问 http:// localhost:8080 /。您应该看到这样的介绍页面:

点击“导入便笺”,为其指定一个任意名称(例如“电影”),然后点击“从URL添加”。对于URL,输入:

//gist.githubusercontent.com/zmerlynn/875fed0f587d12b08ec9/raw/6
eac83e99caf712482a4937800b17bbd2e7b33c4/movies.json

然后点击“导入便笺”。这将为您提供本演示的现成的齐柏林飞艇笔记。您现在应该拥有一个“电影”笔记本(或任何您命名的笔记本)。如果单击该注释,应该会看到类似以下的屏幕:

现在,您可以单击PySpark代码块右上角附近的“播放”按钮,然后创建一个新的内存中电影推荐模型!在Spark应用程序模型中,Zeppelin充当 Spark驱动程序,与Spark集群主服务器进行交互以完成其工作。在这种情况下,在Zeppelin窗格中运行的驱动程序将获取数据并将其发送给Spark主站,后者将其分发给工作人员,然后使用来自驱动程序的代码来制作电影推荐模型。如果Google Cloud Storage(GCS)中的数据集较大,那么也很容易从GCS中提取数据。在下一节中,我们将讨论如何将数据保存到GCS。

使用Google云端存储(可选) 

在本演示中,我们将使用Google Cloud Storage,它将使我们能够存储模型数据超出单个pod的使用寿命。 Kubernetes的Spark内置了 谷歌云存储 内置连接器。只要您可以从运行Kubernetes节点的Google容器引擎项目中的虚拟机访问数据,就可以使用Spark映像上的GCS连接器访问数据。

如果需要,可以更改注释顶部的变量,以便该示例实际保存和还原电影推荐引擎的模型-只需将这些变量指向您可以访问的GCS存储桶即可。如果要创建GCS存储桶,可以在命令行上执行以下操作:

$ gsutil mb gs://my-spark-models

您需要将此URI更改为您唯一的名称。这将创建一个可以在上面的示例中使用的存储桶。

注意: 计算模型并保存它比计算模型并丢弃它要慢得多。这是预期的。但是,如果您打算重用模型,则计算模型并保存并在每次要使用时将其还原的速度要快于每次抛弃并重新计算模型的速度。

将水平Pod自动缩放与Spark配合使用(可选) 

Spark对来往的工人具有一定的弹性,这意味着我们有机会:我们可以利用使用 Kubernetes水平Pod自动缩放 自动扩展Spark工作者池,设置工作者的目标CPU阈值和最小/最大池大小。这消除了必须手动配置工作副本的数量的需求。

像这样创建Autoscaler(注意:如果您不更改集群的计算机类型,则可能希望将--max限制为较小的值): 

$ kubectl autoscale  - min=1  - cpu-percent=80  - max=10 \
  rc/spark-worker-controller

To see the full effect of autoscaling, wait for the replication controller to settle back to one replica. Use ‘kubectl get rc’ and wait for the “replicas” column on spark-worker-controller to fall back to 1.

我们之前运行的工作负载运行得太快,以至于HPA对此非常感兴趣。要将工作负载实际运行足够长的时间以使自动缩放生效,请将代码中的“ rank = 100”行更改为“ rank = 200”。打完游戏后,Spark工作者池应迅速增加到20个豆荚。作业完成后,最多需要5分钟才能使工作池回退到一个副本。

结论

在本文中,我们向您展示了如何在Kubernetes上运行Spark和Zeppelin,以及如何使用Google Cloud Storage存储您的Spark模型以及如何使用Horizo​​ntal Pod Autoscaling动态调整Spark工作池的大小。

这是我们将发表的系列文章的第一篇,该系列文章介绍如何在Kubernetes上运行大数据框架-请继续关注!

请加入我们的社区,并帮助我们打造Kubernetes的未来!有很多参与方式。如果您对Kubernetes和大数据特别感兴趣,那么您将对:

 -- Zach Loafman,Google软件工程师