轉自我的個人博客:https://showme.codes/2017-01-31/setup-spark-dev-env/
像學習Spark這類大數據平臺,搭建環境,是一件很費時費力的事情。特別是當你想使用多臺機器模擬真實生產環境時。
為了更有效的學習Spark,我決定將自己的學習環境按生產環境的要求來搭建。但是真實生產環境的群集往往由多個集群組成:Hadoop/Hbase集群、Zookeeper集群、Spark集群。掐指一算,至少需要6臺機器了。
我們真的需要買6臺機器嗎?當然不是,我們只需要在自己的電腦上虛擬化出6臺就好了。而我的電腦只有16G,虛擬化6臺太吃力了。最終,我決定搭建成以下結構:
以下是搭建過程:
環境的搭建
按以前學習像Spring這些類Web,開發環境的搭建非常簡單,也就引入幾個依賴,添加幾項配置,就好了。
但是學習Spark,我敢?肯定不少人在環境搭建這一環節踩坑。正因為這樣,才會有此博客。
Spark不是一框架,而是一個分布式的計算平臺。所以,你不能通過引入依賴,添加配置就完成搭建。需要先將Spark這個平臺部署起來。Spark支持4種部署方式:
- 單機:同一臺機器,同一進程,不同線程運行Master和Worker
- 偽分布式:同一臺機器,不同進程分別運行Master和Worker
- Standalone方式:多臺機器分別運行Master和Worker,自己解決資源調度
- Yarn和Mesos方式:將資源調度這一職責外包出去
雖然Spark的單機部署方式很簡單,但是沒有人會在生產環境上使用單機部署方式。而偽分布式我見不少人搭建,以此為基礎來學習Spark。但我不推薦。
因為在線上真正運行的是Standalone、Yarn、Mesos方式,也稱為完全分布式的方式。只有一開始就使用完全分布式的方式來進行開發調試,你才會學習到生產環境會遇到什么問題。
機器準備
?如果采取完全分布式的部署方式來學習,你必須準備?很多臺機器,就像上面所說的。
我想大多數人都會選擇虛擬化方案來得到多臺機器。我推薦Virtualbox。
我見不少人手工的創建一臺機器,然后安裝操作系統,接著想要多少臺機器,就復制幾臺,甚至還要分別進入機器修改每臺機器的IP。。。
這樣的方式,效率低,又很難與你的同事分享你的環境(也就是統一一個團隊的開發環境,以避免不同開發環境不同引起的問題)。
所以,我一開始就使用Vagrant。把機器的虛擬化這一動作進行自動化和版本化(提交到git倉庫中)。使用了Vagrant,你只需要在Vagrantfile中定義機器數據、機器的系統鏡像、CPU個數、內存,然后執行vagrant up
,就可以得到你想要的機器了。要與同事統一這些機器,只需要他使用相同的Vagrantfile就好了。
同時,這樣,還能實現:統一開發環境與生產環境使用同樣或相近的機器環境。
以下是一個Vagrantfile樣例:
Vagrant.configure(2) do |config|
VAGRANT_VM_PROVIDER = "virtualbox"
machine_box = "boxcutter/ubuntu1604" -> 系統鏡像
config.vm.define "offlinenode1" do |machine|
machine.vm.box = machine_box
machine.vm.hostname = "offlinenode1"
machine.vm.network "private_network", ip: "192.168.11.151" -> 指定IP
machine.vm.provider "virtualbox" do |node|
node.name = "offlinenode1"
node.memory = 4096 -> 指定內存
node.cpus = 2 -> 指定CPU個數
end
end
config.vm.define "offlinenode2" do |machine|
machine.vm.box = machine_box
machine.vm.hostname = "offlinenode2"
machine.vm.network "private_network", ip: "192.168.11.152"
machine.vm.provider "virtualbox" do |node|
node.name = "offlinenode2"
node.memory = 4096
node.cpus = 2
end
end
....... 還可以定義很多這樣的機器
end
搭建Spark集群
在準備好機器后,接下來做的就是搭建Spark集群。我會選擇Ansible來實現自動化搭建,而不是一臺臺機器登上去,一條條命令的執行安裝。
那么,只是學習階段,我為什么要自動化呢?正因為在學習階段,我們更要自動化搭建過程。作為新手很容易把環境弄亂了,又沒法一下子查到原因。但是自動化后,意味著版本化了搭建腳本,查原因時,只要對比版本庫就好了。
同時,也因為我要搭建的是Spark完全分布式,需要上3臺機器,除了安裝Spark,還需要安裝Hadoop。如果不自動化這整個過程,學習過程會浪費很多時間在重復工作上。
題外話:很多人反對項目開始時就考慮自動化所有的部署流程,理由是成本高(指人力成本),先實現功能再說。這兩點理由是站不住腳的,因為如果一開始不自動化,你后期返回來再補,成本會更高。因為會有歷史負擔!
監控集群
為什么我們要學習過程中就加上監控?寫出剛剛能運行的Spark應用,不難,但是誰知道你寫的應用的性能如何,有沒有發揮所有機器的作用呢?所以,我在一開始就會加上監控。
目前,我還沒有完成這部分工作。
自動化Submit提交Spark應用
在搭建好了Spark集群后,我們就可以寫Spark應用,然后將應用提交到Spark集群中運行。我們采用集群模式來submit spark應用,在集群中某臺Spark node上手工執行命令來提交:
./bin/spark-submit \
--class codes.showme.HbaseExample \
--master spark://192.168.11.153:7077 \
--deploy-mode cluster
--executor-memory 1G \
--total-executor-cores 2 \
/home/spark/spark/example.jar
如果不自動這個過程,你需要做:
- 在開發環境將應用打成jar包
- 手工將jar包copy上指定機器指定路徑
- 執行命令
所以,我又將這個過程寫成了Ansible腳本,你只需要在./ansible/
下執行:
./deploy-hbase-example.sh
就完成submit的操作了。
最后,我們的應用如果要上CI,完全沒有壓力!
小結
以上是我個人的Spark學習環境搭建方法。希望有經驗的同學能多多指教。
這是最終搭建好的環境:spark2-hadoop2.6-hbase-labs
祝大家學習愉快。