Hadoop 在BeagleBoard开发板上的移植和运行

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

   ③ 指定Beagle-Xm的交叉编译器
      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

      交叉编译zlib
      ./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的差距越来越小。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值