閱讀662 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spark 官方文檔》在Amazon EC2上運行Spark

在Amazon EC2上運行Spark

Spark的ec2目錄下有一個spark-ec2腳本,可以幫助你在Amazon EC2上啟動、管理、關閉Spark集群。該腳本能在EC2集群上自動設置好Spark和HDFS。本文將會詳細描述如何利用spark-ec2腳本來啟動和關閉集群,以及如何在集群提交作業。當然,首先你必須在Amazon Web Services site上注冊一個EC2的賬戶。

 

spark-ec2可以管理多個命名集群。你可以用它來啟動一個新集群(需要提供集群大小和集群名稱),關閉一個已有的集群,或者登陸到一個集群。每一個集群的機器將會被劃分到不同的EC2安全組(EC2 security groups)當中,而這些安全組的名字是由集群的名稱派生而來。例如,對於一個命名為test的集群,其主節點(master)將被分到一個叫test-master的安全組,而其他從節點(slave)將被分配到test-slaves安全組。spark-ec2腳本會自動根據你提供的集群名稱,來創建安全組。你可以在EC2的控製台(Amazon EC2 Console)中使用這些名字。

準備工作

  • 首先,你需要創建Amazon EC2 key pair 。這需要登陸Amazon Web Services賬號,在AWS控製台(AWS console)上點擊側邊欄上的Key Pairs來創建,並下載。同時,你要確保給這私匙文件附上600權限(即:可讀可寫)以便使用ssh登陸。
  • 使用spark-ec2的時候,一定要設置好這兩個環境變量, AWS_ACCESS_KEY_ID 和AWS_SECRET_ACCESS_KEY,並使其指向你的Amazon EC2 access key ID 和 secret access key。這些都可以在AWS主頁(AWS homepage)上,點擊 Account > Security Credentials > Access Credentials獲得。

啟動集群

  • 切換到你下載的spark的ec2目錄下
  • 運行命令./spark-ec2 -k <keypair> -i <key-file> -s <num-slaves> launch <cluster-name>,其中<keypair>是你的Amazon EC2 key pair的名字(你創建Amazon EC2 key pair的時候所指定的名字),<key-file>是Amazon EC2 key pair的私鑰(private key)文件,<num-slaves>是slave節點個數(至少是1),<cluster-name>是你指定的集群名稱。

例如:

bash export AWS_SECRET_ACCESS_KEY=AaBbCcDdEeFGgHhIiJjKkLlMmNnOoPpQqRrSsTtU \
export AWS_ACCESS_KEY_ID=ABCDEFG1234567890123

./spark-ec2 --key-pair=awskey \
--identity-file=awskey.pem \
--region=us-west-1 \
--zone=us-west-1a \
launch my-spark-cluster
  • 集群啟動完成後,檢查一下集群調度器是否啟動,同時,你可以在Web UI上查看是否所有的slave節點都正確的展示出來了,Web UI的鏈接在腳本執行完以後會打印在屏幕上(通常這個鏈接是 https://<master-hostname>:8080)

你可以運行./spark-ec2 –help 來查看更多的選項。以下是比較重要的一些選項:

  • –instance-type=<instance-type> 可以指定EC2機器的實例類型。目前,該腳本隻支持64-bit的實例類型。
  • –region=<ec2-region>可以指定EC2集群部署於哪個地域,默認地域是 us-east-1。
  • –zone=<ec2-zone>可以指定EC2集群實例部署在哪些地區(EC2的可用地區)。指定這個參數時注意,有時候因為在某些地區可能出現容量不夠,因此你可能需要在其他地區啟動EC2集群。
  • –ebs-vol-size=<GB>可以在每個節點上附加一個EBS(彈性可持續存儲)卷,並指定其總容量,這些存儲時可持久化的,即使集群重啟也不會丟失。
  • –spot-price=<price> 將啟動競價型實例(Spot Instances)工作節點,這些節點可以按需分配,可競價,並且可以設定競價最高價格(以美元計)。
  • –spark-version=<version> 可以在集群中預先加載指定版本的spark。<version>可以是一個版本號(如:0.7.3)或者是一個git hash值。默認會使用最新版本的spark。
  • –spark-git-repo=<repository url> 可以指定一個自定義的git庫,從而下載並部署該git庫中特定的spark構建版本。默認使用Apache Github mirror 。如果同時指定了spark版本,那麼–spark-version參數值不能使用版本號,而必須是一個git提交對應的git commit hash(如:317e114)。
  • 如果啟動過程中由於某些原因失敗了(如:沒有給private key文件設定正確的文件權限),你可以用–resume選項來重啟並繼續已有集群的部署過程。

在VPC(Amazon Virtual Private Cloud)上啟動集群

  • 運行 ./spark-ec2 -k <keypair> -i <key-file> -s <num-slaves> –vpc-id=<vpc-id> -subnet-id=<subnet-id> launch <cluster-name>,其中,<keypair>是你的EC2 key pair(之前已經創建的),<key-file>是key pair中的私鑰文件,<num-slaves> 是從節點個數(如果你是第一次用,可以先設成1),<vpc-id> 是VPC的名稱,<subnet-id> 是你的子網名稱,最後<cluster-name>是你的集群名稱。

例如:

bash export AWS_SECRET_ACCESS_KEY=AaBbCcDdEeFGgHhIiJjKkLlMmNnOoPpQqRrSsTtU \
export AWS_ACCESS_KEY_ID=ABCDEFG1234567890123 

./spark-ec2 --key-pair=awskey \
--identity-file=awskey.pem \
--region=us-west-1 \
--zone=us-west-1a \
--vpc-id=vpc-a28d24c7 \
--subnet-id=subnet-4eb27b39 \
--spark-version=1.1.0 \
launch my-spark-cluster

運行應用

  • 轉到你下載的spark的ec2目錄下
  • 執行 ./spark-ec2 -k <keypair> -i <key-file> login <cluster-name> 遠程登錄到你的EC2集群,其中,<keypair> 和<key-file> 的說明見本文上麵(這裏隻是為了方便說明,你也可以使用EC2的控製台)
  • 如果需要把代碼或數據部署到EC2集群中,你可以在登錄後,使用腳本 ~/spark-ec2/copy-dir,並指定一個需要RSYNC同步到所有從節點(slave)上的目錄。
  • 如果你的應用需要訪問一個很大的數據集,最快的方式就是從Amazon S3或者Amazon EBS設備上加載這些數據,然後放到你集群中的HDFS上。spark-ec2腳本已經為你設置好了一個HDFS,其安裝目錄為/root/ephemeral-hdfs,並且可以使用該目錄下的bin/hadoop腳本訪問。需要特別注意的是,這個HDFS上的數據,在集群停止或重啟後,會被自動刪掉。
  • 集群中也有可以持久的HDFS,其安裝路徑為/root/persistent-hdfs,這個HDFS保存的數據即使集群重啟也不會丟失。但一般情況下,這個HDFS在每個節點上可使用的空間較少(約為3GB),你可以用spark-ec2的選項–ebs-vol-size來指定每個節點上持久化HDFS所使用的空間大小。
  • 最後,如果你的應用出錯,你可以看看改應用在slave節點的日誌,日誌位於調度器工作目錄下(/root/spark/work)。當然,你也可以通過web UI(https://<master-hostname>:8080)查看一下集群狀態。

配置

你可以編輯每個節點上的/root/spark/conf/spark-env.sh文件來設置Spark配置選項(如:JVM選項參數)。這個文件一旦更改,你必須將其複製到集群中所有節點上。最簡單的方式仍然是使用 copy-dir 這個腳本。首先,編輯主節點(master)上的spark-env.sh文件,然後,運行 ~/spark-ec2/copy-dir  /root/spark/conf 將conf目錄RSYNC到所有工作節點上。

configuration guide 這一邊文檔說明了有哪些可用的選項配置。

終止集群

請注意,如果EC2節點被關閉後,是沒有辦法恢複其數據的!所以,請務必確保在關閉節點之前,將所有重要的數據複製出來,備份好。

  • 切換到spark下的ec2目錄
  • 運行命令 ./spark-ec2 destroy <cluster-name>

暫停和重啟集群

spark-ec2腳本同樣支持暫停集群。這種情況下,集群實例所使用的虛擬機都是被停止,但不會銷毀,所以虛擬機上臨時盤數據都會丟失,但root分區以及持久HDFS(persistent-hdfs)上的數據不會丟失。停止機器實例不會多花EC2周期(意味著不用為機器實例付費),但會持續EBS存儲的計費。

  • 要停止一個集群,你需要切到ec2目錄下,運行 ./spark-ec2 –region=<ec2-region> stop <cluster-name>
  • 如果過後又要重啟,請運行 ./spark-ec2 -i <key-file> –region=<ec2-region> start <cluster-name>
  • 如果需要最終銷毀這個集群,並且不再占用EBS存儲空間,需要運行 ./spark-ec2 –region=<ec2-region> destroy <cluster-name>(如前一小節所述)

限製

  • 對“集群計算”的支持有個限製 – 無法指定一個局部群組。不過,你可以在<cluster-name>-slaves群組中手工啟動一些slave節點,然後用 spark-ec2 launch –resume 這個命令將手工啟動的節點組成一個集群。

如果你發現一些新的限製或者有什麼建議,歡迎貢獻(contribute)到社區。

訪問S3上的數據

Spark文件接口允許你通過相同的URI格式訪問所有在Amazon S3上的數據,當然這些數據格式必須是Hadoop所支持的。你可以通過這種URI格式指定S3路徑 s3n://<bucket>/path。在啟動Spark集群的時候,可以使用選項–copy-aws-credentials來指定訪問S3的AWS證書。更完整的訪問S3所需的Hadoop庫可以在這裏查看 Hadoop S3 page.

另外,訪問S3的時候,你不僅可以將單個文件路徑作為輸入,同時也可以將整個目錄路徑作為輸入。

 

最後更新:2017-05-19 17:31:50

  上一篇:go  《Spark 官方文檔》Spark獨立模式
  下一篇:go  SLFJ官方文檔翻譯邀請