Docker中提交任務到Spark集群

来源:https://www.cnblogs.com/StitchSun/archive/2020/07/03/11653833.html
-Advertisement-
Play Games

1. 背景描述和需求 數據分析程式部署在Docker中,有一些分析計算需要使用Spark計算,需要把任務提交到Spark集群計算。 接收程式部署在Docker中,主機不在Hadoop集群上。與Spark集群網路互通。 需求如下 1、在Docker中可程式化向Spark集群提交任務 2、在Docker ...


1.  背景描述和需求

數據分析程式部署在Docker中,有一些分析計算需要使用Spark計算,需要把任務提交到Spark集群計算。

接收程式部署在Docker中,主機不在Hadoop集群上。與Spark集群網路互通。

 

需求如下

1、在Docker中可程式化向Spark集群提交任務

2、在Docker中可對Spark任務管理,狀態查詢和結束

 

2.  解決方案

在Docker中搭建一套Spark、Hadoop環境。任務通過spark-submit --master yarn --deploy-mode cluster來提交到Spark on YARN集群執行。

任務監控通過hadoop的restful介面來監控和管理。

 

2.1.  Yarn client 模式為行不通

任務發佈的docker實例,不在spark集群中,屬於非集群機器。只有spark yarn模式的入口,但是hdfs無法與hadoop集群通信。

為什麼不能hdfs不能通信?

每個docker啟動時,一般不指定ip地址和機器名,不能再集群中預先配置好ip地址和機器名。

並且在hadoop集群中添加了一個動態的docker,但是並不參與任務執行,不利於環境的管理。

在docker中,你的環境配置(python路徑,hadoop路徑等)可能與hadoop集群不一致,所以以client模式運行時,存在找不到配置的錯誤。

以cluster模式運行,只要保證把任務所需的文件上傳到hadoop集群即可正常運行任務,docker不與集群通信業可以正常執行任務。

 

Client模式為何不行?

Client模式是由RM分配一個AM,然後由executor反向driver註冊,dirver發送task,在回收結果。

但是現在dirver在Docker中,executor找不到dirver的地址,無法註冊,所以導致client模式無法使用。

 

https://www.cnblogs.com/fbiswt/p/4667956.html

1、客戶端安裝的機器一般是虛擬機,虛擬機的名稱可能是隨便搞的,然而,yarn-client模式提交任務,是預設把本機當成driver的。所以導致其他的機器無法通過host的name直接訪問這台機器。報錯就是Failed to connect to driver at x.x.x.x,retrying.....

 解決辦法:在命令後面加上一個--conf spark.driver.host=$your_ip_address,後面直接填客戶端機器的IP地址就行。還有一個辦法:export SPARK_JAVA_OPTS="-Dspark.driver.host=$your_ip_address",但是這種方法你在用完yarn-client後就沒有辦法再用yarn-cluster了。千萬不能把這個參數配置到spark-default.conf裡面。

 

2.2.  Cluster與client模式異同

Cluster模式,driver節點在集群內部,可以最大限度的減少driver和executor直接的網路延時。

這部分內容有詳細介紹。

 

3.  Spark on Yarn集群環境搭建

3.1.  Spark on Yarn集群搭建

資源管理模式設置為YARN模式,開放Hadoop Web管理頁面。

 

詳細搭建過程略。網上有詳細文檔。

 

3.2.  Web管理頁面和rest配置

hadoop目錄etc/Hadoop目錄yarn-site.xml文件

通過yarn.resourcemanager.webapp.address 設置web訪問地址和埠

 

<!-- Site specific YARN configuration properties -->

 <property>

  <name>yarn.nodemanager.aux-services</name>

  <value>mapreduce_shuffle</value>

</property>

<property>

   <name>yarn.resourcemanager.address</name>

   <value>master:8032</value>

</property>

<property>

  <name>yarn.resourcemanager.scheduler.address</name>

  <value>master:8030</value>

</property>

<property>

 <name>yarn.resourcemanager.resource-tracker.address</name>

 <value>master:8031</value>

</property>

<property>

 <name>yarn.resourcemanager.admin.address</name>

 <value>master:8033</value>

</property>

<property>

 <name>yarn.resourcemanager.webapp.address</name>

 <value>IP address:8088</value>

</property>

 

4.  Docker環境搭建和設置

4.1.  軟體配套表

編號

軟體名稱

軟體版本

1

Java

java version "1.8.0_121"

Java(TM) SE Runtime Environment (build 1.8.0_121-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

2

Spark

spark-2.3.2-bin-hadoop2.7

3

Hadoop

hadoop-2.7.3

4

Linux os

Centos 6.5 64bit

5

Docker

17.09.0-ce

6

Python

anaconda3:4.2.0

 

4.2.  製作Spark的Docker鏡像

 

安裝基礎軟體

把java、spark、hadoop、python的軟體放到同一個目錄下,在Dockerfile中使用ADD命令添加軟體到鏡像。

軟體放到了./add 目錄下,通過ADD命令把目錄下的軟體添加到Docker中的/目錄

   ADD ./add /

 

軟體環境變數設置

這裡以把java、spark、hadoop、anaconda3:4.2.0都放到根目錄下為例:

# Spark ENV

JAVA_HOME="/jdk1.8.0_121"

SPARK_HOME="/spark-2.3.2-bin-hadoop2.7"

HADOOP_HOME="/hadoop-2.7.3"

CLASSPATH="/anaconda3/bin;/jdk1.8.0_121/lib/dt.jar:/jdk1.8.0_121/lib/tools.jar"

PATH="/jdk1.8.0_121/bin:$PATH:/spark-2.3.2-bin-hadoop2.7/bin:/hadoop-2.7.3/bin"

 

Hadoop配置

Hadoop配置文件直接使用spark集群中的hadoop配置即可。路徑為hadoop_dir/etc/Hadoop,把目錄下的配置都複製過來即可。

 

提示:

如果Docker中java路徑與Spark中一致,則需要修改為docker中的路徑。不然docker中spark無法運行

 

如果提交的是任務是python程式,則PYSPARK_PYTHON設置要求與spark集群的配置保持一致。

通過PYSPARK_PYTHON="/anaconda3/bin/python"來設置

 

在Docker的程式中,執行用戶與spark集群中的執行賬戶可能不一致,則需要通過環境變數HADOOP_USER_NAME來設置。與集群中保持一致,不然會產生許可權問題。

HADOOP_USER_NAME="spark"

 

Dockerfile示例

 

FROM your_base_env

ENV LANG="en_US.UTF-8"

 

ADD ./add .

 

# Spark ENV

ENV JAVA_HOME="/jdk1.8.0_121" SPARK_HOME="/spark-2.3.2-bin-hadoop2.7" HADOOP_HOME="/hadoop-2.7.3" CLASSPATH="/jdk1.8.0_121/lib/dt.jar:/jdk1.8.0_121/lib/tools.jar" \

PATH="/jdk1.8.0_121/bin:$PATH:/spark-2.3.2-bin-hadoop2.7/bin:/hadoop-2.7.3/bin" PATH="$PATH:$INSTALL_PATH" PYTHONPATH="$INSTALL_PATH" LANG="en_US.UTF-8" \

HADOOP_CONF_DIR="/hadoop-2.7.3/etc/hadoop/ " PYSPARK_PYTHON="/anaconda3/bin/python" HADOOP_USER_NAME="spark"

 

 

4.3.  環境檢查

配置完成後,打包鏡像,啟動一個實例

檢查spark配置

輸入命令:spark-submit,檢查spark是否安裝完成

看到下麵的信息,說明spark設置成功

[root@3920e4505b70 stg]# spark-submit

Usage: spark-submit [options] <app jar | python file | R file> [app arguments]

Usage: spark-submit --kill [submission ID] --master [spark://...]

Usage: spark-submit --status [submission ID] --master [spark://...]

Usage: spark-submit run-example [options] example-class [example args]

 

Options:

  --master MASTER_URL         spark://host:port, mesos://host:port, yarn,

                              k8s://https://host:port, or local (Default: local[*]).

  --deploy-mode DEPLOY_MODE   Whether to launch the driver program locally ("client") or

                              on one of the worker machines inside the cluster ("cluster")

                              (Default: client).

  --class CLASS_NAME          Your application's main class (for Java / Scala apps).

  --name NAME                 A name of your application.

  --jars JARS                 Comma-separated list of jars to include on the driver

                              and executor classpaths.

  --packages                  Comma-separated list of maven coordinates of jars to include

                              on the driver and executor classpaths. Will search the local

                              maven repo, then maven central and any additional remote

                              repositories given by --repositories. The format for the

                              coordinates should be groupId:artifactId:version.

  --exclude-packages          Comma-separated list of groupId:artifactId, to exclude while

                              resolving the dependencies provided in --packages to avoid

                              dependency conflicts.

 

檢查Hadoop配置

輸入命令:yarn application -list 檢查hadoop集群配置

看到下麵輸出表示正常

[root@3920e4505b70 /]# yarn application -list

Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):0

                Application-Id      Application-Name        Application-Type          User           Queue                   State             Final-State             Progress                        Tracking-URL

執行任務Demo

環境檢查沒有問題,執行demo代碼來檢查下:

spark-submit --master yarn --deploy-mode cluster /spark-2.3.2-bin-hadoop2.7/examples/src/main/python/pi.py

沒有問題,則會看到任務狀態為ACCEPTED說明集群接受了任務

RUNNING說明spark集群開始執行任務了。

  

5.  任務監控

任務監控的兩個方法

  • Yarn 命令行
  • Hadoop HTTP rest介面

由於開發語言為python,調用shell命令沒有rest介面方便,選擇使用rest介面來做任務監控方案。

5.1.  yarn application命令監控和管理

通過命令查看當前運行的任務,查看自己運行的任務是否在列表中

 

yarn application –list 查看任務列表

 

yarn application –kill  applicationID  結束指定任務

 

5.2.  hadoop集群的rest介面來管理

在python中調用shell命令,存在諸多不便。

調用rest介面非常方便。這裡選擇rest介面作為任務狀態管理方式。

 

介面文檔地:

https://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html#Cluster_Application_API

 

5.2.1.  查詢任務列表

GET http://<rm http address:port>/ws/v1/cluster/apps

參數:states=accepted,running,finished

查詢條件過濾accepted,running,檢查提交的任務是否在任務列表中。

5.2.2.  查詢單個任務

如果任務已經接受了,生成了任務id,則可以直接根據任務id來查詢任務狀態

GET http://<rm http address:port>/ws/v1/cluster/apps/ application_1546828007170_0142

查詢剛纔任務執行的結果:

{
    "app":{
        "id":"application_1546828007170_0142",
        "user":"csmsopr",
        "name":"pi.py",
        "queue":"default",
        "state":"FINISHED",
        "finalStatus":"SUCCEEDED",
        "progress":100,
        "trackingUI":"History",
        "trackingUrl":"http://host281566:8088/proxy/application_1546828007170_0142/",
        "diagnostics":"",
        "clusterId":1546828007170,
        "applicationType":"SPARK",
        "applicationTags":"",
        "startedTime":1548234101173,
        "finishedTime":1548234115661,
        "elapsedTime":14488,
        "amContainerLogs":"http://host281567:8042/node/containerlogs/container_1546828007170_0142_01_000001/csmsopr",
        "amHostHttpAddress":"host281567:8042",
        "allocatedMB":-1,
        "allocatedVCores":-1,
        "runningContainers":-1,
        "memorySeconds":51782,
        "vcoreSeconds":32,
        "preemptedResourceMB":0,
        "preemptedResourceVCores":0,
        "numNonAMContainerPreempted":0,
        "numAMContainerPreempted":0
    }
}

 

 

5.2.3.  任務狀態管理

任務狀態查詢和結束

PUT http://<rm http address:port>/ws/v1/cluster/apps/ application_1546828007170_0142/state

返回

{

  "state":"KILLED"

}

 

查詢任務狀態

GET http://<rm http address:port>/ws/v1/cluster/apps/ application_1546828007170_0142/state

返回:

{

  "state":"ACCEPTED"

}

 

6.  參考資料

Spark中yarn模式兩種提交任務方式

https://www.cnblogs.com/LHWorldBlog/p/8414342.html

 

Hadoop介面文檔

 

https://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html#Cluster_Application_API

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 多Sheet導入教程 說明 本教程主要說明如何使用Magicodes.IE.Excel完成多個Sheet數據的Excel導入。 要點 多個相同格式的Sheet數據導入 多個不同格式的Sheet數據導入 主要步驟 1. 多個相同格式的Sheet數據導入 1.1 創建導入Sheet的Dto 主要代碼如下 ...
  • 圖文講解,一門教學級邏輯式編程語言,NMiniKanren,的運行原理。 ...
  • 大家好,我是良許。 大家知道,telnet 是一個閹割版的 ssh ,它數據不加密,數據容易被盜竊,也容易受中間人攻擊,所以預設情況下 telnet 埠是必須要被關閉的。 telnet為用戶提供了在本地電腦上完成遠程主機工作的能力,因此可以通過telnet來測試埠的連通性。 確認遠程主機的埠 ...
  • WSL中文本地化 Windows Subsystem for Linux(簡稱WSL)是一個在Windows 10上能夠運行原生Linux二進位可執行文件(ELF格式)的相容層。它是由微軟與Canonical公司合作開發,其目標是使純正的Ubuntu 14.04 "Trusty Tahr"映像能下載 ...
  • CentOS 7/8修改系統運行級別 CentOS 5、 CentOS 6可以通過修改配置文件/etc/inittab 參數,從而修改系統運行級別,切換系統的runlevel,但是從CentOS 7開始,不能用這個命令了,只能由systemd統一管理,並且減少到了兩個等級(當然這裡不包含powero... ...
  • 之前民工哥也給大家介紹過一款Nginx配置生成器:強大!Nginx 配置線上一鍵生成“神器”,不太瞭解的人可以去看一看。 最近民工哥又發現一款好用的網頁版開源工具,同樣它的功能也是Nginx配置生成器,功能非常強大,方便實用,它是:NginxWebUI。 NginxWebUI介紹 NginxWebU ...
  • 華為5月中旬首次向上汽的量產車型EUNIQ系列供應電機控制器,引起汽車電子行業人士高度關註。華為提供的電機控制器,可以3%的高精度調整電機扭矩和輸出控制。經過上汽MAXUS與華為的聯合調教,EUNIQ系列純電版車型0~50km/h加速成績小於5秒。優異的表現來源於車規級MCU的性能以及華為在電機控制 ...
  • SQL基礎隨記3 範式 鍵 什麼是範式?哈,自己設計會使用但是一問還真說不上來。遂將不太明晰的概念整體下 什麼是 & 分類 範式(NF),一種規範,設計資料庫模型時對關係內部各個屬性之間的聯繫的合理化程度的不同等級的規範要求。 分類: 1NF、2NF、3NF、BCNF(巴斯科德範式)、4NF、5NF ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...