2018-08-11 16:28:24 luanpeng825485697 阅读数 3989
  • [老汤]Spark 2.x实战应用系列一之怎样学习Spark

    系统的讲解了我们为什么需要去认识spark、spark有什么内容以及我们该怎么去学习spark。在学习spark过程中遵循的几个原则。内容如下: 1 大数据是什么 2 需要什么知识(除了scala,java和python都行) 3 spark可以做什么 4 spark整体结构图 5 spark中有什么 6 怎么学spark 7 学习spark的四个原则 8 学习spark需要的环境

    2906 人正在学习 去看看 老汤

全栈工程师开发手册 (作者:栾鹏)
架构系列文章

首先要求你的k8s支持helm。阿里云自带的k8s已经包含了对helm的支持。关于服务器k8s的部分这里不讨论,我们考论如何用一个已经好的k8s来进行部署spark。

安装配置 kubectl 和 Helm CLI

在本地计算机上安装和配置 kubectl。

参见https://blog.csdn.net/luanpeng825485697/article/details/80862581文章中安装kubectl

在本地计算机上安装 Helm。

安装方法,参见https://github.com/helm/helm/blob/master/docs/install.md?spm=a2c4g.11186623.2.6.Qr9c2B&file=install.md

本地有了kubectl和helm以后,我们就可以来在k8s上部署spark了。

配置 Helm 的 Repository。这里我们使用了阿里云容器服务提供的 Charts 存储库。

helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
稍等一会,再通过下面的命令查看helm的客户端和服务器端
helm version

helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm repo update

通过helm安装官方spark

helm search spark   查找所有可用的spark应用
kubectl create ns cloudai-2
helm install --name cloud-spark --namespace cloudai-2 aliyun/spark

如果安装出错了可以删除charts
helm delete --purge cloud-spark

通过helm自定义安装spark

上面安装的spark将自动部署三个pod,部署配置可能不能满足我们的要求,我们可以自定义配置来安装

首选下载hlem应用。

helm fetch aliyun/spark

解压后修改values.yaml文件
修改vlaue.yaml文件中

ServiceType: NodePort

在Master下添加

NodePort: 31461

修改templates/spark-master-deployment.yaml文件中
为master服务修改为

spec:
  ports:
    - port: {{ .Values.Master.ServicePort }}
      targetPort: {{ .Values.Master.ContainerPort }}
      nodePort: {{ .Values.Master.NodePort }}
  selector:
    component: "{{ .Release.Name }}-{{ .Values.Master.Component }}"
  type: {{ .Values.Master.ServiceType }}

最后安装本地文件夹就可以了

helm install --name cloud-spark --namespace cloudai-2 spark
2019-08-26 10:27:33 oscarun 阅读数 98
  • [老汤]Spark 2.x实战应用系列一之怎样学习Spark

    系统的讲解了我们为什么需要去认识spark、spark有什么内容以及我们该怎么去学习spark。在学习spark过程中遵循的几个原则。内容如下: 1 大数据是什么 2 需要什么知识(除了scala,java和python都行) 3 spark可以做什么 4 spark整体结构图 5 spark中有什么 6 怎么学spark 7 学习spark的四个原则 8 学习spark需要的环境

    2906 人正在学习 去看看 老汤

History Server -> HS

1 Overview

因为这个系列的主要是想讲怎么在 K8S 上运行 HS,所以篇3讲述的就是这个,假设你已经有一个 K8S 集群,一个 build 好的 image,本文只是将 HS 运行在 K8S 上,关于日志和其他配置的最佳实践,本文不提供参考。

2 部署

要将 HS 部署在 K8S 集群里,需要一个 K8S 集群(Mac 用户可以用 Docker for Mac 或者 Minikube 来安装一个 K8S 集群),另外还有一个 build 好的 HS 镜像。

正如篇2说过的,Spark 提供了一个官方的 Dockerfile,安装官网文档直接 build 就可以了。

HS 可以说是一个无状态的应用,用 K8S 来部署再合适不过了。

具体而且合理的部署方案可以是部署一个 Deployment 作为 HS 的后端,再部署一个 Service 来做负载均衡。

需要知道启动 HS,还有一些配置需要调整,比如说如果需要从 HDFS 读取 Application 的作业信息的话,显然还需要配置读取的路径,否则就会从本地的默认 /tmp/spark-events 目录读取,然后还有端口之类的信息。

关于详细的配置方案,建议参考官方文档

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spark-history-server
spec:
  selector:
    matchLabels:
      run: spark-history-server
  replicas: 2
  template:
    metadata:
      labels:
        run: spark-history-server
    spec:
      containers:
        - image: hub.oa.com/runzhliu/spark:spark_2.11-2.4.3
          name: spark-history-server
          args: ["/opt/spark/bin/spark-class", "org.apache.spark.deploy.history.HistoryServer"]
          ports:
            - containerPort: 18080
              name: http
          env:
          - name: SPARK_HISTORY_OPTS
            value: "-Dspark.history.fs.logDirectory=file:///tmp"

然后通过下面的命令,创建一个 Service,来对 Deployment 做负载均衡,并且通过 NodePort 方式,可以访问到这两个 Pod。

kubectl expose Deployment spark-history-server --type=NodePort --name=spark-history-server

然后看看 Service 分配了哪个端口。确定是 30984。

# kubectl get svc
NAME                                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
spark-history-server                     NodePort    10.98.209.80     <none>        18080:30984/TCP     3m29s

最后访问 HS。

image_1dj5ru3hm1c681ruci5n1k88muv19.png-53.5kB

3 Summary

在 K8S 集群部署 HS 其实本质上跟部署其他 Web 服务是没什么区别的,好处是 K8S 提供了更好的 Scalling 方法,也更容易运维。

到这里,本系列就讲完了,如果有任何问题,欢迎在本文下面提问,或者发邮件到 runzhliu@163.com

2016-04-28 16:34:35 xts_huangxin 阅读数 4419
  • [老汤]Spark 2.x实战应用系列一之怎样学习Spark

    系统的讲解了我们为什么需要去认识spark、spark有什么内容以及我们该怎么去学习spark。在学习spark过程中遵循的几个原则。内容如下: 1 大数据是什么 2 需要什么知识(除了scala,java和python都行) 3 spark可以做什么 4 spark整体结构图 5 spark中有什么 6 怎么学spark 7 学习spark的四个原则 8 学习spark需要的环境

    2906 人正在学习 去看看 老汤

使用k8s搭建spark集群

这几天尝试在k8s中搭建spark集群,踩了一些坑,跟大家分享一下。

Spark的组件介绍可参考官方文档
大数据生态圈简介可参考这篇文章

基于k8s官方示例

具体参考github k8s

FAQ

镜像拉取问题

该方法需要访问gcr.io下载镜像(国内一般需要vpn),需要注意的是gcr.io/google_containers/spark:1.5.2_v1镜像不能使用index.tenxcloud.com/google_containers/spark替换,替换后拉取镜像时会出现“docker: filesystem layer verification failed”错误。

可将zeppelin-controller.yaml使用的镜像修改为index.tenxcloud.com/google_containers/zeppelin:v0.5.6_v1

webui service使用问题

文档中的kubectl proxy –port=8001指令只能监听127.0.0.1的代理请求,不适用于测试环境和虚拟机环境,因为使用的ip地址不是127.0.0.1。
此时使用kubectl proxy –port=8001 –address=\

pyspark示例运行错误

示例中的数据源存在问题,可使用本地文件运行,例如“sc.textFile(“/opt/spark/licenses/*”).map(lambda s: len(s.split())).sum()”

Zeppelin webui使用问题

同样只能通过localhost或127.0.0.1访问,可以通过将zeppelin service类型配置为NodePort。参考spark-20160427.zip中的zeppelin-service.yaml。
使用方法为:

  • 使用zeppelin-service.yaml创建zeppelin service,可通过spec.ports.nodePort指定端口,不指定时为端口随机。
  • 使用kubectl describe svc zeppelin|grep NodePort指令查看端口。
  • 在浏览器中访问任意节点ip:NodePort访问zeppelin webui。
  • 点击“Create new note”,输入Note Name。
  • 在新页面中执行以下内容:

    %pyspark
    print sc.textFile("/opt/spark/licenses/*").map(lambda s: len(s.split())).sum()

该示例会统计zeppelin本地/opt/spark/licenses/目录下的所有文件的单词数量,几秒后会看到执行结果。

基于tenxcloud镜像库搭建

需要根据k8s源码中的examples/spark/下的yaml文件搭建,将所有yaml文件复制到工作目录下。

修改spark-master-controller.yaml和spark-worker-controller.yaml:
* spec.template.spec.containers.command均修改为“/start.sh”
* spec.template.spec.containers.images分别修改为index.tenxcloud.com/google_containers/spark-master:1.5.2_v1和index.tenxcloud.com/google_containers/spark-worker:1.5.2_v1

zeppelin-controller.yaml使用的镜像修改为index.tenxcloud.com/google_containers/zeppelin:v0.5.6_v1

修改完成后,按k8s官方示例的步骤启动即可。

简易的spark-driver

由于zeppelin镜像非常大,拉取会消耗很多时间。可以使用下面的spark-driver.yaml创建一个简易的spark-driver:

kind: ReplicationController
apiVersion: v1
metadata:
  name: spark-driver 
spec:
  replicas: 1
  selector:
    component: spark-driver
  template:
    metadata:
      labels:
        component: spark-driver
    spec:
      containers:
        - name: spark-driver
          image: index.tenxcloud.com/google_containers/spark-driver:1.5.2_v1
          resources:
            requests:
              cpu: 100m

创建后,使用kubectl exec <spark-driver-podname> -it pyspark即可访问。

yaml配置参考这里

2018-11-18 22:19:26 luanpeng825485697 阅读数 1380
  • [老汤]Spark 2.x实战应用系列一之怎样学习Spark

    系统的讲解了我们为什么需要去认识spark、spark有什么内容以及我们该怎么去学习spark。在学习spark过程中遵循的几个原则。内容如下: 1 大数据是什么 2 需要什么知识(除了scala,java和python都行) 3 spark可以做什么 4 spark整体结构图 5 spark中有什么 6 怎么学spark 7 学习spark的四个原则 8 学习spark需要的环境

    2906 人正在学习 去看看 老汤

首先我们需要对hbase的访问原理非常清楚.可以参考:https://blog.csdn.net/luanpeng825485697/article/details/80319552

我们这里已经在k8s中部署了hdfs和zookeeper以及hbase.部署可以参考: https://blog.csdn.net/luanpeng825485697/article/details/81985602

hbase数据分区是按照region进行的,分区的location就是各个region的location。那么后续分配executor时可以按照region所在机器分配对应executor,直接在本机读取数据计算。

我们先来往hbase里面写两个数据

hbase shell
whoami
list      # 如果list出错,说正在初始化中,要等待,可以在dashboard中看
exists 't1'
create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}
put 't1','rowkey001','f1:col1','value01'
put 't1','rowkey002','f1:col1','value01'
put 't1','rowkey003','f1:col1','value01'
put 't1','rowkey004','f1:col1','value01'

我们使用python来实现连接

python代码如下

# 这些函数只在driver驱动中执行.  只有DRR的mapreduce才会在exec程序中执行
# 需要设置hbase的hostname和subdomain   并在dns增加一条重定向

from pyspark.sql import SparkSession
from pyspark.sql import SQLContext


spark = SparkSession.builder.appName("hbase_test").getOrCreate()
sc = spark.sparkContext


zookeeper = 'zookeeper-1.cloudai-2.svc.cluster.local,zookeeper-2.cloudai-2.svc.cluster.local,zookeeper-3.cloudai-2.svc.cluster.local'
table = 't1'


# # 读取
conf = {
    "hbase.zookeeper.quorum": zookeeper,
    "hbase.zookeeper.property.clientPort":"2181",
    "hbase.regionserver.port":"60010",
    # "hbase.master":"10.233.9.21:60000",
    # "hbase.master.port":"60000",
    "zookeeper.znode.parent":"/hbase",
    "hbase.defaults.for.version.skip":"true",
    "hbase.mapreduce.inputtable": table
}

keyConv = "org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter"
valueConv = "org.apache.spark.examples.pythonconverters.HBaseResultToStringConverter"
hbase_rdd = sc.newAPIHadoopRDD("org.apache.hadoop.hbase.mapreduce.TableInputFormat","org.apache.hadoop.hbase.io.ImmutableBytesWritable","org.apache.hadoop.hbase.client.Result",keyConverter=keyConv,valueConverter=valueConv,conf=conf)
count = hbase_rdd.count()
hbase_rdd.cache()
output = hbase_rdd.collect()
for (k, v) in output:
    print((k, v))

在代码中我们配置了zookeeper的地址, spark会先访问spark来获取hbase的所有信息,包含master,regionserver的信息.

为了保证正确,我们可以先自己查询一遍看看是否正确.

zookeeper的存储原理可以参考:http://www.cnblogs.com/leesf456/p/6179118.html

进入zookeeper的pod,

./bin/zkCli.sh          # 计入zookeeper命令行

ls /                   # 查看zookeeper根目录存储:
包含zookeeper   hbase两个文件夹(数据节点)

ls2 /zookeeper   查看zookeeper节点目录

ls2 /hbase   查看hbase节点信息:
[meta-region-server, backup-masters, table, draining, region-in-transition, table-lock, running, master, namespace, hbaseid, online-snapshot, replication, splitWAL, recovering-regions, rs, flush-table-proc]

查看hbase集群在zookeeper记录的信息,比如:regionserver1-slave-1,regionserver2-slave-2
ls2 /hbase/rs
[hbase-master-deployment-1-ddb859944-ctbrm,16201,1541399059310]
这里可以看出, 记录在zookeeper中的数据是pod的主机名hostname  而不是ip

表锁节点会有所有表。
[zk: localhost:2181(CONNECTED) 10] ls2 /hbase/table-lock
[TestTable, product, device, t1, rec_history, hbase:namespace, face_detect]
cZxid = 0x100000009
ctime = Wed Sep 19 07:25:49 UTC 2018
mZxid = 0x100000009
mtime = Wed Sep 19 07:25:49 UTC 2018
pZxid = 0x300000749
cversion = 21
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 7


查看所有表
[zk: localhost:2181(CONNECTED) 11] ls2 /hbase/table
[TestTable, product, t1, rec_history, device, hbase:meta, hbase:namespace, face_detect]
cZxid = 0x100000006
ctime = Wed Sep 19 07:25:49 UTC 2018
mZxid = 0x100000006
mtime = Wed Sep 19 07:25:49 UTC 2018
pZxid = 0x30000074b
cversion = 22
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 8


查看hbase的meta表信息,包含server信息。
[zk: localhost:2181(CONNECTED) 14] get /hbase/table/hbase:meta

?master:60000o,?OG?e?PBUF
cZxid = 0x100000029
ctime = Wed Sep 19 07:25:57 UTC 2018
mZxid = 0x10000002a
mtime = Wed Sep 19 07:25:57 UTC 2018
pZxid = 0x100000029
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 31
numChildren = 0

由于hbase的通信是通过hostname连接的. 所以我们在python代码中设置了将hostname写入到hosts文件,但是这个代码只在driver驱动中执行,只有DRR数据才会分解到exec驱动中执行. 所以只有driver的pod中成功修改了hosts 而exec仍然无法解析hostname

有几种方案:

1 将hbase的hostname和pod的ip想办法能配置到镜像中 因为pod的ip可能是变化的,所以必须以配置的方式添加进去.

2 添加代理,或者自定义DNS 将hbase的hostname代理到pod的ip

3 重定向 将hostname 重定向到pod的访问地址

{pod-name}.{subdomain}.{namespace}.svc.cluster.local

4 创建service-headless服务的名称和hbase的hostname设置成一样,并且让spark和hbase在同一个命名空间下 ( 这种最简单 )

我们先按照第4种方案在hbase所在的命名空间创建和hbase的pod的hostname相同的service-headless,并且让spark也在这个命名空间下运行

apiVersion: v1
kind: Service
metadata:
  name: hbase-master-1
  namespace: cloudai-2
spec:
  selector:
    app: hbase-master-1
  clusterIP: None
  ports:
    - name: rpc
      port: 60000
      targetPort: 60000        # 配置的hbase的链接端口   
    - name: info
      port: 60001            # hbase运行状态的网页查询端口
      targetPort: 60001
    - name: region
      port: 60010            
      targetPort: 60010
    - name: regioninfo
      port: 60011           
      targetPort: 60011
    - name: thrift
      port: 9090           # thrift服务器ip,让外界通过thrift来访问hbase
      targetPort: 9090

如果我们想让spark在一个独立的命名空间运行,就要另寻它法了.

创建hbase的deployment时指定pod的hostname和subdomain

hostname: hbase-master-1  # 设定主机名
subdomain: hbase-headless    # 设定子域名

为subdomain建一个service-headless

apiVersion: v1
kind: Service
metadata:
  name: hbase-headless
  namespace: cloudai-2
spec:
  selector:
    app: hbase-master-1
  clusterIP: None
  ports:
    - name: rpc
      port: 60000
      targetPort: 60000        # 配置的hbase的链接端口   
    - name: info
      port: 60001            # hbase运行状态的网页查询端口
      targetPort: 60001
    - name: region
      port: 60010            
      targetPort: 60010
    - name: regioninfo
      port: 60011           
      targetPort: 60011
    - name: thrift
      port: 9090           # thrift服务器ip,让外界通过thrift来访问hbase
      targetPort: 9090

这样就能访问hbase的pod了,只不过域名必须是

hbase-master-1.hbase-headless.cloudai-2.svc.cluster.local

下面我们来设置代理, 在使用hbase的hostname访问pod时也能正常访问到hbase的pod.

我这里在dns中增加了一个重定向解析记录

我这里的dns使用的coredns,在创建Corefile的configmap时使用下面的方法

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        rewrite name hbase-master-1 hbase-master-1.hbase-headless.cloudai-2.svc.cluster.local
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        reload
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system

这样dns在解析hbase-master-1时返回的是hbase-master-1.hbase-headless.cloudai-2.svc.cluster.local的ip

如果你使用的是kube-dns,可以参考https://blog.csdn.net/luanpeng825485697/article/details/84108166

2020-01-20 16:24:24 q383965374 阅读数 177
  • [老汤]Spark 2.x实战应用系列一之怎样学习Spark

    系统的讲解了我们为什么需要去认识spark、spark有什么内容以及我们该怎么去学习spark。在学习spark过程中遵循的几个原则。内容如下: 1 大数据是什么 2 需要什么知识(除了scala,java和python都行) 3 spark可以做什么 4 spark整体结构图 5 spark中有什么 6 怎么学spark 7 学习spark的四个原则 8 学习spark需要的环境

    2906 人正在学习 去看看 老汤

目前最新稳定版本2.4.4的官方安装文档

环境准备

1、使用spark2.3以上的spark版本
2、已经在运行的k8s集群版本需要大于1.6

使用命令查询

kubectl version

输出为:

zhangxiaofans-MacBook-Pro:Downloads joe$ kubectl  version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"456", GitTreeState:"clean", BuildDate:"2018-05-12T04:12:47Z", GoVersion:"go1.9.6", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.9", GitCommit:"123", GitTreeState:"clean", BuildDate:"2019-05-27T15:58:45Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}

3、拥有可以访问k8s集群的kubectl命令控制台
4、执行kubectl命令的用户需要有权限创建编辑和删除pod。
可以使用如下命令进行是否拥有权限的查询

kubectl auth can-i list  pods
kubectl auth can-i create pods
kubectl auth can-i edit pods
kubectl auth can-i delete pods

结果输出如下:

zhangxiaofans-MacBook-Pro:Downloads joe$ kubectl auth can-i list pods
yes
zhangxiaofans-MacBook-Pro:Downloads joe$ 

ps: 不过我这里使用kubectl auth can-i edit pods命令返回的是no - no RBAC policy matched。

5、作为driver的pod使用的账户权限需要能够创建pod和service以及configmap。

下载官方编译好的包

进入到官网下载地址,选择我们需要的包

在这里插入图片描述

备用下载地址 http://mirror.bit.edu.cn/apache/spark/

也可以进行进行编译,不过需要mvn环境以及会去下载相关依赖的包可能会比较久。编译使用命令参考如下:

./build/mvn -Pkubernetes -Phadoop-2.7 -Dhadoop.version=2.7.3 -Phive -Phive-thriftserver -DskipTests cleanpackag

下载后放到一个新目录中解压使用命令:

mkdir spark
cd  spark
tar -xzvf spark-2.4.4-bin-hadoop2.7.tgz

打包镜像

首先

$ docker login

登陆注册过的dockerhub账户

或者如果使用的是aws的仓库则使用如下命令进行登录

aws ecr get-login --no-include-email  --region xxxxxxxxx

# 返回如下信息
docker login -u AWS -p 123


# copy 上面返回信息登录 docker
docker login -u AWS -p   123


#新镜像地址和名字使用如下命令创建

aws ecr create-repository --repository-name spark/xxxxx

aws创建repositoty返回如下:

zhangxiaofans-MacBook-Pro:bin joe$ aws ecr create-repository --repository-name spark
{
    "repository": {
        "registryId": "123", 
        "repositoryName": "spark", 
        "repositoryArn": "arn:aws-cn:ecr:cn-northwest-1:123:repository/spark", 
        "createdAt": 1579503767.0, 
        "repositoryUri": "123.dkr.ecr.cn-northwest-1.amazonaws.com.cn/spark"
    }
}

方式一 使用官网提供的打包脚本命令

打包的命令在 官网下载到的包里就有。

然后在spark解压的目录下,打包和发布docker 镜像

cd ./spark-2.4.4-bin-hadoop2.7
./bin/docker-image-tool.sh -r <repo> -t my-tag build
./bin/docker-image-tool.sh -r <repo> -t my-tag push

这里 对应我们上面创建的镜像仓库地址,如123.dkr.ecr.cn-northwest-1.amazonaws.com.cn/spark

my-tag是一个标签名字,可以任意取,我们这里可以使用2.4.4,最好使用latest。因为后续使用的时候driver默认拉取latest。

build完毕后一共有三个镜像需要push上传,分别是

123.dkr.ecr.cn-northwest-1.amazonaws.com.cn/spark/spark

123.dkr.ecr.cn-northwest-1.amazonaws.com.cn/spark/spark-r

123.dkr.ecr.cn-northwest-1.amazonaws.com.cn/spark/spark-py

方式二 手动build上传

cd ./spark-2.4.4-bin-hadoop2.7
docker build -t <repo>/spark:2.4.4 -f  kubernetes/dockerfiles/spark/Dockerfile  .
docker push <repo>/spark:2.4.4

可能遇到的问题–Cannot find docker image. This script must be run from a runnable distribution of Apache Spark

这里说的是 没有找到dockerfile文件,这个脚本只能运行在 可运行的分布式 spark中。

需要检查解压的包里是否有 dockerfile文件,一般在spark-2.4.4-bin-hadoop2.7/kubernetes/dockerfiles/spark 。

如果确认有dockerfile文件,需要注意 运行docker-image-tool.sh脚本的目录层级,必须在spark-2.4.4-bin-hadoop2.7这层。

使用命令

cd ./spark-2.4.4-bin-hadoop2.7
./bin/docker-image-tool.sh -r <repo> -t my-tag build

不能使用命令

cd ./spark-2.4.4-bin-hadoop2.7/bin
./docker-image-tool.sh -r <repo> -t my-tag build

关于安装cluster mode

在这里插入图片描述

我们在之前的 原理解析中已经了解到 spark on k8s使用原生k8s的cluster mode方式,不会预先部署任何服务。而是 当 我们使用spark-submit进行提交任务给k8s时,k8s才会启动相同的pod作为 spark driver进行资源调配和启动更多pod。

只有 client mode模式的 才会提起部署一个 driver的pod作为常驻服务。

在这里插入图片描述

所以 如果是使用原生k8s — cluster mode的 spark on k8s,把镜像打包上传完毕后 就算安装完成了。

如何使用cluster-mode 和 client-mode的部署,我们在后续文章中进行记录。

Spark on k8s 试用步骤

阅读数 4452

没有更多推荐了,返回首页