很多人玩開發板用樹莓派,樹莓派的確很好,但是對於hadoop來說,記憶體有點小,只有512MB。所以我找了一圈,最後用的是國內一個開源硬體團隊的產品叫CubieTruck。記憶體有2G,板載儲存有8G,千兆網口,可以掛載2.5寸機械或SSD硬碟。
先簡述一下大體步驟。
1. 刷系統,做系統
由於CubieTruck(以下簡稱CT)預設系統安裝的是安卓4.2,所以需要變更一下。換成ubuntu 的 linaro server 13.08。
2. 安裝部署Hadoop
這個沒啥可簡介的,由於hadoop是java語言編寫的,CPU指令集的問題是由JVM解決的,所以,理論上,Hadoop可以工作在任何一個平台下,包括arm。所以直接用apache官方的tar或者deb即可,我用32位的deb安裝,需要做一些調整,重新打包再安裝,安裝過程沒有問題,計算也沒發現錯誤。
3. 掛載紅外介面驅動,編寫紅外控制指令碼。
下面詳述整個步驟
一、刷系統
名詞解釋:
linaro:AMD,高通等arm研發廠商共同研製的ubuntu on arm作業系統,其實就是ubuntu。
nand:板載的儲存晶片,在linux裡被識別的裝置名稱。
用全志的PhoenixSuit工具,現在最新版本好像是1.0.8。下載CT官方的linaro server鏡像,所謂linaro,是當初amd,高通等公司聯合開發的ubuntu on arm。
然後按照軟體的每一步提示,可以很方便把板載系統替換為ubuntu server。
串連顯示器,鍵盤,網線等一切需要的外設,這裡不需要滑鼠,因為linux server是完全命令列操作的,任何在server上裝xwindows和gnome的都是傻缺的行為。
當然你也可以使用Desktop版把它作為mini pc使用,官方甚至還提供了fedora和arch linux供使用。
這時候工作剛剛開始,由於linux的鏡像沒有完全把8G的空間全部利用上,所以我們還要對nand進行重新劃分和格式化。刷機的linux img會將nand劃分為3個分區,nanda-nandc,在預設情況下,只用到了nanda和nandb,nandc完全沒利用,所以我們要把nandc格式化並掛載上。查看方式是ls /dev/nand*,預設直接進系統,如果提示使用者名稱密碼,用linaro/linaro即可。可sudo su -為root
#cd /dev#mkfs.ext4 /dev/nandc#echo "mount /dev/nandc /opt" >> /etc/rc.local#mount /dev/nandc /opt#df -h
格式化並掛載之後,df -h查看,多了5.1G左右的空間。
假設掛載了硬碟,CT可無障礙掛載SATA 2.5寸硬碟,在linux中硬碟識別為sda裝置,CT硬碟供電口有兩個,黃黑的是12V供電,紅黑的是5V供電。接入2.5寸盤需要把兩個介面都插上。12V供電口在靠近網卡一側,5V為遠離網卡一側。看紅色主板的接法,CT裡面提供SATA硬碟線,無需單買。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/140107/0P3451626-0.jpg" title="IMG_7300_副本.jpg" width="600" height="400" border="0" hspace="0" vspace="0" style="width:600px;height:400px;" alt="wKioL1LHfvuRFljSAAEJnBvtYIY238.jpg" />
然後分區格式化掛載硬碟,注意:硬碟插線需要在斷電情況下進行,不要帶電插拔。
#fdisk /dev/sda#mkfs.ext4 /dev/sda1#mkdir -p /data#echo "mount /dev/sda1 /data" >> /etc/rc.local#mount /dev/sda1 /data
fdisk具體操作看提示,m是協助,正常情況下新硬碟用n建立新的primary分區。舊硬碟需要用d命令先刪除舊分區。然後再n一個primary分區,剩下的一路斷行符號。最後用w將分區資訊儲存,退出後執行格式化。
這時應該是把硬碟掛載到/data路徑下了,第一步刷機的工作完成。如果喜歡的話,可以執行以下apt-get update和upgrade。
二、安裝部署Hadoop
可直接用官方的tar包安裝,也可使用deb安裝,我使用官方提供的deb安裝,但是需要做一些改造的操作,預設官方提供i386和amd64的deb包。這個在arm上無法安裝,會提示cpu arch問題,但是實際是可以使用的,這個可以自己做一個deb包出來,過程如下,官方下載i386的deb。
然後執行改造和重打包
#dpkg -x hadoop_1.2.1-1_i386.deb hadoop_1.2.1-1_all#dpkg -e hadoop_1.2.1-1_i386.deb hadoop_1.2.1-1_all#cd hadoop_1.2.1-1_all/DEBIAN#vi control #將裡面的Architecture: i386改成Architecture: all,或者是#Architecture: armhf,其他不動,儲存退出#cd ../../#dpkg -b hadoop_1.2.1-1_all#dpkg -i hadoop_1.2.1-1_all.deb
hadoop包會建立兩個使用者hdfs和mapred。
分別給hdfs和mapred使用者建立ssh免密碼通道,剩下的就是看配置分布式hadoop的官方手冊了。這裡不再贅述hadoop的部署過程。跟在x86的過程一模一樣。
最後配置完了就是能夠用如下命令順利啟動即可。
#sudo -u hdfs start-dfs.sh#sudo -u mapred start-mapred.sh
三、紅外口編程。
紅外口編程需要載入紅外口的核心模組,lsmod看一下,如果沒有sun4i_ir,就執行一下modprobe sun4i_ir驅動。
然後編輯一個ir.py的檔案,做紅外的接收和相應控制。在我的電視遙控器上,按2捕獲到的是鍵盤的1,按3捕獲的是鍵盤2,以此類推。之前可以先測試一下,啟動該指令碼後是否可以在tty1上捕獲到紅外輸入。注意,必須是tty1,也就是顯示器接到CT上的那個控制台。在這個指令碼裡,按2是啟動hdfs,按3是停止,按4是啟動mapred,按5是停止mapred,按6是啟動balancer,按7是停止balancer,按8是啟動一個mapred的煙霧測試 (Smoke Test)。
import selectimport os, sys, timeimport termiosdef ir_catch(): fd = sys.stdin.fileno() r = select.select([sys.stdin],[],[],0.01) rcode = '' if len(r[0]) >0: rcode = sys.stdin.read(1) return rcodefd = sys.stdin.fileno()old_settings = termios.tcgetattr(fd)new_settings = old_settingsnew_settings[3] = new_settings[3] & ~termios.ICANONnew_settings[3] = new_settings[3] & ~termios.ECHONLprint 'old setting %s'%(repr(old_settings))termios.tcsetattr(fd,termios.TCSAFLUSH,new_settings)while True: c = ir_catch() if len(c) !=0 : #print 'input: %s'%(ord(c)) if(ord(c) == 10): print 'Power' os.popen('reboot') elif(ord(c) == 49): print '2' f = os.popen('sudo -u hdfs /usr/sbin/start-dfs.sh').readlines() for a in f: print a elif(ord(c) == 50): print '3' f = os.popen('sudo -u hdfs /usr/sbin/stop-dfs.sh').readlines() for a in f: print a elif(ord(c) == 51): print '4' f = os.popen('sudo -u mapred /usr/sbin/start-mapred.sh').readlines() for a in f: print a elif(ord(c) == 52): print '5' f = os.popen('sudo -u mapred /usr/sbin/stop-mapred.sh').readlines() for a in f: print a elif(ord(c) == 53): print '6' f = os.popen('sudo -u hdfs /usr/sbin/start-balancer.sh').readlines() for a in f: print a elif(ord(c) == 54): print '7' f = os.popen('sudo -u hdfs /usr/sbin/stop-balancer.sh').readlines() for a in f: print a elif(ord(c) == 55): print '8' f = os.popen('sudo -u mapred hadoop jar /usr/share/hadoop/hadoop-examples-1.2.1.jar pi 10 100').readlines() for a in f: print a else: print 'Unknown' else: #print 'Sleep 1' time.sleep(1)
四、贅述
開啟紅外和gpio的操作以後,可以做的事情很多,不僅僅是遙控hadoop叢集,甚至家裡的電器都可以遙控。這隻是一個很簡單的測試,開發板能乾的事很多。
本文出自 “實踐檢驗真理” 部落格,謝絕轉載!