读书人

hadoop集群环境筹建

发布时间: 2012-08-03 00:12:14 作者: rapoo

hadoop集群环境搭建

听说Hadoop很久了,今天开始尝试自己搭建一个集群来玩玩,同时学习下Linux各种操作。

主要参考资料当然是官方文档了:

Hadoop 集群搭建:http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.html

Hadoop 快速入门:http://hadoop.apache.org/common/docs/r0.19.2/cn/quickstart.html

采用的操作系统是 Ubuntu 11.04.03 64-bit Server。

通过VMware 来创建虚拟网络,这也是现实问题,没有那么多机器啊hadoop集群环境筹建

?

预计的设计是这样,4台虚拟机:NameServer, JobTracker, DataNode01, DataNode02。

主机为Win7。

?

首先安装系统,这个没有什么好说的,VMware有Easy Install,中间偶尔干涉一下,就完事了。

然后安装必须的软件,第一个就是JAVA,Hadoop推荐使用Sun公司的Java, 但是用apt-get install java, 只有openjdk之类的。于是上网搜了半天,找到一篇文章(http://blog.csdn.net/ansomray/article/details/5825096),根据其说明,添加apt source,再重新安装,命令如下:

view plain
  1. sudo?add-apt-repository?"deb?http://archive.canonical.com/?lucid?partner"??
  2. ??
  3. sudo?apt-get?update??
  4. ??
  5. sudo?apt-get?install?sun-java6-jdk??

然后设置JAVA_HOME:

?

view plain
  1. sudo?vi?/etc/environment??

在其中添加

?

?

view plain
  1. <pre?name="code"?style="font-size: 12px; background-color: #e7e5dc; width: 687px; margin-top: 18px !important; margin-right: 0px !important; margin-bottom: 18px !important; margin-left: 0px !important; padding-top: 1px;">view plain
    1. sudo?apt-get?install?ssh??
    2. sudo?apt-get?install?rsync??

    再来就是获取Hadoop的发行版,这个可以从这里获取稳定发行版。

    ?

    在Win7中下载下来后,问题就来了,怎么从Ubuntu Server中访问Win7的东西,这玩意儿只有命令行啊。继续搜索,发现是通过mount 的方式来处理: 先在mnt下建立一个目录,然后把Win7中共享的文件mount 到那个目录上,这样就可以访问了。命令如下:

    ?

    view plain
    1. sudo?mkdir?/mnt/HostShare??
    2. sudo?mount?-t?cifs?-o?username=myname,password=11111?//192.168.0.100/share?/mnt/HostShare??

    这里本来是查到的用smbfs,结果Ubuntu说这个好像将从2.6.27内核中删除,不推荐使用,于是采用了cifs。同时好像必须要同时提供username和password,不然就会说writen-protected,mount不上去。

    ?

    最后当然是建立Hadoop目录,解压弄下来的文件,我下载的是.tar.gz文件,所以命令如下:

    ?

    view plain
    1. sudo?tar?zxvf?hadoop.tar.gz??
    2. sudo?mv?hadoop-hadoop-0.20.203?/hadoop??
    第二个命令是把解压后的文件夹移动到根目录并重命名为hadoop,这个是为了管理方便。

    ?

    ?

    这样,基本的软件准备就搞定了,下面就是拷贝装好的第一台虚拟机,再复制三台出来,分别按照预定各自命名,然后就是组建网络了。

    软件准备好了,开始搭建网络。

    我用的是VMware WorkStation 6.5,而VMware提供了三种网络支持:Bridge, Nat, Host Only。

    关于VMware的网络概念,我严重参考了这篇文章:深入理解VMware虚拟网络(http://wangchunhai.blog.51cto.com/225186/381225)

    简单来说,我需要这4台虚拟机能上网(Internet),同时相互能互联,并且能够与主机互联。拓扑结构可以参考那篇文章,只是其中的一个子集而已(所有虚拟机在一个子网中)。

    这个目标我选择使用NAT虚拟网络来实现,这好像也是VMware装机时默认的网络配置。不过在默认情况下,好像只有一台机器可以通过NAT上网,这时就需要手动配置网络了。

    首先寻找NAT的网段等信息,先启动一台虚拟机,假设就是NameNode。

    使用下面命令来查看:

    ?

    view plain
    1. ifconfig??

    这时,应该会有两个网络设备,eth0和lo,不去管lo,eth0的IP地址是192.168.100.138,这个是通过DHCP自动获取的,由此我们可以得到网段是192.168.100.*。

    ?

    再看看网关:

    ?

    view plain
    1. route??

    ?

    得到了默认的网关是192.168.100.2。这里比较奇怪的是我在Win7的网络适配器中看到VmNet8的IP是192.168.100.1,难道网关不是它吗?不过我同时也发现VmNet8也是被禁用了的,很晕。

    好了,现在得到了足够的信息,开始进行网络配置:

    ?

    view plain
    1. sudo?vi?/etc/network/interfaces??

    将eth0相关的内容修改为如下配置:

    ?

    ?

    view plain
    1. auto?eth0??
    2. ??
    3. iface?eth0?inet?static??
    4. address?192.168.100.101??
    5. netmask?255.255.255.0??
    6. gateway?192.168.100.2??

    然后再重启网络服务:

    ?

    ?

    view plain
    1. sudo?/etc/init.d/networking?restart??

    最后再用ifconfig和route来看看是更改过来了,再ping一下sina,看看Internet是否可用:

    ?

    hadoop集群环境筹建

    ?

    按照同样的方法来配置其余3台虚拟机即可。这里要注意的是不知道是不是由于我是直接拷贝虚拟机文件的原因,在剩下的三台虚拟机中,eth0不见了,只有eth1,第一次用ifconfig时也只是显示出lo来,后来使用 ifconfig -a才发现有个eth1的。那么在之前的网络配置/etc/network/interfaces 中,就需要添加为eth1的。

    ?

    网络配好了后,可以通过ssh或ping来检测是否可以相互联通。

    接下来就是配置各个服务器了。

    ?

    本来以为网络搭建好了就可以了,没有想到还有ssh这个东西需要配置免密码访问,这个东西应该也算是软件上互联吧。

    ssh免密码本来是很简单的一件事情,不过我折腾了2天hadoop集群环境筹建,这就是菜鸟的必经过程了,我算是觉悟了。

    经过无数次的尝试,终于拼出了一条正确的道路:

    ?

    1. 首先在本地生成空密码的公钥和私钥:

    ?

    view plain
    1. ssh-keygen?-t?dsa?-P?''?-f?~/.ssh/id_dsa??

    在网上看到有些使用rsa,不过在Hadoop网站上写的是dsa,就使用dsa吧,生成的密钥文件放在当前用户的.ssh目录下,据我观察,貌似ssh所需要的用户配置文件都存放在这里。执行命令后应该会有 id_dsa, id_dsa.pub两个文件。

    ?

    2. 配置本地访问不需要密码:

    ?

    view plain
    1. cat?~/.ssh/id_dsa.pub?>>?~/.ssh/authorized_keys??

    其实就是把生成的公钥导入到authorized_keys中,估计ssh 会使用这个文件来进行验证。

    ?

    3. 执行下面的命令来测试本地访问

    ?

    view plain
    1. ssh?localhost??

    如果之前没有使用过ssh连接localhost, 那么会有提示添加localhost到knowhosts中去,然后要求输入密码。第二次及以后的连接就不需要密码了。

    ?

    这里要注意,一定要执行exit来退出ssh,否则这样嵌套执行会搞晕人的。我就这么晕了半天,不知道是在ssh上干活还是直接登录干活。后来在直接操作时把目录切换到了~/.ssh下,这样使用ssh后命令提示符就不一样了。呵呵,菜鸟就是需要多搞一点提示。

    4. 把本地的公钥复制到另外的机器(比如192.168.100.102)上:

    ?

    view plain
    1. scp?~/.ssh/id_dsa.pub?fox@192.168.100.102:/home/fox/.ssh/101_dsa.pub??

    ?

    这个会要求输入102的密码,照提示输入即可。

    这里就是折腾了我2天的罪魁祸首,在配置从NameNode(192.168.100.101免密码ssh访问)JobTracker(192.168.100.102)时,一定要在NameNode上执行这个命令。虽然我不知道为什么,但是多次尝试下来,就只有这样才能成功。或许还有其它办法,以后有机会了再研究研究。

    5. 在另外一台机器上JobTracker(192.168.100.102),把刚刚拷贝过来的公钥导入authorized_keys

    ?

    view plain
    1. cat?~/.ssh/101_dsa.pub?>>?authorized_keys??

    6. 从101上连接102:

    ?

    ?

    view plain
    1. ssh?192.168.100.102??

    同样第一次连接的话会询问是否添加机器以及要求输入密码,第二次就不用了。

    ?

    ?

    至此就算配置好了ssh从其中一台到另外一台的免密码访问了,把这个操作在各个机器上两两执行,就可以让任意一台机器免密码访问另外任意一台机器了。

    如果配置过程中有失误,想要重新来,可以删除.ssh下的所有东西,从头来过。

    ?

    ?

    顺便提一下,我用的是VMware文件拷贝生成的虚拟机,故而所有虚拟机的机器名都是一致的,不知道会有什么问题,所以我在执行上述操作时更改了机器名。

    改机器名要改两个地方:

    view plain
    1. sudo?vi?/etc/hostname??
    2. sudo?vi?/etc/hosts??

    /etc/hostname 里面的字符串就是机器名,这个要重启后才能生效。Ubuntu下才是这样的,其它Linux貌似不是这个文件。

    /etc/hosts 里面应该是用于访问网络时的一个DNS式的东西,把所有出现原机器名的地方都替换成新的机器名即可。

    ?

    改好后重启,可以用hostname命令来查看是否成功。

    ?

    好了,暂时就到这里,明天再研究真正的Hadoop配置文件。

    ?

    实际配置这部分时,才发现在(一)当中提到的那两个官网文档已经过时了,现在我实际下载的版本是 0.20.203,也即那个stable版本。于是只好找到相应版本的文档来参考了:http://hadoop.apache.org/common/docs/stable/cluster_setup.html

    ?

    关于Hadoop的配置,按照我的理解,应该有六个文件需要修改,它们都在Hadoop的conf文件夹下,分别是view plain

    1. vi?/hadoop/conf/masters??
    masters文件内容如下:

    ?

    ?

    view plain
    1. 192.168.100.101??
    2. 192.168.100.102??

    ?

    Slavers:

    view plain
    1. vi?/hadoop/conf/slavers??
    slavers文件内容如下:

    ?

    ?

    view plain
    1. 192.168.100.103??
    2. 192.168.100.104??


    ?

    2、先配置hadoop-env.sh,这里最重要的是配置JAVA_HOME,在我的机器上是这样的:

    ?

    view plain
    1. export?JAVA_HOME=/usr/lib/jvm/java-6-sun??

    其余的可以考虑配置日志文件路径:

    ?

    ?

    view plain
    1. export?HADOOP_LOG_DIR=${HADOOP_HOME}/logs??

    3、配置view plain
    1. <configuration>????
    2. ????????<property>??
    3. ????????????????<name>fs.default.name</name>?????
    4. ????????????????<value>hdfs://192.168.100.101:9000</value>?????
    5. ????????</property>???
    6. </configuration>???

    4、配置view plain
    1. <configuration>????
    2. ????<property>????
    3. ????????<!--?DFS中存储文件命名空间信息的目录?-->????
    4. ????????<name>dfs.name.dir</name>????
    5. ????????<value>/hadoop/dfs/name</value>????
    6. ????</property>????
    7. ????<property>????
    8. ????????<!--?DFS中存储文件数据的目录?-->????
    9. ????????<name>dfs.data.dir</name>?????
    10. ????????<value>/hadoop/dfs/data</value>????
    11. ????</property>????
    12. ????<property>????
    13. ????????<!--?是否对DFS中的文件进行权限控制(测试中一般用false)-->????
    14. ????????<name>dfs.permissions</name>????
    15. ????????<value>false</value>????
    16. ???</property>????
    17. </configuration>???


    5、配置view plain

    1. <configuration>??
    2. ????<property>????
    3. ????????<!--?JobTracker节点?-->????
    4. ????????<name>mapred.job.tracker</name>????
    5. ????????<value>192.168.100.102:9001</value>????
    6. ????</property>????
    7. ????<property>????
    8. ????????<!--?map/reduce的系统目录(使用的HDFS的路径)?-->????
    9. ????????<name>mapred.system.dir</name>????
    10. ????????<value>/hadoop/mapred/system</value>????
    11. ????</property>????
    12. ????<property>????
    13. ????????<!--?map/reduce的临时目录(可使用“,”隔开,设置多重路径来分摊磁盘IO)?-->????
    14. ????????<name>mapred.local.dir</name>????
    15. ????????<value>/hadoop/mapred/local</value>????
    16. ????</property>????
    17. </configuration>???

    ?

    ?

    这些配置都可以在一台机器上搞定,由于Hadoop所有机器是使用同样的配置,所以可以通过scp命令将conf下的内容拷贝复制到各个机器上:

    ?

    view plain
    1. scp?-rp?/hadoop/conf?fox@192.168.100.102/hadoop/??

    只复制conf是由于我拷贝虚拟机时就已经把JAVA,Hadoop 都安装好后才拷贝的,这样可以保证所有文件在同一目录。

    ?

    ?

    启动

    然后,激动人心的时刻到了,所有配置都搞定了,我们可以启动了!

    不过还有一件事情必须要先做, 格式化名称空间。

    在NameNode上,执行如下命令:

    ?

    view plain
    1. cd?/hadoop/bin??
    2. ./hadoop?namenode?-format??
    执行后结果如下:

    ?

    hadoop集群环境筹建

    ?

    然后就可以执行最后一个命令了:

    ?

    view plain
    1. ./start-all.sh??

    如果一切顺利的话,应该就成功了:

    ?

    hadoop集群环境筹建

    ?

    如果要关闭的话,可以执行

    ?

    view plain
    1. ./stop-all.sh??

    ?

    ?

读书人网 >软件架构设计

热点推荐