搭建 Spark 集群?没想到你是这样的 k8s - V2EX
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 4279 次点击
    这是一个创建于 3337 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在本文的例子中,你将使用 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 ”。在其中输入:

    %pyspar 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     Solana     4539 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:07 PVG 18:07 LAX 03:07 JFK 06:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86