Ubuntu12.04安装hadoop1.0.4

来源:互联网 发布:java se深入浅出 编辑:程序博客网 时间:2024/05/30 23:20

在Linux上安装hadoop实践记录

为实验分布式环境在计算复杂的大数据运算时的优势,我在实验室搭建了一个小型的hadoop集群环境,下面是我在搭建环境过程中的总结和一些心得。

1.  Hadoop简介

在搭建Hadoop全分布式集群环境之前首先需要了解Hadoop的基本构成模块,主要包括:

1)       NameNode(名称节点)

2)       DataNode(数据节点)

3)       SecondaryNameNode(次名称节点)

4)       JobTracker(作业跟踪节点)

5)       TaskTracker(任务跟踪节点)

1.1  NameNode

NameNode是Hadoop集群中的管理者,hadoop分布式文件系统采用的是主/从结构,NameNode作为主端,它管理Hadoop文件系统的命名空间,维护着文件系统树以及整个系统中的所有目录结构,指导从端的DataNode进行底层的I/O任务。Namenode还记录了各个文件如何被分割成块,在哪几个DataNode中存储块的信息。

1.2  DataNode

DataNode是hadoop集群中的工作节点,它根据NameNode的调度来执行底层I/O任务——将文件系统中的文件写入或存储到本地实际文件中,并定期向NameNode发送它们所存储的块的列表。

1.3  SecondaryNameNode

SecondaryNmeNode(SNN)是一个监控hadoop集群状态的辅助节点。如果没有SNN,一旦NameNode一旦发生损坏,整个文件系统将会瘫痪,因为我们失去了块的位置信息,不知道如何根据DataNode上的数据块的信息来重建文件。因此,为了防止这一风险,我们在集群中单独用一节点作为SNN,这一节点上不运行其他的进程,它只与NameNode进行交互,根据集群配置的交互时间间隔,从NameNode上获取文件系统中元数据的快照。

1.4  JobTracker

每个hadoop集群都有一个并且只有一个JobTracker节点,JobTracker进程通常是在主节点上,它是应用程序和集群之间的连接桥梁,一旦有程序提交到集群上,JobTracker就会分配任务的运行模式,并监控所有任务的运行。

1.5  TaskTracker

每个TaskTracker负责执行由JobTracker分配的单项任务。TaskTracker进程可以在从节点上启动多个JVM来并行处理Map/Reduce任务,并持续不断地与JobTracker通信,如果JobTracker在一定时间内没有收到来自TaskTracker的“心跳”,它会假定TaskTracker已经崩溃,并分配相应的任务到其他节点上运行。在后续的章节中将详细介绍这几个节点在集群中的作用。

2.  搭建Hadoop实验环境

文中的ubuntu命令行若无标示,都是在master计算机上执行的。

2.1   实验环境

ubuntu12.04+jdk1.7.0_45+hadoop-1.0.4

机器名

IP

作用

mnclab-houhaiting

192.168.4.80

NameNode/JobTracker

mnclab-liusipei

192.168.4.91

SecondaryNameNode

mnclab-Lenovo1

192.168.4.111

DataNode/TaskTracker

mncalb-Lenovo2

192.168.4.115

DataNode/TaskTracker

mnclab-Lenovo3

192.168.4.117

DataNode/TaskTracker

mnclab-lilin

192.168.4.97

DataNode/TaskTracker

mnclab-shiyulong

192.168.4.83

DataNode/TaskTracker

注:表格中虚线部分表示,实验过程中后来增加的节点,开始是只有三台DataNode节点。

2.2   搭建步骤

在已经搭建了Ubuntu12.04系统的机器上,首先创建用户,为了操作简便我在所有的机器上创建了相同的用户名和相同的密码,用户名为mnclab,密码为mnclab2013。

在每台机器上添加集群中所有的机器名和对应的IP地址,修改方法为编辑/etc/hosts文件,添加下面的内容:

127.0.0.1         localhost

192.168.4.80   mnclab-houhaiting

192.168.4.111  mnclab-Lenovo1

192.168.4.115  mnclab-Lenovo2

192.168.4.117  mnclab-Lenovo3

192.168.4.97   mnclab-lilin

192.168.4.83   mnclab-shiyulong

192.168.4.91   mnclab-liusipei

2.2.1           开启ssh服务

第一步:安装ssh:sudo apt-get install ssh

第二步:建立ssh无密码登陆

(1)在NameNode上实现无密码登陆本机

                     ~$ssh-keygen -trsa

       执行上述命令,直接回车会在~/.ssh/生成两个文件id_rsa和id_rsa.pub。这是两个成对出现的文件,类似rsa协议的锁和钥匙。

       然后在文件夹.ssh/下执行下面命令,把钥匙id_rsa.pub追加到公共key里面

                     ~/.ssh$catid_rsa.pub >> authorized_keys

       完成下面的命令后,就可以实现无密码登陆本机。如下图所示


(2)实现NameNode无密码登陆其他DataNode

       首先在DataNode上按同样的步骤实现无密码登陆本机,然后把NameNode的id_rsa.pub拷贝到DataNode上的/.ssh/authorized_keys中(以192.168.4.111为例),

                            ~/.ssh$  scp id_rsa.pub mnclab@192.168.4.111:/home/mnclab

       登陆192.168.4.111(DataNode)执行

                     "slave"}~$ catid_rsa.pub >> .ssh/authorized_keys

       添加id_rsa到ssh-agent

                     "slave"}~/.ssh$ ssh-add id_rsa

如果提示:
“Could not open a connection to your authentication agent”

执行:

                     "slave"}~/.ssh$ ssh-agent bash

       注意:如果配置完成,NameNode不能登陆DataNode,有两种可能。一是权限的问题,修改权限,

              "slave"}~$ sudo chmod 600 ~/.ssh/authorized_keys

              "slave"}~$ sudo chmod 600 ~/.ssh/id_rsa

              "slave"}~$ sudo chmod 600 ~/.ssh/id_rsa.pub

              "slave"}~$ sudo chmod 644 ~/.ssh/known_hosts

              "slave"}~$ sudo chmod 755 ~/.ssh

二是防火墙为关闭,关闭防火墙,

              ~$ sudo ufw disable。

3.  安装jdk

经过实践,发现最好不要使用ubuntu自带的java,所以我从甲骨文官网下载了jdk-7u45-linux-x64.tar.gz 到本地,然后手动安装在/usr/local目录下

       ~$sudo tar-zxvf jdk-7u45-linux-x64.tar.gz -C /usr/local/jvm

注意:为了以后运行hadoop,在此需要更改文件夹/jvm的权限为755

       ~/usr/local$ sudo chmod 755 -R /jvm

安装好后,在/etc/profile中添加下列语句,这是在环境中申明java的安装位置。

exportJAVA_HOME=/usr/local/jvm/jdk1.7.0_45

exportJRE_HOME=/usr/local/jvm/jdk1.7.0_45/jre

exportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

使配置生效:保存并退出,执行下面命令使其配置立即生效。

         ~$ source/etc/profile

注意:每台机器都是一样的安装,最好是保证每台机器的安装环境一致。

4.  安装hadoop

在hadoop官方网站下载hadoop-1.0.4.tar.gz,解压安装

       ~$sudo tar-xzvf hadoop-1.0.4.tar.gz -C /usr/local/

把hadoop的安装路径添加到/etc/profile中

exportHADOOP_HOME=/usr/local/hadoop

exportPATH=$HADOOP_HOME/bin:$PATH

5.  配置hadoop

hadoop的主要配置文件都在文件夹hadoop/conf/下,主要需要配置以下几个文件

(1)在hadoop-env.sh中配置JAVA的环境变量

exportJAVA_HOME=/usr/local/jvm/jdk1.7.0_45

(2)在masters和slaves中配置主/从节点

masters文件: 192.168.4.80

slaves文件:       192.168.4.111

                     192.168.4.115

                     192.168.4.117

(3)配置core-site.xml,hdfs-site.xml,mapred-site.xml

core-site.xml:

<configuration>

  <property>

    <name>hadoop.tmp.dir</name>

    <value>/usr/local/hadoop/tmp</value>

    <description>A base for othertemporary directories</description>

    <final>true</final>

  </property>

  <property>

    <name>fs.default.name</name>

   <value>hdfs://192.168.4.80:9000</value><--! master's ip -->

    <final>true</final>

  </property>

  <property>

    <name>fs.trash.interval</name>

    <value>1440</value>

    <description>Number of minutesbetween trash checkpoints.

If zero, thetrash feature is disabled. </description>

  </property>

</configuration>

注: hadoop.tmp.dir:配置hadoop中临时文件的存储路径,默认是hadoop/tmp,但是hadoop/tmp会定期删除文件,所以另外指定路径。

        fs.default.name:用于指定HDFS的namenode和默认文件系统。

         fs.trash.interval:存储在文件系统中删除的文件,设置保留时间为1天。

hdfs-site.xml:

<configuration>

  <property> 

    <name>dfs.name.dir</name> 

   <value>/usr/local/hadoop/filesystem/name</value> 

  </property> 

  <property> 

    <name>dfs.data.dir</name> 

   <value>/usr/local/hadoop/filesystem/data</value> 

  </property> 

  <property>

    <name>fs.checkpoint.dir</name>

    <value>/usr/local/hadoop/namesecondary</value>

  </property>

  <property>

    <name>dfs.replication</name>

    <value>3</value>

  </property>

  <property>

    <name>dfs.block.size</name>

    <value>268435456</value>

  </property>

  <property>

    <name>dfs.datanode.socket.write.timeout</name>

    <value>1000000000</value>

  </property>

  <property>

    <name>dfs.socket.timeout</name>

     <value>100000000</value>

  </property>

</configuration>

注: dfs.name.dir:决定文件系统中namenode上存储文件的目录路径。

mapred-site.xml:

<configuration>

  <property>

    <name>mapred.job.tracker</name>

   <value>192.168.4.80:9001</value><--! master's ip -->

    <final>true</final>

  </property>

  <property>

   <name>mapred.job.reuse.jvm.num.tasks</name>

    <value>-1</value>

    <description>some maps and reducesuse just one jvm</description>

  </property>

  <property>

   <name>mapred.tasktracker.map.tasks.maximum</name>

    <value>4</value>

  </property>

  <property>

   <name>mapred.tasktracker.reduce.tasks.maximum</name>

    <value>4</value>

  </property>

  <property>

    <name>io.sort.factor</name>

    <value>10</value>

    <description></description>

  </property>

  <property>

    <name>io.sort.mb</name> 

    <value>100</value>

    <description>In the Map stage, sothat the memory map output to a file in the spill as soon as possible , whichwe can observe the output map</description>

  </property>

  <property>

   <name>mapred.job.shuffle.input.buffer.percent</name>

    <value>0.001</value>

    <description></description>

  </property>

  <property>

   <name>mapred.job.shuffle.merge.percent</name>

    <value>0.001</value>

    <description></description>

  </property>

  <property>

   <name>mapred.reduce.tasks</name>

    <value>2</value>

  </property>

  <property>

   <name>mapred.task.timeout</name>

    <value>3600000</value>

  </property>

  <property> 

   <name>mapred.max.map.failures.percent</name> 

    <value>50</value> 

  </property>

  <property>

   <name>mapred.map.java.opts</name>

    <value>-Xmx1024m</value>

  </property>

  <property>

   <name>mapred.child.java.opts</name>

    <value>-Xmx1024m</value>

  </property>

</configuration>

注:mapred.job.reuse.jvm.num.tasks=-1,指定多个tasks只启用一个jvm,减小内存压力。

mapred.tasktracker.map.tasks.maximum=4,每个DataNode节点上同时运行的map个数,由于我的实验机器只有一个2核cpu,所以我只设置为4,一般设置为接近机器的cpu的总核数即可。

mapred.tasktracker.reduce.tasks.maximum=4,每个DataNode节点上同时运行的reduce个数,设置要求类似上面的参数。

6.  运行Hadoop

给slave的hadoop文件夹配置读权限

       "slave"}~/usr/local$ chown-R mnclab:mnclab hadoop

首先格式化HDFS文件系统:

       "master"}~$ hadoop namenode -format

然后启动hadoop

       "master"}~/usr/local/hadoop/bin$ start-all.sh

7.  验证Hadoop

在master上执行:

       ~$hadoopdfsadmin -report

 

0 0