1.准备工作
这里主要是将Hadoop跑在了TI的BeagleBoard开发板(ARM处理器)上,在将Hadoop移植的过程中只修改了一处Hadoop的源码,主要还是BeagleBoard平台上相应工具的交叉编译。下面的过程有些地方说的可能不会特别细,但是会将所有需要注意的地方进行说明,至于交叉编译的过程只是给大家参考即可。
需要的源码包如下:
hadoop-1.0.4.tar.gz
openssh-6.0p1.tar.gz
zlib-1.2.3.tar.gz
openssl-1.0.0j.tar.gz
apache-ant-1.8.4-bin.tar.gz
jdk-7u11-linux-i586.tar.gz
jdk-7u10-linux-arm-sfp.tar.gz
bash-4.0.tar.gz
2.openssh交叉编译
TI嵌入式设备提供的文件系统中默认的ssh服务是dropbear软件来提供的。但是hadoop搭建过程中用的ssh服务是由openssh软件提供。所以需要进行openssh的移植 。openssh的移植过程需要依赖于zlib、以及openssl软件。通过网络下载最新的openssh、openssl、以及zlib源码包都可以使用,这里我们使用的是最新的源码包,分别是openssh-6.0p1.tar.gz、zlib-1.2.3.tar.gz、openssl-1.0.0j.tar.gz。
① 新建工程目录/opt/BeagleXM目录
mkdir /opt/Beagle
② 将源码包拷贝到linux主机的/opt/BeagleXM目录下,解压开来
tar –xzf zlib-1.2.3.tar.gz
tar –xzf openssh-6.0p1.tar.gz
tar –xzf openssl-1.0.0j.tar.gz
export PATH=$PATH:/opt/BeagleXM/arm-2009q1/bin
export CC=arm-none-linux-gnueabi-gcc
重新启动板子,查看sshd服务是否能够开机启动,系统系统了,通过nestat –nat 查看22端口是否打开。
注意:Beagle-XM交叉编译器放在/opt/BeagleXM/arm-2009q1。需要根据自身交叉编译器位置做修改,只需要 能知道到交叉编译器就可以。④ 使用交叉编译器编译zlib
进入解压开来的/opt/BeagleXM/zlib-1.2.3目录下
cd /opt/BeagleXM/zlib1.2.3
在创建install文件夹
make install
./configure --prefix=/opt/BeagleXM/zlib-1.2.3/install/
make
make install
⑤ 使用交叉编译器编译openssl
进入解压开来的/opt/BeagleXM/openssl-1.0.0j目录下
cd /opt/BeagleXM/openssl-1.0.0j
在创建install文件夹
mkdir install
交叉编译openssl
./Configure --prefix=/opt/BeagleXM/openssl-1.0.0j/install os:compiler:
修改Makefile文件,使得其中
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar
RANLIB=arm-none-linux-gnueabi-ranlib
NM=arm-none-linux-gnueabi-nm
TAR=arm-none-linux-gnueabi-ar[具体指向相对应的交叉编译器命令]
修改完成之后
make
make install
⑥ 使用交叉编译器编译openssh
进入解压开来的/opt/BeagleXM/openssh-6.0p1目录下
cd /opt/BeagleXM/ openssh-6.0p1
在创建install文件夹
mkdir install
交叉编译openssh(这里的prefix是非常关键的,最后你的交叉编译生成的那些配置文件什么的,也要放在板子相应的这个/usr/local目录,如果你想放在板子根目录下的相应子目录下,则此处prefix执行根目录)
./configure--prefix=/usr/local/ --with-zlib=/opt/BeagleXM/zlib-1.2.3/install/ --with-ssl-dir=/opt/BeagleXM/openssl-1.0.0j/install --host=arm-none-linux-gnueabi --disable-etc-default-login --with-libs
make
[注意不需要make install]
⑦ 拷贝相应文件到嵌入式文件系统中
在板子/usr/local建立文件夹bin etc libexec sbin share
将/opt/BeagleXM/ openssh-6.0p1目录中编译好的目标文件
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan
复制到板子或镜像/usr/local/bin目录中(也可以放在/bin);
moduli ssh_config sshd_config复制到板子/usr/local/etc;
sftp-server ssh-keysign复制到板子/usr/local/libexec目录(也可以放在/usr/libexec);
sshd复制到/usr/local/sbin目录(也可以放在/sbin或/usr/sbin);
⑧ 在嵌入式设备上建立相应的用户
建立sshd用户
可以直接修改/etc/passwd、/etc/group文件
在passwd中加入
sshd::103:103::/var/run/sshd:/bin/sh
在group中加入
sshd:*:103:
在板子上执行下面命令
ssh-keygen -t rsa1 -f ssh_host_key -N ""
ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
ssh-keygen -t dsa -f ssh_host_dsa_key -N ""【可以在PC上,也可以再板子上】
将生成的文件复制到/usr/local/etc目录中。
建立目录/var/empty
⑨ opensshd服务添加到系统启动中
删除板子文件系统中默认的sshd软件的启动文件
查看板子当前启动等级,通过板子文件系统inittab文件, Beage-XM板子是5等级,之间删除板子文件系统/etc/rc5.d/S10dropbear软链接。
在板子的文件系统中创建文件openssh,并且修改权限为755
touch openssh
chmod 755 openssh
查看板子当前启动等级,通过板子文件系统inittab文件
在相应的启动等级的启动项文件夹中添加S10opensshd软链接指向板子文件系统/etc/init.d/openssh文件
ln –s ../init.d/openssh S10opensshd
⑩ openssh服务测试
在板子上启动 /usr/local/sbin/sshd
在PC上通过ssh客户端连接板子是否、或者通过netstat –nat 查看22端口是否打开
3.Bash交叉编译
TI嵌入式平台提供的shell命令解析是通过sh来完成的,然而hadoop中脚本的解析是通过bash来完成的,所以需要移植bash到板子的文件系统中。
解压源码包
tar –xzf bash-4.0.tar.gz
进入解压开的文件夹bash-4.0,创建install
cd /opt/BeagleXM/bash-4.0
mkdir install
执行configure、make、make install
./configure --prefix=/opt/BeagleXM/bash-4.0/install/ --host=arm-linux --without-bash-malloc
make
make install
拷贝生成的bash到板子的文件系统的/usr/bin目录下,生成的bash在前面制定的prefix目录下的bin/bash文件。
验证bash
在板子上面执行bash命令,看是否能够正常执行。
4.嵌入式平台jdk的安装
将针对arm平台推出的jdk-7u10-linux-arm-sfp.tar.gz拷贝到板子的文件系统的/opt目录下
解压jdk-7u10-linux-arm-sfp.tar.gz
tar –xzf jdk-7u10-linux-arm-sfp.tar.gz
修改板子/etc/profile文件,添加JAVA命令的目录。
在/etc/profile文件的最后,添加如下内容
set JAVA_HOME=/opt/jdk1.7.0_10
export JAVA_HOME
export PATH=$PATH:/opt/jdk1.7.0_10/bin
验证jvm在嵌入式平台上是否能够正常运行
在板子上执行source /etc/profile命令
在板子上执行java –version命令,查看输出是否正确。
5.修改Hadoop源码并重新编译
jvm中针对随机数的生成方法提供了一种框架,可以调用外面的随机数生成算法来生成随机数,hadoop源码中调 用了随机数生成算法,但是在嵌入式平台环境的集群的搭建的过程中,出现了程序阻塞的情况,所以直接修改了hadoop中关于随机生生成使用的代码片段。Hadoop源码编译使用安装包里面自带的机制,通过ant编译程序。
① 配置linux主机jvm
将jdk-7u11-linux-i586.tar.gz拷贝到Linux主机下,解压开来
tar –xzf jdk-7u11-linux-i586.tar.gz
配置linux主机/etc/profile。在/etc/profile文件的后面加入如下内容:
JAVA_HOME=/opt/jdk1.7.X[具体根据自己jdk版本而定]
export JAVA_HOME
export PATH=$PATH:/opt/jdk1.7.X/bin[具体根据自己jdk版本而定]
执行Source /etc/profile 命令
执行java –version命令,查看输出是否正确。
② 配置ant编译环境
将apache-ant-1.8.4-bin.tar.gz 拷贝到linux pc主机的/opt目录下,解压开来
tar –xzf apache-ant-1.8.4-bin.tar.gz
修改linux pc主机/etc/profile文件,在后面加入
export ANT_HOME=/opt/apache-ant-1.8.4
export PATH=$PATH:/opt/apache-ant-1.8.4/bin
执行source /etc/profile命令
执行ant命令,查看命令是否正常使用
③ 编译hadoop源码
将hadoop-1.0.4.tar.gz 拷贝到linux pc主机的/opt目录下,解压开来
tar –xzf hadoop-1.0.4.tar.gz
修改linux pc主机/etc/profile文件,在后面加入
export HADOOP_HOME=/opt/hadoop-1.0.4
export PATH=$PATH:/opt/ hadoop-1.0.4/bin
执行source /etc/profile命令
④ 替换原jar包,使用编译之后hadoop版本
在Linux PC主机上,进入/opt/hadoop-1.0.4目录下,
cd /opt/hadoop-1.0.4
修改随机数生成函数:修改src/hdfs/org/apache/hadoop/hdfs/server/datanode/DataNode.java文件内容
将其中的某一行内容
Rand = SecureRandom.getInstance(“SHA1PRNG”).nextInt(Interger.MAX_VALUE);
修改成
Rand = R.nextInt(Integer.MAX_VALUE);
在/opt/hadoop-1.0.4目录下执行ant命令
ant
将会自动编译hadoop源码,编译出来生成的jar包存放在./build/目录下。
拷贝./build目录下hadoop-core-1.0.4-SNAPSHOT.jar , 覆盖当前目录下的hadoop-core-1.0.4.jar
cp ./build/ hadoop-core-1.0.4-SNAPSHOT.jar ./
[hadoop的编译必须在联网的基础才能完成]
6.Hadoop集群环境搭建
使用了一台linux的PC作为master、两块Beagle-XM板子作为datanode。只所以选择PC节点作为主节点是因为板子资源有限,如果用板子作为主节点整个集群可能跑不起来,即使勉强跑起来了,在后面跑程序也会由于内存不足使程序挂掉。
主机名称以及程序部署
修改Ubuntu10.04的/etc/hostname内容为master
修改Beagle-XM机器IP为192.168.5.12的/etc/hostname为slave1
修改Beagle-XM机器IP为192.168.5.11的/etc/hostname为slave2
修改三台机器的/etc/hosts的内容为
192.168.5.128 master
192.168.5.12 slave1
192.168.5.11 salve2
嵌入式hadoop用户以及用户组的建立
在三台机器上都创建hadoop组,hadoop用户,密码分别是xidian123456
addgroup hadoop
adduser –home=/home/hadoop hadoop hadoop
之后将会在/home的主目录生成hadoop的用户目录。
集群节点之间通过ssh实现无密码数据交换
在master的节点上,切换到hadoop用户
su hadoop
在/home/hadoop目录下创建.ssh目录
cd /home/hadoop
mkdir .ssh
在master的机器上生成密钥对
ssh-keygen –t rsa
切换到/home/hadoop/.ssh目录下,执行命令生成authorized_keys
cp id_rsa.pub authorized_keys
分别在slave1、slave2的机器上,切换到hadoop用户,在/home/hadoop目录下创建.ssh目录
将master生成的authorized_key拷贝到.ssh中
修改slave1/slave2中/home/hadoop/.ssh中的authorized_key 文件的权限
chmod 644 authorized_key
验证是否ssh在master中通过hadoop用户无密码登陆到slave1和slave2中
ssh slave1
ssh slave2
如果可以无密码登录说明正常。
解压hadoop以及赋予文件权限
该过程需要在所有的节点上操作(master/slave1/slave2)
解压修改过的hadoop源码的软件包到/home/hadoop目录下
修改/home/hadoop/hadoop-1.0.4的文件权限给hadoop用户
chown -hR hadoop:hadoop ./hadoop-1.0.4
修改/etc/profile文件,在文件的结尾添加如下内容
export HADOOP_HOME=/home/hadoop/hadoop-1.0.4/
export PATH=$PATH: /home/hadoop/hadoop-1.0.4/bin
解压jdk安装包
该过程需要在所有的节点上操作(master/slave1/slave2)
将jdk安装包拷贝到相应的文件系统/opt目录下解压,修改/etc/profile文件
tar –xzf jdk-7u11-linux-i586.tar.gz [master,PC]
tar –xzf jdk-7u10-linux-arm-sfp.tar.gz [slave1/slvae2,嵌入式]
在/etc/profile文件的后面添加如下
export JAVA_HOME
export PATH=$PATH:/opt/jdk1.7.0_10/bin [实际的情况根据具体jdk解压位置做相应的调整]
在[master/slave1/slave2]板子上执行
souce /etc/profile命令
执行java –version 查看输出是否正确,检查java命令路径是否正确。
修改hadoop中各节点的配置文件
该过程需要在所有的节点上操作(master/slave1/slave2)
master/slave1/slave2中hadoop配置文件的修改完全一致,这里只说明master上的配置文件的修改,slave1/slave2上配置文件的修改一样。
需要修改的文件主要:
/home/hadoop/hadoop-1.0.4/conf/masters
/home/hadoop/hadoop-1.0.4/conf/slaves
/home/hadoop/hadoop-1.0.4/conf/mapred-site.xml
/home/hadoop/hadoop-1.0.4/conf/hdfs-site.xml
/home/hadoop/hadoop-1.0.4/conf/hadoop-env.xml
/home/hadoop/hadoop-1.0.4/conf/core-site.xml
目录权限的修改
该过程需要在所有的节点上操作(master/slave1/slave2)
转到/home/hadoop/目录下,执行chown命令,将hadoop-1.0.4目录的权限赋予用户hadoop
chown -hR hadoop:hadoop hadoop-1.0.4
检查各节点sshd服务以及是否实现hadoop用户无密码通信
该过程只适用于master主机
在master节点上切换到hadoop用户
su hadoop在master节点上使用hadoop用户生成密钥对
转到/home/hadoop/.ssh目录下
cd /home/hadoop/.ssh/
ssh-keygen –t rsa
该命令将在/home/hadoop/.ssh目录下生成id_rsa id_rsa.pub文件。复制id_rsa.pub文件到新文件/home/hadoop/.ssh/authorized_keys
cat id_rsa.pub >> authorized_keys
拷贝authorized_keys文件到slave1/slave2的/home/hadoop/.ssh目录下
scp authorized_keys slave1:/home/hadoop/.ssh/
scp authorized_keys slave2:/home/hadoop/.ssh/
验证无密码登陆
在master主机上,切换到hadoop用户。执行如下命令,如果不需要密码登陆到slave1/slave2主机中,说明一切正常。
ssh slave1
ssh slave2
Hadoop节点格式化
该过程只适用于master节点,并且只需在系统搭建的第一次使用hadoop格式化命令
转到/home/hadoop/hadoop-1.0.4/bin目录下
切换hadoop用户
su hadoop
执行hadoop格式化命令
Hadoop namenode -format
集群的启动
转到/home/hadoop/hadoop-1.0.4/bin目录下
cd /home/hadoop/hadoop-1.0.4/bin
切换hadoop用户
su hadoop
执行start.sh 格式化命令
./start.sh
浏览器登陆http://master:50070,稍等片刻看看Hadoop集群是否启动成功,两个板子上的DataNode节点是否已经成功启动。
7.搭建总结:
上面对如何将Hadoop跑在嵌入式平台上作了一个简单的介绍,主要的内容还是Hadoop那个源码的修改,如果不修改Hadoop源码,hadoop在运行时会卡住,剩下的事情其实就是一个工具的交叉编译,交叉编译主要注意的就是openssh,注意下configure时所配置的安装目录位置,这个会被编译到openssh程序的某个地方,在板子上执行sshd程序时也会从相应的目录下找配置文件。
8.性能测试
为了对板子板子上所运行的Hadoop环境进行一个简单的性能测试,做了如下一个实验,实验内容为对1020张320x240的bmp图片做一个图像增加处理。我用两个DataNode节点运行在PC上的Hadoop,和上述搭建的两个开发板作为DataNode的Hadoop来分别执行图片处理。
节点参数如下:
1)PC DataNode:(虚拟机上跑的Ubuntu)
处理器:Intel® Xeon® CPUW3503 @2.40GHZ
内存:1.5G
2)BeagleBoard开发板:
处理器:1GHz
内存:512
实验结果:
PC的Hadoop:26分11秒
板子的Hadoop:43分57秒
结果分析:
从实验结果来看,板子上所跑的Hadoop的性能和PC相比差一倍,但是从功耗方面和主频处理速度来考虑,BeagleBoard主频的速度跟PC相比差了两倍多,这可能是最主要的性能因素,还有两个板子的功耗和两台PC相比功耗节省的不止2倍,并且由于BeagleBoard上还有DSP处理器,图形加速器等资源,如果充分利用的话在有针对性地计算任务面前,其处理速度方面可能会跟PC的差距越来越小。