很多人玩开发板用树莓派,树莓派的确很好,但是对于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硬盘线,无需单买。

搭建红外遥控arm-hadoop集群过程_第1张图片


然后分区格式化挂载硬盘,注意:硬盘插线需要在断电情况下进行,不要带电插拔。

#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的冒烟测试。


import select
import os, sys, time
import termios
def 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 rcode
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
new_settings = old_settings
new_settings[3] = new_settings[3] & ~termios.ICANON
new_settings[3] = new_settings[3] & ~termios.ECHONL
print '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集群,甚至家里的电器都可以遥控。这只是一个很简单的测试,开发板能干的事很多。