文章目录
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
官方文档:https://spark.apache.org/docs/latest/
Spark on k8s官方文档:https://spark.apache.org/docs/latest/running-on-kubernetes.html
关于spark的介绍,可以参考我这篇文章:大数据Hadoop之——计算引擎Spark


spark-submit 可以直接用于向Kubernetes集群提交spark应用程序。提交机制的工作原理如下:
Client :客户端进程,负责提交作业到Master。Master :Standalone模式中主控节点,负责接收Client提交的作业,管理Worker,并命令Worker启动Driver和Executor。Worker :Standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Driver和Executor。Driver : 一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业的解析、生成Stage并调度Task到Executor上。包括 DAGScheduler , TaskScheduler 。

wget https://dlcdn.apache.org/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz
tar -xf spark-3.3.0-bin-hadoop3.tgz
export SPARK_HOME=/opt/bigdata/servers/spark/spark-3.3.0-bin-hadoop3
Spark(从2.3版开始)附带了一个Dockerfile,可以在kubernetes/dockerfiles/目录中找到它。

Spark还附带一个构建和push镜像的脚本 bin/docker-image-tool.sh。构建镜像命令如下:
cd $SPARK_HOME
# 构建镜像
# -p ./kubernetes/dockerfiles/spark/Dockerfile,-p 指定Dockerfile
$SPARK_HOME/bin/docker-image-tool.sh -r myharbor.com/bigdata -t 3.3.0-hadoop3 build build
# push
$SPARK_HOME/bin/docker-image-tool.sh -r myharbor.com/bigdata -t 3.3.0-hadoop3 push
kubectl create ns spark
kubectl create serviceaccount spark -n spark
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=spark:spark
##在spark-submit中添加
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark
# 查看k8s apiserverl:kubectl cluster-info
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110:6443 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.namespace=spark \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
local:///opt/spark/examples/jars/spark-examples_2.12-3.3.0.jar

【注意】这里的 local:///path/to/examples.jar 指的是 容器的文件系统路径,不是执行 spark-submit 的机器的文件系统路径,如果不使用 local 的话,也可以用
HTTP、HDFS等系统,没指定的话默认是 local 模式
这里依赖与Hadoop hdfs环境,Hadoop on k8s环境部署可以参考我以下两篇文章:
存储目录需要提前创建
kubectl exec -it hadoop-hadoop-hdfs-dn-0 -n hadoop -- bash
hdfs dfs -mkdir hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory
hdfs dfs -chmod 777 hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory
spark-history.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-history-server
spec:
selector:
matchLabels:
run: spark-history-server
replicas: 1
template:
metadata:
labels:
run: spark-history-server
spec:
containers:
- image: myharbor.com/bigdata/spark:3.3.0-hadoop3
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=hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory"
---
apiVersion: v1
kind: Service
metadata:
name: spark-hs-svc
spec:
ports:
- port: 18080
protocol: TCP
targetPort: 18080
nodePort: 31180
selector:
run: spark-history-server
type: NodePort
status:
loadBalancer: {}
执行
kubectl apply -f spark-history.yaml -n spark

web:http://192.168.182.110:31180

再提交任务
# 增加配置项:
# --conf spark.eventLog.enabled=true \
# --conf spark.eventLog.dir=hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory \
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110:6443 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.namespace=spark \
--conf spark.eventLog.enabled=true \
--conf spark.eventLog.dir=hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
local:///opt/spark/examples/jars/spark-examples_2.12-3.3.0.jar
### jar放在hdfs
kubectl cp examples/jars/spark-examples_2.12-3.3.0.jar hadoop/hadoop-hadoop-hdfs-dn-0:/tmp/ -n hadoop
kubectl exec -it hadoop-hadoop-hdfs-dn-0 -n hadoop -- bash
hdfs dfs -put /tmp/spark-examples_2.12-3.3.0.jar hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory/
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110:6443 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.namespace=spark \
--conf spark.eventLog.enabled=true \
--conf spark.eventLog.dir=hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
hdfs://hadoop-hadoop-hdfs-nn.hadoop:9000/sparkhistory/spark-examples_2.12-3.3.0.jar

从Spark 2.4.0开始,可以在客户端模式下在Kubernetes上运行Spark应用程序。当应用程序在客户端模式下运行时,驱动程序可以在k8s pod或物理主机上运行。

# 上面已经配置,这里可以忽略
kubectl create ns spark
kubectl create serviceaccount spark -n spark
kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=spark:spark
##在spark-submit中添加
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark
配置 spark 容器,会在这个容器里以 client 模式 submit spark 程序,所以这个容器也会作为 driver。
spark-client-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-client
spec:
replicas: 1
selector:
matchLabels:
app: spark-client
component: spark-client
template:
metadata:
labels:
app: spark-client
component: spark-client
spec:
containers:
- name: spark-client
image: myharbor.com/bigdata/spark:3.3.0-hadoop3
workingDir: /opt/spark
command: ["/bin/bash", "-c", "while true;do echo spark-client;sleep 6000;done"]
serviceAccountName: spark
我们任意指定一个端口暴露,后续client mode将通过去DNS去查找Driver Pod的位置,这也是Spark on k8s要求DNS的原因。
spark-client-service.yaml
apiVersion: v1
kind: Service
metadata:
name: spark-client-service
spec:
selector:
app: spark-client
ports:
- protocol: TCP
port: 7321
targetPort: 7321
clusterIP: None
执行
kubectl apply -f spark-client-deployment.yaml -n spark
kubectl apply -f spark-client-service.yaml -n spark
kubectl get pods -n spark
cd $SPARK_HOME
./bin/spark-submit \
--master k8s://https://192.168.182.110:6443 \
--deploy-mode client \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=3 \
--conf spark.kubernetes.namespace=spark \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.container.image=myharbor.com/bigdata/spark:3.3.0-hadoop3 \
--conf spark.driver.host=spark-client-service \
--conf spark.driver.port=7321 \
file:///opt/bigdata/servers/spark/spark-3.3.0-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.0.jar
client 模式很少使用,稍微了解即可,Spark on k8s讲解与实战操作 就先到这里了,有疑问的小伙伴欢迎给我留言,后续会持续更新【云原生+大数据】相关的文章,请小伙伴耐心等待~
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
1、接口请求基本操作1.1例子tips在view的选项可以zoomin调整窗口字帖大小。1、创建一个测试的workspace,并命名为test2、test后面新增一个addrequest3、选择发送GET,URL为一个开源的https://api.apiopen.top/api/sentences获取每日一句4、点击send查看内容Tips:如果提示出现Error:tunnelingsocketcouldnotbeestablished,statusCode=407错误,参照以下解决办法)关于tunnelingsocketcouldnotbeestablished,cause=getaddri
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好