分類: 我的安裝食譜

Docker的Hadoop一鍵啟動之旅

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啟動命令:

sudo docker run -d --name=hadoop-dev-server \
	-p 8020:8020 \
	-p 8030:8030 \
	-p 8040:8040 \
	-p 8042:8042 \
	-p 8088:8088 \
	-p 19888:19888 \
	-p 49707:49707 \
	-p 50010:50010 \
	-p 50020:50020 \
	-p 50070:50070 \
	-p 50075:50075 \
	-p 50090:50090 \
	-p 9000:9000 \
	762e8eefc162 /etc/bootstrap.sh -d

建立好以後我們列表出來所有的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 環境也是必要安裝

一種是透過手動的方式配置,詳細記錄如下:

tar -zxvf /home/paul/download/jdk-8u144-linux-x64.tar.gz -C /usr/local
mv /usr/loca/jdk-8u144-linux-x64.tar.gz /usr/local/jdk
sudo /etc/profile.d/development.sh

# 加入以下內容
JAVA_HOME=/usr/local/jdk
CLASSPATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

# 立即生效
. /etc/profile
ln -s -f /usr/local/jdk/bin/java /usr/bin/java
ln -s -f /usr/local/jdk/bin/javac /usr/bin/javac

# 關閉selinux
sudo nano /etc/selinux/config
# 將SELINUX=enforcing改為SELINUX=disable
# 查看java版本
java -version

另一種就是透過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權限問題參考

Blog Moved to Google Cloud Platform

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 概念圖

Testing and Deployment 概念圖

測試與佈署-自動化

jenkins是另一個主要課題,另一部分,就是環境配置檔的管理…

先前公司的做法是有一個環境配置資料庫,可以讓人員透過介面調整key/value的參數值

當jenkins deploy的時候,會自動replace掉程式中固定的參數(聽說好像是全面性,連程式敘述都會被置換掉)。

這一塊也還沒有想法,目前應該只有在跟git整合上而己,先讓程式可以boxing到docker container就好

若有緣人看到這個架構認為有什麼疑惑或是想法的話,歡迎來噹

linux上的網芳:samba指令記錄

linux上的網芳:samba指令記錄

這篇沒時間…從頭玩、介紹起…(連結)

純粹記錄常用到的指令..

因為常常需要在windows與linux之間傳檔案,要嘛就要架個ftp

為何不能透過網芳直接共用檔案呢?要靠Samba啦啦啦啦啦

 

安裝samba:

sudo apt-get install samba

編輯samba檔案:

nano /etc/samba/smb.conf

在檔案最後面加入這一段落

[python-app]
path = /home/paul/python-app
available = yes
read only = no
browseable = yes
public = yes
writable = yes
guest ok = yes

 

重啟samba服務

sudo service smbd restart


see it!

[記錄]使用Docker Compose 在Docker上試用Apache Mesos 和Marathon

[記錄]使用Docker Compose 在Docker上試用Apache Mesos 和Marathon

如主題,記錄可用的Docker-Compose檔案,預設yml檔名必須是docker-compose

mkdir mesos

cd mesos

sudo nano docker-compose.yml

輸入以下內容

zookeeper:
  image: garland/zookeeper
  ports:
   - "2181:2181"
   - "2888:2888"
   - "3888:3888"
mesosmaster:
  image: garland/mesosphere-docker-mesos-master
  ports:
   - "5050:5050"
  links:
   - zookeeper:zk
  environment:
   - MESOS_ZK=zk://zk:2181/mesos
   - MESOS_LOG_DIR=/var/log/mesos
   - MESOS_QUORUM=1
   - MESOS_REGISTRY=in_memory
   - MESOS_WORK_DIR=/var/lib/mesos
marathon:
  image: garland/mesosphere-docker-marathon
  links:
   - zookeeper:zk
   - mesosmaster:master
  command: --master zk://zk:2181/mesos --zk zk://zk:2181/marathon
  ports:
   - "8080:8080"
mesosslave:
  image: garland/mesosphere-docker-mesos-master:latest
  ports:
   - "5051:5051"
  links:
   - zookeeper:zk
   - mesosmaster:master
  entrypoint: mesos-slave
  environment:
   - MESOS_HOSTNAME=#xxx.xxx.xxx.xxx
   - MESOS_MASTER=zk://zk:2181/mesos
   - MESOS_LOG_DIR=/var/log/mesos
   - MESOS_LOGGING_LEVEL=INFO

sudo docker-compose up -d

在centOS上安裝Docker CE(Communtity Edition) – 記錄

在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)

  1. 安裝必要的套件 yum-utils, yum-config-manager以及devicemapper所需要的storage driver:device-mapper-persistent-data and lvm2
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 啟用the extras CentOS repository. 確保能存取到docker-c所需要的container-selinux 套件
    $ sudo yum-config-manager –enable extras
  3. 設定 預設取得stable 版本的repository(建議預設,即使你要用edge的版本)
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
  4. 選擇性: 啟用edge repository.
    $ sudo yum-config-manager –enable docker-ce-edge
  5. 若要關閉 the edge repository就使用 --disable 標籤,若要重新啟用,就使用enable標籤,以關閉為例:
    $ sudo yum-config-manager –disable docker-ce-edge

 

安裝docker

  1. 更新yum的套件清單
    $ sudo yum makecache fast
  2. 列出指定版本的docker清單
    $ yum list docker-ce.x86_64 –showduplicates |sort -r
  3. 安裝最新版本或是安裝特定版本的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 or yum update command will always install the highest possible version, which may not be appropriate for your stability needs.

  4. 編輯 /etc/docker/daemon.json. 好像是要配置存儲相關的設定,正式環境請見:連結{
    “storage-driver”: “devicemapper”
    }
  5. 啟動Docker.
    $ sudo systemctl start docker
  6. 可以驗證docker是否安裝正確,跑跑看docker的hello world的映象檔吧$ sudo docker run hello-world
Docker映像與資料備份與還原:以cassandra為例

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或其他方便的地方,事後的整理事實上真的事半功倍…若下次有機會遇到的話…希望有機會想到…