V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
Tenxcloud10
V2EX  ›  云计算

搭建 Spark 集群?没想到你是这样的 k8s

  •  
  •   Tenxcloud10 · 2016-08-24 10:36:43 +08:00 · 3950 次点击
    这是一个创建于 3046 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在本文的例子中,你将使用 Kubernetes 和 Docker 创建一个功能型 Apache Spark 集群。

    你将使用 Spark standalone 模式 安装一个 Spark master 服务和一组 Spark workers 。

    对于已熟悉这部分内容的读者,可以直接跳到 tl;dr 章节。

    源代码

    Docker 镜像主要基于 https://github.com/mattf/docker-spark 。 源码托管在 https://github.com/kubernetes/application-images/tree/master/spark

    步骤零:准备工作

    本示例假定你已经具备以下条件:

    ● 有已安装并运行的 kubernetes 集群。 ● 已在某个 path 路径中安装了 kubectl 命令行工具。 ● 已运行了一个 spark-master 的 k8s service ,可以使用‘ spark-master ’域名在 kube DNS 实例中自动发现该服务。

    更多详细内容可在源码的 Dockerfile 中查看。

    第一步:创建命名空间

    $ kubectl create -f examples/spark/namespace-spark-cluster.yaml
    

    现在列出所有命名空间:

    $ kubectl get namespaces
    NAME          LABELS             STATUS
    default       <none>             Active
    spark-cluster name=spark-cluster Active
    

    对于 kubectl 客户端使用的命名空间,我们定义一个环境并使用它:

    $ kubectl config set-context spark --namespace=spark-cluster --cluster=${CLUSTER_NAME} --user=${USER_NAME}
    $ kubectl config use-context spark
    

    你可以在 Kubernetes 配置文件~/.kube/config 中查看集群名称以及用户名称。

    第二步:启动你的 master 服务

    Master service 是 Spark 集群的 master 服务。 使用 examples/spark/spark-master-controller.yaml 文件来创建一个 replication controller 运行 Spark Master 服务。

    $ kubectl create -f examples/spark/spark-master-controller.yaml
    replicationcontroller "spark-master-controller" created
    

    然后,用 examples/spark/spark-master-service.yaml 文件来创建一个逻辑上的服务端点, Spark workers 可以使用该服务来访问 Master pod

    $ kubectl create -f examples/spark/spark-master-service.yaml
    service "spark-master" created
    

    然后你可以为 Spark Master WebUI 创建一个服务:

    $ kubectl create -f examples/spark/spark-webui.yaml
    service "spark-webui" created
    

    查看 Master 是否能运行和可访问

    $ kubectl get podsNAME                            READY     STATUS    RESTARTS   AGEspark-master-controller-5u0q5   1/1       Running   0          8m
    

    检查日志以查看 master 的状态。(使用上一条指令输出的 pod 名称)

    {{{$ kubectl logs spark-master-controller-5u0q5
    starting org.apache.spark.deploy.master.Master, logging to /opt/spark
    -1.5.1-bin-hadoop2.6/sbin/../logs/spark--org.apache.spark.deploy.master.
    - Master-1-spark-
    master-controller-g0oao.out
    Spark Command: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp /
    opt/spark-1.5.1-bin-hadoop2.6/sbin/../conf/:/opt/spark-1.5.1-bin-
    hadoop2.6/lib/spark-assembly-1.5.1-hadoop2.6.0.jar:/opt/spark-1.5.1
    -bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar:/opt/spark-1.5.1-bin
    - -hadoop2.6/lib/datanucleus-core-3.2.10.jar:/opt/spark-1.5.1-bin-
    - hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar -Xms1g -Xmx1g org.apache.spark.deploy.master.Master --ip spark-master --port 7077
    -  --webui-port 8080
    ========================================
    15/10/27 21:25:05 INFO Master: Registered signal handlers for 
    [TERM, HUP, INT]
    15/10/27 21:25:05 INFO SecurityManager: Changing view acls to: root
    15/10/27 21:25:05 INFO SecurityManager: Changing modify acls to: root
    15/10/27 21:25:05 INFO SecurityManager: SecurityManager: authentication 
    disabled; ui acls disabled; users with view permissions: Set(root); users with 
    modify permissions: Set(root)
    15/10/27 21:25:06 INFO Slf4jLogger: Slf4jLogger started
    15/10/27 21:25:06 INFO Remoting: Starting remoting
    15/10/27 21:25:06 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkMaster@spark-master:7077]
    15/10/27 21:25:06 INFO Utils: Successfully started service 'sparkMaster' on port 
    7077.
    15/10/27 21:25:07 INFO Master: Starting Spark master at spark://spark-master:
    7077
    15/10/27 21:25:07 INFO Master: Running Spark version 1.5.1
    15/10/27 21:25:07 INFO Utils: Successfully started service 'MasterUI' on 
    port 8080.
    15/10/27 21:25:07 INFO MasterWebUI: Started MasterWebUI at http://
    spark-master:8080
    15/10/27 21:25:07 INFO Utils: Successfully started service on port 6066.
    15/10/27 21:25:07 INFO StandaloneRestServer: Started REST server for
     submitting applications on port 6066
    15/10/27 21:25:07 INFO Master: I have been elected leader! New state: ALIVE}}}
    

    确认 master 正常运行后,你可以使用 k8s 集群代理访问 Spark WebUI :

    kubectl proxy --port=8001
    

    此时可以通过 http://localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-webui/访问 UI

    第三步:启动 Spark workers

    Spark workers 在 Spark 集群中扮演十分重要的角色。他们为程序提供执行资源和数据缓存功能。

    Spark workers 需要 Master service 处于运行状态。

    使用 examples/spark/spark-worker-controller.yaml 文件创建一个 replication controller 来管理 worker pods 。

    $ kubectl create -f examples/spark/spark-worker-controller.yaml
    replicationcontroller "spark-worker-controller" created
    

    查看 workers 是否正常运行

    如果你启动 Spark WebUI ,当 worker 就绪后应该出现在 UI 中。(这可能需要一些时间来拉取镜像并启动 pods 。)你也可以用以下方式查询状态:

    $ kubectl get pods
    NAME                            READY     STATUS    RESTARTS   AGE
    spark-master-controller-5u0q5   1/1       Running   0          25m
    spark-worker-controller-e8otp   1/1       Running   0          6m
    spark-worker-controller-fiivl   1/1       Running   0          6m
    spark-worker-controller-ytc7o   1/1       Running   0          6m
    $ kubectl logs spark-master-controller-5u0q5
    [...]
    15/10/26 18:20:14 INFO Master: Registering worker 10.244.1.13:53567 
    with 2 cores, 6.3 GB RAM
    15/10/26 18:20:14 INFO Master: Registering worker 10.244.2.7:46195
     with 2 cores, 6.3 GB RAM
    15/10/26 18:20:14 INFO Master: Registering worker 10.244.3.8:39926 
    with 2 cores, 6.3 GB RAM
    

    假如上一节中 kubectl proxy 仍在运行,你应该也能在 UI 中看到 workers 。注: UI 将含有到 worker Web UI 的超链接。 这些链接是不能正常工作的(链接将尝试连接到集群 IP ,而 Kubernetes 不会自动代理的集群 IP )。

    第四步:在 Spark 集群中启动 Zeppelin UI 来加载工作任务

    Zeppelin UI pod 可以用来在 Spark 集群加载 jobs ,加载操作既可以通过 web 端的笔记本完成,也可以通过传统的 Spark 命令行方式完成。更多细节见 Zeppelin 和 Spark architecture 架构。

    $ kubectl create -f examples/spark/zeppelin-controller.yaml
    replicationcontroller "zeppelin-controller" created
    

    Zeppelin 需要 Master service 处于运行状态。

    查看 Zeppelin 是否正常运行

    $ kubectl get pods -l component=zeppelin
    NAME                        READY     STATUS    RESTARTS   AGE
    zeppelin-controller-ja09s   1/1       Running   0          53s
    

    第五步:操作集群

    现在你有两个选择:可以通过图形界面访问 Spark 集群,也可以保持使用 CLI 。

    快速使用 pyspark

    使用 kubectl exec 连接到 Zeppelin 驱动并运行 pipeline 。

    使用 kubectl exec 连接到 Zeppelin 驱动并运行 pipeline 。

    $ kubectl exec zeppelin-controller-ja09s -it pyspark
    Python 2.7.9 (default, Mar  1 2015, 12:57:24)
    [GCC 4.9.2] on linux2
    Type "help", "copyright", "credits" or "license" for more
     information.
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /__ / .__/\_,_/_/ /_/\_\   version 1.5.1
          /_/
    Using Python version 2.7.9 (default, Mar  1 2015 12:57:24)
    SparkContext available as sc, HiveContext available as sqlContext.
    >>> sc.textFile("gs://dataflow-samples/shakespeare/*").map
    (lambda s: len(s.split())).sum()
    939193
    

    恭喜你,你把所有莎士比亚戏剧中的单词个数统计出来了。

    使用图形界面,亮瞎你的眼!

    使用之前创建的 Zeppelin pod ,设置 WebUI 的转发端口:

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

    这条指令将访问 localhost 8080 端口的请求转发到容器中的 8080 端口。然后你可以通过 https://localhost:8080/ 访问 Zeppelin 。

    创建一个“ New Notebook ”。在其中输入:

    %pyspark
    print sc.textFile("gs://dataflow-samples/shakespeare/*").map
    (lambda s: len(s.split())).sum()
    

    结论

    现在你已为 Spark master , Spark workers 和 Spark driver 创建了 service 和 replication controller 。你可以用这个例子来进行下一步,并开始使用刚才创建的 Apache Spark 集群,更多信息见 Spark 文档。

    ** tl;dr**

    kubectl create -f examples/spark
    

    设置后:

    kubectl get pods # Make sure everything is running
    kubectl proxy --port=8001 # Start an application proxy, if you want
     to see the Spark Master WebUI
    kubectl get pods -lcomponent=zeppelin # Get the driver pod to interact
     with.
    

    此时 Master UI 可以通过 http://localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-webui/访问。

    你可以通过 kubectl exec 使用传统的 spark-shell / spark-subsubmit / pyspark 命令行与 Spark 集群进行交互,或者如果你想与 Zeppelin 交互:

    kubectl port-forward zeppelin-controller-abc123 8080:8080 &
    kubectl port-forward zeppelin-controller-abc123 8080:8080 &
    

    然后访问 http://localhost:8080/

    使用 Spark 的已知问题

    ● 该方案提供了一个仅限于集群网络的 Spark 配置,这意味着 Spark master 只能通过集群 service 访问。如果你需要在 zeppelin pod 中使用除了 Zeppelin 或 spark-submit 之外的外部客户端来提交 jobs ,你需要为客户端提供一种访问 examples/spark/spark-master-service.yaml 的方式。参见 service 以了解更多信息。

    使用 Zeppelin 的已知问题

    ● Zeppelin pod 很大,因此拉取镜像可能会消耗一段时间,拉取速度取决于你的网络条件。 Zeppelin pod 的尺寸是我们正要解决的问题,详见问题# 17231 。 ● 第一次运行 Zeppelin 时, pipeline 可能会花费很多时间(约一分钟)。似乎需要相当多的时间来加载。 ● 在 GKE 环境中, kubectl port-forward 不可能长时间保持稳定状态。如果你发现 Zeppelin 变成断开状态, port-forward 很可能出现故障,并需要重启。详见# 12179 。

    本文由时速云翻译,如若转载,需注明转载自“时速云

    原文链接: https://github.com/kubernetes/kubernetes/blob/release-1.3/examples/spark/README.md

    4 条回复    2016-08-24 16:40:22 +08:00
    malaohu
        1
    malaohu  
       2016-08-24 14:14:25 +08:00
    几家搞 Docker 纷纷取消开发者优惠。。。
    oscarzhao
        2
    oscarzhao  
       2016-08-24 14:17:49 +08:00
    @malaohu 都赚不到钱吧
    lionkin
        3
    lionkin  
       2016-08-24 14:35:08 +08:00
    阿里也在搞 docker 了,对这几家有影响吧
    chousb
        4
    chousb  
       2016-08-24 16:40:22 +08:00
    docker 自身开始做管理以及控制,各家做了这两年基本等于白做了,怎么会赚钱呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1113 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.