作者: paul

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!