专栏名称: 高可用架构
高可用架构公众号。
目录
相关文章推荐
高可用架构  ·  Feed 流系统的架构设计方案 ·  2 天前  
高可用架构  ·  Java方法设计原则与实践:从Effecti ... ·  4 天前  
奇舞精选  ·  vercel是如何做微前端迁移的 ·  6 天前  
奇舞精选  ·  vercel是如何做微前端迁移的 ·  6 天前  
51好读  ›  专栏  ›  高可用架构

未来大数据平台:使用Zeppelin和Spark一键搭建数据分析及可视化平台案例

高可用架构  · 公众号  · 架构  · 2016-11-04 09:09

正文

导读:在互联网时代,所有业务都需要搭建自己的大数据平台集群,目前最有效率的方式就是在公有云平台上,利用已有的脚本以及镜像,可以在几分钟内搭建好一套大数据系统用于开发、测试及线上部署。高可用架构精心挑选一个典型大数据安装使用案例。


随着大数据使用量呈指数增长,许多用户希望在公有云集群上运行 Apache Spark 以及相关软件,以充分利用容器的可移植性和灵活性。 本文介绍在 Kubernetes 1.2 平台环境运行 Spark 和 Zeppelin。


为什么选择 Zeppelin?



Apache Zeppelin 是一个基于 Web 的支持交互式数据分析 notebook。 Zeppelin 允许用户以简单的方式与 Spark 集群进行交互,而无需处理命令行解释器或 Scala 编译器。


Zeppelin 官方网站描述的特性有


  • 数据收集

  • 数据发现

  • 数据分析

  • 数据可视化及协作


为什么选择 Kubernetes?


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


  • 在独立模式下使用专用资源运行

  • 在 YARN 集群上运行,与 Hadoop 和 HDFS 共存

  • 在 Mesos 集群上运行


在 Kubernetes 上运行 Spark 有什么好处?


  • 集群的单一统一接口: Kubernetes 可以管理大量工作负载 ; 无需处理 YARN / HDFS 以进行数据处理,也无需处理其他应用程序的单独容器编排器。

  • 提高服务器利用率:在 Spark 和云本机应用程序之间共享节点。 例如,您可能有一个流应用程序运行 Spark 流水线或一个 Nginx pod 来提供 Web 服务。

  • 工作负载之间的隔离: Kubernetes 的服务质量机制允许您可以同一个节点上做批处理和延迟敏感的服务。


启动 Spark


对于此案例,我们将使用 Google 容器引擎( GKE),然而它也可以在您安装 Kubernetes 集群的任何地方运行。首先,创建一个具有 storage-full 作用域的 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(大于默认节点大小)来演示水平弹性扩展特性。 Spark 的默认节点大小为 n1-standard-1。


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


$ git clone https://github.com/kubernetes/kubernetes.git

$ kubectl create -f kubernetes/examples/spark


'kubernetes/examples/spark' 是一个目录,这个命令告诉 kubectl 在该目录创建所有 YAML 文件中定义的所有 Kubernetes 对象。你不必克隆整个库,但它使这个展示更简单一点。


Pods(尤其是 Apache Zeppelin)比较大,所以 Docker 可能需要一些时间来拉取镜像。 rx1 rm2 一旦一切正常运行,您应该看到类似以下内容:


$ 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 master 和三个 Spark worker。


设置安全代理


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


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


这将建立到 Kubernetes 集群和 pod( zeppelin-controller-t1njl)的安全链接,然后将有问题的端口( 8080)转发到本地端口 8080,这将允许您安全地使用 Zeppelin。


使用 Zeppelin 构建一个推荐模型


现在已经安装好了 Zeppelin,接下来能在上面做些什么?


在我们的示例中,我们将向您展示如何构建一个简单的电影推荐模型。 这是基于 Spark 网站上的代码,稍作修改。


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




点击“ import note”,为其指定任意名称(例如“ Movies”),然后点击“ add from url”。对于 url,请输入:


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


然后点击“ import note”。 你现在应该有一个“ Movies”笔记本(或你输入的任何名字)。 如果您点击该笔记,您应该会看到类似如下的网页:




现在,您可以点击 PySpark 代码块右上角附近的 Play 按钮,您将创建一个新的电影推荐模型!


在应用程序中, Zeppelin 充当 Spark 的驱动程序,与 Spark 集群主机交互以完成其工作。 在这种情况下,在 Zeppelin pod 中运行的驱动程序提取数据并将其发送给 Spark master, Spark master 将其传送给 worker, worker 使用驱动程序中的代码收集电影推荐模型。在下一节中,我们将讨论如何将数据保存到 GCS( Google cloud storage)。


使用 Google Cloud Storage 存储数据


对于下一步,我们将使用 Google Cloud Storage,这样就可以存储我们的模型数据超过一个 pod 的生命周期。 Spark for Kubernetes 是使用内置的 Google Cloud Storage connector 构建的。只要您可以从运行 Kubernetes 节点的 Google Container Engine 项目中的虚拟机访问您的数据,就可以使用 Spark 映像上的 GCS 连接器访问您的数据。


如果需要,您可以更改 note 顶部的变量,程序将实际保存和恢复影片推荐引擎的模型 - 当然需将这些变量指向您有权访问的 GCS bucket。如果你想创建一个 GCS bucket,你可以在命令行上这样做:


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


您需要将此 URI 更改为对您唯一的 URI。


注意:计算模型并保存比计算后丢弃要慢得多。然而,如果计划重用该模型,计算并保存的速度更合算,以后在每次使用模型时恢复模型,而不是每次都丢弃和重新计算模型。


如何在云平台自动弹性水平扩展 Spark 集群?


我们可以使用 Kubernetes Horizontal Pod Autoscaling 自动扩展 Spark worker pool,设置 worker pool 的目标 CPU 阈值和最小/最大值。这避免了必须手动配置工作副本的数量。


这样可以使用自动伸缩功能(注意:如果你没有改变集群的机器类型,你可能想把 -max 限制为更小):


$ kubectl autoscale --min=1 --cpu-percent=80 --max=10 \

  rc/spark-worker-controller


要想查看自动扩展的效果,请等待复制控制器恢复到单副本。使用 'kubectl get rc' 并等待 Spark-worker-controller 上的“ replicas”列回落到 1。


我们之前的程序负载太低,造成弹性伸缩 HPA( horizontal pod autoscaling)远远不能发挥作用。 可以将工作负载改大,就能看到自动扩展出更多的 pods,请将代码中的“ rank = 100”行更改为“ rank = 200.”,执行 play 后, Spark worker pool 应快速增加到 20 个 pod。需要 5 分钟, worker pool 才会下降到一个副本。


结论


在本文中,展示了如何在 Kubernetes 上运行 Spark 和 Zeppelin,以及如何使用 Google Cloud Storage 存储 Spark model 以及如何使用 Horizontal Pod Autoscaling 动态弹性扩展 Spark worker pool 大小。相信其他大数据的平台搭建也可以采用类似的方法。


英文原文:

http://blog.kubernetes.io/2016/03/using-Spark-and-Zeppelin-to-process-Big-Data-on-Kubernetes.html


本文方法基于 Google Cloud 环境,有其他云平台的运行说明文档,欢迎通过公众号菜单「联系我们」进行投稿。转载请注明来自高可用架构「ArchNotes」微信公众号及包含以下二维码。


高可用架构

改变互联网的构建方式


长按二维码 关注「高可用架构」公众号


高可用架构主办 GIAC 全球互联网架构大会特别推出大数据及算法专题,议题方向覆盖大数据平台以及与电商、视频、人工智能等热点方向结合。在 11 月购买还可以享受 7 折早鸟票,点击阅读原文进入购买页面。