Docker的Hadoop一鍵啟動之旅
大數據、雲端運算這麼夯,數據資料的基礎建設是何等的重要,Hadoop基本上是個分佈式的開源應用程式框架(任意門),除了提供經典的MapReduce的平台,另外還支援分佈式的檔案系統,會說它是經典是因為現在的實務的應用程式已經都轉移到Apache Spark去了,這邊就暫且不提。
一般hadoop要有成效,至少要有4台主機以上….因此要建置Hadoop Distributed File System,最簡單的方式,還是透過Docker了
DockerHub上就有公司很友善的提供了Image來讓我們可以建置(試用)Hadoop(支援到Hadoop 2.7版本) …傳送門
看過Hadoop安裝於Linux的許多教學後(從java安裝到node設定,會有點想死),會萬千感謝提供這個Images的善心人士整個弄到可以一鍵安裝
廢話不多說,Hadoop Image Docker啟動命令:
建立好以後我們列表出來所有的container,發現,他已經好好的在運行了。
c93953e56bb6 762e8eefc162 “/etc/bootstrap.sh -d” 9 hours ago Up 9 hours 0.0.0.0:8020->8020/tcp, 2122/tcp, 0.0.0.0:8030->8030/tcp, 0.0.0.0:8040->8040/tcp, 0.0.0.0:8042->8042/tcp, 0.0.0.0:8088->8088/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:19888->19888/tcp, 0.0.0.0:49707->49707/tcp, 0.0.0.0:50010->50010/tcp, 0.0.0.0:50020->50020/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:50075->50075/tcp, 8031-8033/tcp, 0.0.0.0:50090->50090/tcp hadoop-dev-server
註:這個image可以讓我們一鍵啟動Single Node來試著與他的介面試著交互,然而若要實作多node的hadoop,來建立真正的分散式服務,怎麼辦?
一樣透過docker啊,多好,又有人建立了dockerfile(傳送門again),這邊先不談,先把基礎環境建立與操作方法做一篇記錄:
這裡面有好多port都bind出來了,但僅介紹一些常用Port,有部分Port估計是分散式架構下在用的,首先是50070,這個是Web介面,除了可以看到Hadoop Service的運行狀態,空間使用狀況,還可以看到檔案目錄清單
接著是9000,預設HDFS協定的Port,等等我們立馬來使用看看
Hadoop的檔案系統的使用方式,我知道有2種(有沒有其他方式,待後續一探究竟)
一種就是透過Web的方式,Python裡面可以安裝WebHDFS套件,透過http://xxxxx:50070,實際上是透過Restful Api進行檔案傳輸
而另一個就是直接透過hdfs協定,然而,要透過HDFS協定,就要先安裝Hadoop的程式,官網
(注意版本…目前Hadoop 2.7版本,請下載盡量相近的Hadoop版本,我就有遇到用太舊的hadoop程式去連2.7版的,出現的錯誤訊息是IPC version 9 cannot communicate with client version 4,追查了一下發現只是版本太舊的問題,透過以下下載安裝方式,就可以解決了)
這一塊因為必須具備Hdfs 的driver,所以必須要有相關的環境,像我在windows 上跑的python就因為driver問題,而選擇透過webhfds來交互
這次我下載的是hadoop-2.6.5 binary的版本(我之前去下載一些舊版本的hdfsclient的程式,就有遇到過不相容的狀況)
#wget http://apache.stu.edu.tw/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz
#tar -xzcf hadoop-2.6.5.tar.gz
經過一連串解壓以後,我們多了一個Hadoop 2.6.5的目錄,然而,Hadoop的程式是透過Java 寫的,所以要運行起來的話,Java 環境也是必要安裝
一種是透過手動的方式配置,詳細記錄如下:
另一種就是透過centos的方式安裝
#sudo yum install java
#java -version
印出以下代表運行java 該有的環境已經有了
openjdk version “1.8.0_141”
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)
然後,我們立即對我們的容器進行hdfs連結
#cd ~/hadoop-2.6.5/bin
#./hdfs dfs -ls hdfs://localhost:9000/
註:若透過後者easy_install的方式安裝java,執行hadoop時若有出現JAVA_HOME未配置的話,就要再export JAVA_HOME=/usr/local/jdk就可以了
若有顯示檔案根目錄(理論上跟web:50070所看到的目錄結構應該要一致)
Found 3 items
drwxr-xr-x – root supergroup 0 2017-06-27 16:39 hdfs://localhost:9000/exchange
drwxr-xr-x – root supergroup 0 2017-07-26 11:28 hdfs://localhost:9000/upload_files
drwxr-xr-x – root supergroup 0 2015-07-22 23:17 hdfs://localhost:9000/user
那就代表大功告成啦啦啦啦,後續直接對這個檔案系統操作的話,再參考相關指令集教學
例如上傳檔案的話,可以透過
~/hadoop-2.6.5/bin/hdfs dfs -put ~/test.txt hdfs://localhost:9000/upload_files
不過,馬上就會面臨到權限問題:
put: Permission denied: user=paul, access=WRITE, inode=”/test.txt._COPYING_”:root:supergroup:drwxr-xr-x
web就可以直接指定root,但linux連過去會依目前的使用者作為user
因此,可以得知,只要su到root,再執行/home/paul/hadoop-2.6.5/bin/hdfs dfs -put /home/paul/test.txt hdfs://localhost:9000/upload_files就可以了
drwxr-xr-x – root supergroup 0 2017-07-26 11:50 hdfs://localhost:9000/upload_files/exchange
-rw-r–r– 3 root supergroup 5 2017-07-27 01:29 hdfs://localhost:9000/upload_files/test.txt
至於要怎麼解決這個問題,包含透過使用者有自行的目錄權限,就還需要再研究了,等明天看看吧…時候不早了..
待閱讀:hadoop權限問題參考
[Docker]在Container內設定時區
今天遇到小小的問題,因為資料庫的時區設定是UTC,所以程式透過SQL Function取到時間都是UTC …
Blog Moved to Google Cloud Platform
Google Cloud Platform重磅(算嗎?)祭出 300美金額度的免費試用1年
立馬把目前的容器再度轉移到google cloud platform,並把paulfun.net指過去了
為了區分,來自google平台的網誌名稱,我改成了Paul’s Recipe Book(g)
這個(g)就是代表來自於Google Cloud Platform(GCP)
大約操作了一下,主觀地認為整體架構與azure的靈活度不相上下(我沒有看過amazon)
功能與效能都挺強悍的,所謂的強悍,雲端平台至少必須到達PaaS的層級,甚至是提供了SaaS的應用服服務,以前一間使用的vultr這間的VM提供商為例,僅能達到IaaS,租用的vm擁有最大的使用彈性,但是必須親手處理服務器管理,叢集群組建立,PaaS必須要能包含能加速應用開發時的服務,讓使用平台的用戶可能專注在Business上。而GCP直接提供像是有cloud datastore(nosql),也有rdb能支持mysql , postgre執行個體,而GCP負責進行複製作業、更新管理作業以及管理資料庫,對於我們,不用去親自架設叢集,管理這些所有的內部細節。
所以價格當然也有一定的水準,多付一些錢,而省下的維護與管理成本…應該是值得的
看來三國鼎立的時機到來了!
容器技術愈來愈成熟的情況下,加上migration真的愈來愈簡單,像我這種散戶在不同的平台裡移來移去,其實說跳就跳也是相當的容易
至於對我個人來說的成本會這麼低,其實都是因為各家的免費額度都還在(azure已花光)
這有點像是現在的電信商4G攜碼投靠,哪邊4g便宜又快,就移往哪
我相信這是市場競爭,畢竟當自己的錢花下去了以後,在額度到期前,我只能當作沒聽到了,即使很好康
最終,我應該要專注在Blog 的content本身才是,而非深陷在這些平台之間的選擇障礙吧
Keep going~
Testing and Deployment 概念圖
測試與佈署-自動化
jenkins是另一個主要課題,另一部分,就是環境配置檔的管理…
先前公司的做法是有一個環境配置資料庫,可以讓人員透過介面調整key/value的參數值
當jenkins deploy的時候,會自動replace掉程式中固定的參數(聽說好像是全面性,連程式敘述都會被置換掉)。
這一塊也還沒有想法,目前應該只有在跟git整合上而己,先讓程式可以boxing到docker container就好
若有緣人看到這個架構認為有什麼疑惑或是想法的話,歡迎來噹
linux上的網芳:samba指令記錄
這篇沒時間…從頭玩、介紹起…(連結)
純粹記錄常用到的指令..
因為常常需要在windows與linux之間傳檔案,要嘛就要架個ftp
為何不能透過網芳直接共用檔案呢?要靠Samba啦啦啦啦啦
安裝samba:
sudo apt-get install samba
編輯samba檔案:
nano /etc/samba/smb.conf
在檔案最後面加入這一段落
重啟samba服務
sudo service smbd restart
see it!
Python with docker 生產環境準備 – 初試啼聲
[記錄]使用Docker Compose 在Docker上試用Apache Mesos 和Marathon
如主題,記錄可用的Docker-Compose檔案,預設yml檔名必須是docker-compose
mkdir mesos
cd mesos
sudo nano docker-compose.yml
輸入以下內容
sudo docker-compose up -d
在centOS上安裝Docker CE(Communtity Edition) – 記錄
基本上,copy自連結,純粹記錄指令,因為各家linux的預設程式安裝器不盡相同,這邊記錄centos版本:
移除舊的docker
$ sudo yum remove docker docker-common container-selinux docker-selinux docker-engine docker-engine-selinux
設定repository(Docker CE)
- 安裝必要的套件
yum-utils,
yum-config-manager以及devicemapper所需要的storage driver:
device-mapper-persistent-data
andlvm2
- 啟用the
extras
CentOS repository. 確保能存取到docker-c所需要的
container-selinux
套件
$ sudo yum-config-manager –enable extras - 設定 預設取得stable 版本的repository(建議預設,即使你要用edge的版本)
- 選擇性: 啟用edge repository.
$ sudo yum-config-manager –enable docker-ce-edge - 若要關閉 the edge repository就使用
--disable
標籤,若要重新啟用,就使用enable
標籤,以關閉為例:
$ sudo yum-config-manager –disable docker-ce-edge
安裝docker
- 更新yum的套件清單
$ sudo yum makecache fast - 列出指定版本的docker清單
$ yum list docker-ce.x86_64 –showduplicates |sort -r -
安裝最新版本或是安裝特定版本的docker
$ sudo yum install docker-ce
or
$ sudo yum install docker-ce-<VERSION>Warning: If you have multiple Docker repositories enabled, installing or updating without specifying a version in the
yum install
oryum update
command will always install the highest possible version, which may not be appropriate for your stability needs. - 編輯
/etc/docker/daemon.json
. 好像是要配置存儲相關的設定,正式環境請見:連結{
“storage-driver”: “devicemapper”
} - 啟動Docker.
$ sudo systemctl start docker - 可以驗證docker是否安裝正確,跑跑看docker的hello world的映象檔吧$ sudo docker run hello-world
Docker映像與資料備份與還原:以cassandra為例
今天開發的時候遇到一個情況,就是我的測試程式依賴了我本機起的一個nosql cassandra服務,是建立在docker上的
因此我把程式提供給同事以後,發現他沒有環境,因此程式功能無法展示,當然一部份也要展示cassandra的使用方式
一時間還不會docker的備份與移轉,因此早上就急著先把vmware的images(約略15GB)複製給同事,光複製的時間就花了快二十分鐘,當下覺得這種環境移轉的方式太過於笨重,想到若我還要再把我本機的另一個安裝hadoop的vm也要copy過去的話,那這樣來來回回的時間就不知耗費掉多少,而且我的私人開發環境其實是我自己常用的密碼,所以分享起來也是挺麻煩的。
有上述念頭後,我開始嘗試著在我兩台不同的vm(都是ubuntu)上面,試著把docker備份流程做一次
docker images備份(起手式:連結)
首先,我們需要先將目前的container狀態commit,先docker -ps列出所有container的id
我們很快的就看到dev-cassandra就是我們要備份的目標,接著輸入以下的指令:docker commit -p {{container id}} {{repository-name}}
sudo docker commit -p 3b5 cassandra-devenv
接著回到docker images列表,我們就會看到我們的新commit的images已經被建立出來了(圖中第一個)
container已經被commit了以後,那我們要怎麼轉成實體檔案呢?
指令很簡單:
docker save -o ~/cassandra-devenv.tar cassandra-devenv
這個指令要跑一下子,跑完以後,我們可以看到tar檔已經產生,看起來要400mb左右,著實比vm動輒1x gb來得輕量許多
這裡有一個小陷阱,就是要先去chown給paul與chmod 給檔案合適的權限
備份docker的資料卷資料
images既然被備份出來以後,那我們的資料呢?
還記得dockers要怎麼看資料卷的現實綁定的位置呀?就要靠docker inspect 指令了
sudo docker inspect 3b5
看到container的環境資訊後,會發現幸好這個dockerfile有將資料獨立出來,在mount的字段下,我們可以看到/var/lib/cassandra的根目錄,被指派在我們本機(ubuntu)的/var/lib/docker/volumes/31a88f59c57b5a75b98f9c4e6a539e4140cb226760fc540b15b930d96010a84c/_data下。
(註:這邊不同系統的資料或設定目錄要視系統而定,不見得每個系統都有必要這樣做切割,但大部分有這樣切割設定的images佈署的彈性才會更好,也才會有更好使用率)
既然知道了cassandra相關檔案的實體位置,我們先將它備份壓縮起來吧。我已經可以想像等下要連同docker image的檔案與data要壓縮複製過去另一台主機。
先備份到個人目錄:
sudo cp -r /var/lib/docker/volumes/31a88f59c57b5a75b98f9c4e6a539e4140cb226760fc540b15b930d96010a84c /home/paul
記得要下-r,才會recursive的複製所有子目錄、檔案
這時/home/paul的目錄下就有了31a88f59c57b5a75b98f9c4e6a539e4140cb226760fc540b15b930d96010a84c
接著我們來進行打包成tar檔,tar的壓縮指令請參考:連結
tar -zcvf ./cassandra-data.tar ./31a88f59c57b5a75b98f9c4e6a539e4140cb226760fc540b15b930d96010a84c
建議可以使用加上-z的參數,代表,透過gzip的方式壓縮,若沒有-z或-j的話,是代表僅打包,不壓縮
ls -l看看壓完以後只剩下33MB,看起來效果不錯
既然都已經備份出來了,包含docker與資料的壓縮檔
那我們要怎麼從vm複製檔案到另一個vm呀?在我還沒學會scp指令前,我還真的只知道vm的linux開分享samba,然後透過windows去copy到另一台分享出來的目錄
以上動作,真的只需要1行指令就做的到了,那就是scp,我們先ssh到另一台目標移置的vm去!!
輸入scp指令看看使用方式:
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 … [[user@]host2:]file2
scp是secure copy的簡寫,因此我們可以從首n台主機host 1 ~host n的檔案,複製到local來,以我們的例子來說,我們只要切到目標主機的指令目錄以後,照著以下輸入
同意建立ecdsa以後,接著輸入遠端的密碼,就會發現他開始copy了:
scp [email protected]:/home/paul/cassandra-data.tar ./ [email protected]:/home/paul/cassandra-devenv.tar ./
restore docker的image
都搞定以後,我們輸入以下指令,就可以將這個備份load到這台vm的docker的images
sudo docker load -i ./cassandra-devenv.tar
不過怪異的是,不知有沒有參數可以指令輸入的repository name與tag,我load進來以後,預設是none。接著考慮本機的環境,我希望將cassandra的data目錄換一個位置:就到my/own/datadir吧,這邊沒有絕對名稱,只需要自己分的清楚,解壓縮以後,按照當初打包的相對位置先放置好:
tar -zxvf cassandra-data.tar
註:這邊我後來想想若在壓縮時,有透過-z的參數進行壓縮的話,建議命名就要是tar.gz,否則解壓端應該很難知道需不需要加上-z的參數,這邊因為都是我幹的,所以我當然知道要這樣搞。通通都解到目標目錄,接著看看目錄內容是不是都有了
(註:這邊我還省略了一些解壓目錄以後,再從目錄把檔案cp或mv到my/own/datadir的過程)
接著只要輸入神奇的docker run指令,就會發現
sudo docker run –name cassandra-dev -p 9042:9042 -v /my/own/datadir:/var/lib/cassandra -d e86
檢查一下,sudo docker ps,已經正常跑起來了,這邊其實我有發現,cassandra的服務通常都要跑三分鐘左右,有時initialize掛掉都是發生在2~3分之間,通常超過3分鐘,應該就是起來了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2cf14dc1d4d0 e86 “/docker-entrypoint.s” 6 hours ago Up 6 hours 7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp cassandra-dev
實際連到192.168.65.130(剛剛是從136備份過來)的cassandra來看看囉!嗯~資料看起來都有被複製過來~暫時大功告成!特此記錄一番
後記:每次要寫這種過程重現真的是很耗費時間(也整理了差不多1個多小時),我發現,最佳的記錄方式,其實就是當我們在試著學習與除錯的時候(若有那個餘裕啦)
就定期把相關的畫面與做過的事情,記錄到evernote或其他方便的地方,事後的整理事實上真的事半功倍…若下次有機會遇到的話…希望有機會想到…