使用fabric解決百度BMR的spark集群各節(jié)點的部署問題

前言

和小伙伴的一起參加的人工智能比賽進入了決賽之后的一段時間里面箭券,一直在構(gòu)思將數(shù)據(jù)預處理過程和深度學習這個階段合并起來净捅。然而在合并這兩部分代碼的時候,遇到了一些問題辩块,為此還特意寫了腳本文件進行處理』琢現(xiàn)在比賽過去,我覺得應該把這部分的東西寫出來废亭,看看是否有其他朋友會遇到這方面問題国章,希望對他們有幫助。如有不對之處豆村,請大家指正捉腥,謝謝!

比賽遇到的集群各節(jié)點的部署痛點

一個前提

在初賽的時候你画,為了快捷提供數(shù)據(jù)接口給后面的深度學習模型建立使用抵碟,我們將數(shù)據(jù)預處理獨立出來,使用了最為簡單的Python操作坏匪。在此拟逮,考慮到的是,我們的代碼需要移植到評委所用的電腦當中進行驗證适滓,可能存在沒有import某些庫的情況敦迄,最后導致程序運行失敗。

麻煩之處

在進入到?jīng)Q賽后,由于這兩塊的結(jié)合在一起的迫切需求罚屋,我們不得不又重新import我們庫苦囱。然而在這塊當中,如果我們只在Master節(jié)點脾猛,問題很簡單撕彤,直接將庫打包好,寫個腳本就完事了猛拴。而在百度的BMR的spark集群里面羹铅,因為Slaves節(jié)點不能訪問網(wǎng)絡(如下圖),因而我們要登錄了Master節(jié)點之后愉昆,然后通過Master內(nèi)網(wǎng)ssh到Slaves上职员,進而才能打開我們的腳本部署好我們的程序運行環(huán)境。

提出

這樣子來說跛溉,我們有沒有一個很好的辦法焊切,能通過Master上運行一個腳本,達到了整個集群的所有節(jié)點都自動部署我們的程序運行環(huán)境呢芳室?經(jīng)過閱讀書籍《spark最佳實踐》专肪,了解到了Python的第三方庫fabric。

fabric

首先請允許介紹一下fabric渤愁,具體使用方法可以查閱官方API Doc牵祟,在此我介紹一下我將使用到某一小部分深夯。

執(zhí)行本地任務

fabric提供了一個local("shell")的接口抖格,shell就是Linux上的shell命令。例如

from fabric.api import local
 
local('ls /root/') #ls root文件夾下的文件列表

執(zhí)行遠程任務

fabric的強大之處咕晋,不是它在本地做到執(zhí)行命令雹拄,本地執(zhí)行的事兒可以用原生shell來解決,而是能在遠程的服務器上執(zhí)行命令掌呜,哪怕遠程的服務器上沒有安裝fabric滓玖。它是通過ssh方式實現(xiàn)的,因而我們需要定義一下三個參數(shù):

env.hosts = ['ipaddress1', 'ipaddress2']
env.user = 'root'
env.password = 'fuckyou.'

通過設(shè)置ip质蕉,用戶名以及用戶名密碼势篡,我們可以使用run("shell"),達到在遠程服務器上執(zhí)行我們所需要執(zhí)行的任務模暗。例如

from fabric.api import run, env
 
env.hosts = ['ipaddress1', 'ipaddress2']
env.user = 'root'
env.password = 'fuckyou.'
 
run('ls /root/') #ls root文件夾下的文件列表

打開某一個文件夾

有時候我們需要精準地打開某一個文件夾禁悠,之后執(zhí)行該文件下的某一個腳本或者文件。這是兑宇,我們得使用以下兩個接口:

本地

with lcd('/root/local/'):
        local('cat local.txt') # cat 本地'/root/local/'下的local.txt文件

遠程

with cd('/root/distance/'):
        run('cat distance.txt') # cat 遠程'/root/distance/'下的distance.txt文件

執(zhí)行fabric任務

我們可以通過命令行

fab --fabfile=filename.py job_func
# filename.py為使用fabric寫的Python文件 
# job_func 為帶有fabric的函數(shù)碍侦,即主要執(zhí)行的函數(shù)
# 以上兩個名稱都是可以自取,下面的介紹當中,我的為job.py 與 job

socket

為什么會用到socket呢瓷产?在上一篇文章當中站玄,我提及到在百度BMR的集群中,他們設(shè)置集群Slaves都是通過slaves的hostname的濒旦,而不是通過ip株旷。而因為在使用fabric設(shè)置環(huán)境中的hosts的時候需要用到ip,那我們得通過hostname疤估,進而找到ip灾常。

你或許有疑問,為什么不直接設(shè)定Slaves的IP呢铃拇?但是百度BMR每次創(chuàng)建spark集群钞瀑,它提供的內(nèi)網(wǎng)IP都是不斷在變動的,呈現(xiàn)出IP末端遞增慷荔。

綜上雕什,還是使用hostname獲取IP

gethostbyname接口

我們可以用過gethostbyname('hostname')接口,傳入hostname显晶,然后得到一個IPV4的ip地址贷岸。

使用fabric編寫各節(jié)點自動部署腳本

獲取Slaves的hostname

和上一篇文章說道的一樣,我們Slaves的hostname是藏在了百度BMR的這里:

'/opt/bmr/hadoop/etc/hadoop/slaves'

將hostname轉(zhuǎn)化為ip磷雇,設(shè)置fabric的env參數(shù)

host_list = []
f = open(path, 'r')
slaves_name = f.read().split('\n')
for i in range(1, slaves_name.__len__()-1):
    temp_name = slaves_name[i]
    temp_ip = socket.gethostbyname(temp_name)
    ip_port = temp_ip + ":22"
    host_list.append(ip_port)
    del temp_name
    del temp_ip
    del ip_port
env.user = 'root'
env.password = '*gdut728'
env.hosts = host_list

編寫需要自動部署的job

在這里偿警,我要自動部署的是:
1 下載Python第三方庫jieba
2 在本地解壓下載好的jieba壓縮包
3 在本地,進入到解壓好的文件夾中唯笙,安裝jieba
4 將下載好的壓縮包傳送到Slaves節(jié)點上
5 在遠程端螟蒸,解壓下載好的jieba壓縮包
6 在遠程端,進入到解壓好的文件夾中崩掘,安裝jieba

將上面步驟轉(zhuǎn)化為代碼七嫌,即

def job():
    local_command = "wget https://pypi.python.org/packages/71/46/c6f9179f73b818d5827202ad1c4a94e371a29473b7f043b736b4dab6b8cd/jieba-0.39.zip#md5=ca00c0c82bf5b8935e9c4dd52671a5a9"
    local(local_command)

    jieba_unzip = "unzip jieba-0.39.zip"
    jieba_path = "/root/jieba-0.39/"
    jieba_install = "python setup.py install"

    local(jieba_unzip)
    with lcd(jieba_path):
        local("ls")
        local(jieba_install)

    with lcd('/root/'):
        put("jieba-0.39.zip", '/root')

    run(jieba_unzip)
    with cd(jieba_path):
        run("ls")
        run(jieba_install)

結(jié)言

最后,在我上篇文章提到的shell腳本中苞慢,最前面加上

yum -y install fabric && fab --fabfile=job.py job 

輸入./start-hadoop-spark.sh诵原,即可無憂無慮地部署好我要使用的程序運行環(huán)境。因為懶挽放,因為麻煩绍赛,于是用Python外加shell寫了自動部署的腳本。在這個過程中辑畦,學習到不少知識吗蚌,也遇到不少麻煩,寫下文章航闺,希望可以減輕大家配置的煩惱~

結(jié)果如下:
Master:

Slaves1:

Slaves2:

參照

Fabric 中文文檔 http://fabric-chs.readthedocs.io/zh_CN/chs/
Python遠程部署利器Fabric詳解 http://python.jobbole.com/87241/
socket.gethostbyname() https://docs.python.org/2/library/socket.html#socket.gethostbyname

文章出自kwongtai'blog[http://www.reibang.com/u/468497adc52c]褪测,轉(zhuǎn)載請標明出處猴誊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侮措,隨后出現(xiàn)的幾起案子懈叹,更是在濱河造成了極大的恐慌,老刑警劉巖分扎,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澄成,死亡現(xiàn)場離奇詭異,居然都是意外死亡畏吓,警方通過查閱死者的電腦和手機墨状,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菲饼,“玉大人肾砂,你說我怎么就攤上這事『暝茫” “怎么了镐确?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饼煞。 經(jīng)常有香客問我源葫,道長,這世上最難降的妖魔是什么砖瞧? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任息堂,我火速辦了婚禮,結(jié)果婚禮上块促,老公的妹妹穿的比我還像新娘荣堰。我一直安慰自己,他們只是感情好褂乍,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布持隧。 她就那樣靜靜地躺著即硼,像睡著了一般逃片。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上只酥,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天褥实,我揣著相機與錄音,去河邊找鬼裂允。 笑死损离,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的绝编。 我是一名探鬼主播僻澎,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼貌踏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窟勃?” 一聲冷哼從身側(cè)響起祖乳,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秉氧,沒想到半個月后眷昆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汁咏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年亚斋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攘滩。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡帅刊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漂问,到底是詐尸還是另有隱情厚掷,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布级解,位于F島的核電站冒黑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勤哗。R本人自食惡果不足惜抡爹,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芒划。 院中可真熱鬧冬竟,春花似錦、人聲如沸民逼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼苍。三九已至笑诅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疮鲫,已是汗流浹背吆你。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俊犯,地道東北人妇多。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像燕侠,于是被迫代替她去往敵國和親者祖。 傳聞我的和親對象是個殘疾皇子立莉,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容