Hadoop环境搭建、配置及通过执行计算来验证的案例

Hadoop环境搭建、配置及通过执行计算来验证的示例

2013年12月28日

 

前言.................................................................................................................................1

一、Hadoop环境搭建.......................................................................................................2

1、下载Hadoop.........................................................................................................2

2、安装Hadoop.........................................................................................................2

3、准备ssh...............................................................................................................3

二、Hadoop目录结构.......................................................................................................3

1$HADOOP_HOME/bin目录...................................................................................4

2$HADOOP_HOME/conf目录.................................................................................5

3$HADOOP_HOME/lib目录....................................................................................5

三、配置Hadoop..............................................................................................................5

1、设置$HADOOP_HOME/conf/hadoop-env.sh............................................................5

2、配置$HADOOP_HOME/conf/core-site.xml..............................................................6

3、配置$HADOOP_HOME/conf/mapred-site.xml文件..................................................6

4、配置$HADOOP_HOME/conf/hdfs-site.xml文件.......................................................7

5、格式化namenode..................................................................................................7

6、启动Hadoop.........................................................................................................7

7、启动Hadoop可能会遇到的问题............................................................................8

四、测试Hadoop..............................................................................................................9

1、准备两个文本测试数据.........................................................................................9

2、准备JAVA代码...................................................................................................10

3、编译...................................................................................................................11

4、执行...................................................................................................................12

4.1、通过java命令执行....................................................................................12

4.2、通过hadoop命令执行...............................................................................12

五、搭建Hadoop集群.....................................................................................................14

1、准备三台服务器..........................................................................................14

2、三台服务器要具有一致的配置信息..............................................................15

3、修改$HADOOP_HOME/conf/slaves文件........................................................15

4、修改$HADOOP_HOME/conf/masters文件(此例中可选).............................15

5、修改core-site.xmlmapred-site.xmlhdfs-site.xml.......................................15

其它问题记录.................................................................................................................18

 

前言

Hadoop从存储上来说,是类似于冗余磁盘阵列(RAID)的存储方式,将数据分散存储并提供以提供吞吐量,它的存储系统就是HDFS(HadoopDistuibute Fils System);从计算上来说,它通过MapReduce模型,将大数据的计算分发到多台计算机上完成,再将结果合并,减少计算的时间。

Hadoop适合于:

1、超大数据的计算;

2、一次写入、多次读取的模式;

3、可以跑在普通的硬件上。

 

Hadoop不适合:

1、低延迟的数据访问,它是为高数据吞吐量应用优化的;

2、大量的小文件

hadoop客户端需要和namenode进行交互,而namenode中存放的是datanode的文件属性,且都是在内存中,如果小文件过多,namenode是存放不了的;

3、多用户写入,任意修改文件。

Hadoop适合于一次计算,多次读取的场景,如搜索引擎,只支持随机读取不支持随机写入,如Hadoop和Lucene的集成就不能够直接集成,因为Lucene支持随机写入。

 

本文将从使用的角度上谈了如何搭建Hadoop、如何配置Hadoop、如何验证Hadoop及在Hadoop上面执行计算,以及可能会遇到些什么样的问题。

一、Hadoop环境搭建

因为Hadoop需要在Linux运行,并且Hadoop是基于Java的,在继续进行下面的步骤之前,请确认你已经准备好Linux操作系统以及Java 6或以上版本,并且已经正确的设置了JAVA_HOME。

 

1、下载Hadoop

搭建Hadpp的版本为1.2.1 下载地址为:http://apache.fayea.com/apache-mirror/hadoop/common/hadoop-1.2.1/

 

2、安装Hadoop

解压缩Hadoop到任意目录,我当前的Hadoop是将其解压到目录/usr/local/hadoop-1.2.1,并在/etc/profile中设置好环境变量HADOOP_HOME(这个变量不是必须的,在1.2.1已经是Deprecated了,这里我之所以设置,还是为了方便),以及将$HADOOP_HOME/bin目录加入到PATH中,这样我们就可以在任意地方执行hadoop命令了,为了使用上的方便,再给”hadoopfs”设一个名为hdfs的alias方便使用,以下是我机器上/etc/profile增加的内容:

export JAVA_HOME=/usr/local/jdk1.6.0_33

export HADOOP_HOME=/usr/local/hadoop-1.2.1

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

#Alias for hadoop

alias hdfs='hadoop fs'

注:该文件的编辑需要root权限,修改完成后,如果想立即生效,需要通过source命令操作一下:

source /etc/profile

否则就只有退出重新登陆才会生效。

 

3、准备ssh

Hadoop需要通过SSH和其它计算器进行沟通,所以首先要确定本机或者是其它Hadoop计算服务器,是否都已经安全了ssh。

(1)、确定系统是否安装了ssh和ssh-keygey

可以通过which命令来确认

which ssh

which ssh-keygen

如果出现

/usr/bin/which: nossh in (/usr/.....)则表示系统里面没有安装SSH服务,可以通过www.openssh.com下载安装

(2)、发布公钥证书

执行如下命令:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

在~/.ssh/ 目录会生成id_rsa和id_rsa.pub两个文件,将id_rsa.pub复制一份在~/.ssh/目录下,并重命名为authorized_keys,如果是单机搭建伪分布式,此时ssh的准备工作已经完成了,如果使用全分布式环境,那么需要将authorized_keys及id_rsa两个文件复制到各台分布式slave机器的“~/.ssh目录中”中,这样任意两台机器之间互相通过ssh访问,都不需要输入密码了,如果只是拷贝到authorized_keys到slave机器中,就只能够实现主到从的不输密码访问。

(3)测试登陆验证

在本例中,采用的是在单机中搭建伪分布式系统,通过如下ssh命令尝试登陆:

ssh localhost

ssh 127.0.0.1

如果不再提示输入密码,直接登陆成功,那么SSH登陆就设置成功了。

二、Hadoop目录结构

这里重点介绍几个目录bin、conf及lib目录。

1、$HADOOP_HOME/bin目录

文件名称

说明

hadoop

用于执行hadoop脚本命令,被hadoop-daemon.sh调用执行,也可以单独执行,一切命令的核心

hadoop-config.sh

Hadoop的配置文件

hadoop-daemon.sh

通过执行hadoop命令来启动/停止一个守护进程(daemon)。

该命令会被bin目录下面所有以“start”或“stop”开头的所有命令调用来执行命令,hadoop-daemons.sh也是通过调用hadoop-daemon.sh来执行优命令的,而hadoop-daemon.sh本身由是通过调用hadoop命令来执行任务。

hadoop-daemons.sh

通过执行hadoop命令来启动/停止多个守护进程(daemons),它也是调用hadoop-daemon.sh来完成的。

rcc

The Hadoop record compiler

slaves.sh

该命令用于向所有的slave机器上发送执行命令

start-all.sh

全部启动,它会调用start-dfs.sh及start-mapred.sh

start-balancer.sh

启动balancer

start-dfs.sh

启动Namenode、Datanode及SecondaryNamenode

start-jobhistoryserver.sh

启动Hadoop任务历史守护线程,在需要执行历史服务的机器上执行该命令。

原文:

Start hadoop job history daemons.  Run this on node where history server need to run

start-mapred.sh

启动MapReduce

stop-all.sh

全部停止,它会调用stop-dfs.sh及stop-mapred.sh

stop-balancer.sh

停止balancer

stop-dfs.sh

停止Namenode、Datanode及SecondaryNamenode

stop-jobhistoryserver.sh

停止Hadoop任务历史守护线程

stop-mapred.sh

停止MapReduce

task-controller

任务控制器,这不是一个文本文件,没有被bin下面的shell调用

 

2、$HADOOP_HOME/conf目录

文件名称

说明

capacity-scheduler.xml

 

configuration.xsl

 

core-site.xml

Hdfs核心配置文件

fair-scheduler.xml

 

hadoop-env.sh

Hadoop环境变量

hadoop-metrics2.properties

 

hadoop-policy.xml

 

hdfs-site.xml

该文件可以从$HADOOP_HOME/src/hdfs-site.xml拷贝一份过来再修改

log4j.properties

Log4j的日志属于文件

mapred-queue-acls.xml

 

mapred-site.xml

MapReduce的配置文件

masters

 

slaves

用于设置所有的slave名称,每一行存放一个名称,需要注意的是slave名称必须在/etc/hosts有ip映射配置。

ssl-client.xml.example

 

ssl-server.xml.example

 

taskcontroller.cfg

 

task-log4j.properties

 

 

3、$HADOOP_HOME/lib目录

存放的是Hadoop运行时依赖的的jar包,Hadoop在执行的时候会把lib目录下面的jar全部加到classpath中。如果不想通过HADOOP_CLASSPATH指定自己的JAR文件所在路径,可以把计算需要用的jar全部都拷贝到lib目录中。

 

三、配置Hadoop

1、设置$HADOOP_HOME/conf/hadoop-env.sh

这个文件中设置的是Hadoop运行时需要的环境变量,只有JAVA_HOME是必须设置的,即使我们当前的系统中设置了JAVA_HOME,它也是不认识的,因为Hadoop即使是在本机上执行,它也是把当前的执行环境当成远程服务器,其它的都是有默认值的,不过了解一下还是更好的。

在$HADOOP_HOME/conf目录下,打开hadoop-env.sh,设置系统的Java环境,

export JAVA_HOME=/usr/local/jdk1.6.0_33

注:这里是不认系统中的JAVA_HOME变量,因而需要设置JDK全路径。

如果使用的是Mac OS X系统,那么在启动hdsf的NameNode和secondaryNameNode时,会报出Unable toload realm info from SCDynamicStore 的错误提示,解决该问题的办法是,在hadoop-env.sh文件里面增加一行:

export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"

详见文章:http://gauss-deng.iteye.com/blog/1370295

还可根据实际情况设置HADOOP_HEAPSIZE的值,如果不设置默认是1000m,我的内存没有这么大,所以我也设置了一个这个值。

其它还有不少,也可以看看了,本例不需要用到。

2、配置$HADOOP_HOME/conf/core-site.xml

 

<configuration> 

  <property> 

    <!-- 用于设置Hadoop的文件系统,由URI指定 -->

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

    <value>hdfs://localhost:9000</value> 

  </property> 

  <property>

<!-- 配置Hadoop的临时目录,默认在/tmp目录下,但是/tmp上面可能会被系统自动清理掉。-->

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

<!-- 目录如果不存在,需要手动创建 -->

    <value>/home/fenglibin/hadoop_tmp</value>

    <description>A base for other temperary directory</description>

  </property>

</configuration> 

 

3、配置$HADOOP_HOME/conf/mapred-site.xml文件

 

<configuration> 

  <property> 

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

    <value>localhost:9001</value> 

  </property> 

</configuration>

 

4、配置$HADOOP_HOME/conf/hdfs-site.xml文件

 

<configuration> 

  <property> 

    <name>dfs.replication</name> 

    <value>1</value> 

  </property> 

</configuration>

 

5、格式化namenode

hadoop namenode -format

 

6、启动Hadoop

./bin/start-all.sh

如果是出现如下结果,那就说明Hadoop已经成功启动了:

fenglibin@ubuntu1110:/usr/local/hadoop-1.2.1$ jps

29339 SecondaryNameNode

29661 Jps

28830 JobTracker

29208 DataNode

28503 NameNode

29514 TaskTracker

此时我们可以通过WEB方式访问NameNode及Jobtracker:

NameNode:http://localhost:50070/

JobTracker:http://localhost:50030/

如果只是测试map/reduce,这里只需要启动如下命令:

./bin/start-mapred.sh

      

7、启动Hadoop可能会遇到的问题

7.1、没有将Hadoop获取到的hostname加到/etc/hosts文件中

启动的时候secondarynamenode中的异常如下:

fenglibin@ubuntu1110:/usr/local/hadoop-1.2.1/logs$ cat hadoop-fenglibin-secondarynamenode-ubuntu1110.out

Exception in thread "main" java.net.UnknownHostException: unknown host: host

        at org.apache.hadoop.ipc.Client$Connection.<init>(Client.java:236)

        at org.apache.hadoop.ipc.Client.getConnection(Client.java:1239)

        at org.apache.hadoop.ipc.Client.call(Client.java:1093)

        at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:229)

        at $Proxy5.getProtocolVersion(Unknown Source)

        at org.apache.hadoop.ipc.RPC.checkVersion(RPC.java:422)

        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:414)

……

出现这种情况,只需要在/etc/hosts文件中加入一条映射就可以了:

127.0.0.1 host

当出现这种情况时,namenode和datanode的日志文件中都不会报错,通过jps查看时,是看不到namenode的启动情况的,而datanode和secondarydatanode都会启动一会儿,然后再消失掉,jobtracker和tasktracker是可以正常启动的。

7.2、临时目录/tmp被系统自动清除

Hadoop的临时目录默认是使用/tmp目录做为临时目录,不过/tmp目录可能会被系统自动清理掉,这个时候namenode也不能够正常启动了,这个时候可以通过在core-site.xml中手动设置临时目录来解决,如:

  <property>

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

    <value>/home/fenglibin/hadoop_tmp</value>

    <description>A base for other temperary directory</description>

  </property>

设置完成后,需要对namenode重新格式化才可以使用:

hadoop namenode -format

 

 

四、测试Hadoop

一个简单的求每年温度最大值的程序。

1、准备两个文本测试数据

准备两个名为data1.txt及data2.txt的文件,用于做为计算的输入数据,将其放于/home/fenglibin/java/data目录下:

data1.txt

data2.txt

1999 10

1999 20

1999 25

2000 21

2000 22

2000 18

2000 40

2001 45

2001 65

2002 90

2002 89

2002 70

2003 40

2003 80

1999 40

1999 10

1999 25

2000 51

2000 22

2000 18

2000 40

2001 95

2001 65

2002 90

2002 19

2002 70

2003 100

2003 80

每行有两列,分别表示年份和温度。

 

2、准备JAVA代码

该代码来自于《Hadoop权威指南(第二版)》,如下:

package hadoop;

 

import java.io.IOException;

 

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

 

publicclass MaxTemperature {

 

    staticclass MaxTemperatureMapperextends Mapper<LongWritable, Text, Text, IntWritable> {

 

        @Override

        publicvoid map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {

            String line = value.toString();

            if (line ==null || line.trim().equals("")) {

                return;

            }

            String[] arr = line.split(" ");

            String year = arr[0];

            int airTemperature = Integer.parseInt(arr[1]);

            context.write(new Text(year),new IntWritable(airTemperature));

        }

    }

 

    staticclass MaxTemperatureReducerextends Reducer<Text, IntWritable, Text, IntWritable> {

 

        @Override

        publicvoid reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {

            int maxValue = Integer.MIN_VALUE;

            for (IntWritable value : values) {

                maxValue = Math.max(maxValue, value.get());

            }

            context.write(key, new IntWritable(maxValue));

        }

    }

 

    publicstaticvoid main(String[] args)throws IOException, InterruptedException, ClassNotFoundException {

        Job job = new Job();

        job.setJarByClass(MaxTemperature.class);

        FileInputFormat.addInputPath(job,new Path(args[0]));

        FileOutputFormat.setOutputPath(job,new Path(args[1]));

        job.setMapperClass(MaxTemperatureMapper.class);

        job.setReducerClass(MaxTemperatureReducer.class);

        job.setOutputKeyClass(Text.class);

        job.setOutputValueClass(IntWritable.class);

 

        System.exit(job.waitForCompletion(true) ? 0 : 1);

    }

}

 

3、编译

javac -cp $HADOOP_HOME/hadoop-core-1.2.1.jar hadoop/MaxTemperature.java

 

4、执行

执行的方式有两种,直接通过java命令和$HADOOP_HOME/bin/hadoop命令,不过不同的执行方式有一定的区别。

4.1、通过java命令执行

有如下特点:

1)、指定本地的输入文件;

2)、将结果输出到本地;

3)、需要指定依赖的一长串classpath;

4)、只需要启动map/reduce即可,不需要启动namenode及datanode;

5)、需要在class所有目录执行,因而不需要指定HADOOP_CLASSPATH。

执行如下:

java -Xmx256m -Xms256m -XX:PermSize=128m -cp $HADOOP_HOME:.:$HADOOP_HOME/hadoop-core-1.2.1.jar:$HADOOP_HOME/hadoop-tools-1.2.1.jar:$HADOOP_HOME/hadoop-ant-1.2.1.jar:$HADOOP_HOME/hadoop-client-1.2.1.jar:$HADOOP_HOME/hadoop-minicluster-1.2.1.jar:$HADOOP_HOME/lib/commons-logging-1.1.1.jar:$HADOOP_HOME/lib/commons-logging-api-1.0.4.jar:$HADOOP_HOME/lib/commons-configuration-1.6.jar:$HADOOP_HOME/lib/commons-lang-2.4.jar:$HADOOP_HOME/lib/jackson-core-asl-1.8.8.jar:$HADOOP_HOME/lib/jackson-mapper-asl-1.8.8.jar:$HADOOP_HOME/lib/commons-httpclient-3.0.1.jar hadoop/MaxTemperature /home/fenglibin/java/data/ /home/fenglibin/java/result/

 

4.2、通过hadoop命令执行

有如下特点:

1)、输入文件必须放到hdfs上;

2)、输出结果在hdfs上;

3)、需要设置HADOOP_CLASSPATH,但不是绝对;

4)、需要将class文件打成jar包。

      HADOOP_CLASSPATH是用于添加用户的jar,hadoop在执行的时候会将其追加到hadoop本身的classpath中。Hadoop在启动的时候,会将$HADOOP_HOME/lib目录下面的jar全部加到classpath中,如果想偷懒不设置HADOOP_CLASSPATH,可以将你的jar包放到$HADOOP_HOME/lib中。

 

4.2.1、将class文件打成jar包

首先需要创建一个mainfest.mf,放在与要打包的class相同的目录中,里面写上内容:

Main-Class: hadoop.MaxTemperature

 

然后通过如下命令进行打包:

jar cvfm maxTemperature.jar mainfest.mf -c hadoop/

4.2.2、设置HADOOP_CLASSPATH

如此时maxTe       mperature.jar放在/home/fenglibin/java目录下,此时设置HADOOP_CLASSPATH如下:

export HADOOP_CLASSPATH=/home/fenglibin/java/maxTemperature.jar

 

4.2.3、拷贝本地文件到HDFS

hdfs -copyFromLocal data ~/java

注:hdfs是我本地的“hadoop fs”的alias,目录“~/java”是hdfs中的目录。

查看是否拷贝成功:

hdfs -ls ~/java

结果如下:

fenglibin@ubuntu1110:~/java$ hdfs -ls ~/java

Warning: $HADOOP_HOME is deprecated.

 

Found 1 items

drwxr-xr-x   - fenglibin supergroup      0 2013-12-25 14:33 /home/fenglibin/java/data

 

文件已经存在,表示拷贝成功。

 

4.2.4、执行

Jar的mainfest.mf中标识了Main-Class是hadoop/MaxTemperature是主类,因而我们可以有两种执行方式,直接执行类hadoop/MaxTemperature或者直接执行jar

1)、直接执行hadoop/MaxTemperature

hadoop hadoop/MaxTemperature ~/java/data ~/java/result1

2)、直接执行jar

hadoop jar /home/fenglibin/java/maxTemperature.jar ~/java/data ~/java/result2

 

虽然这种方式是执行jar包,其实也是调用hadoop/MaxTemperature执行,只是入口不一样而已。

 

4.2.5查看结果

以上两种方式执行的计算结果是相同的,结果文件有一些不同,结果的存放位置不同,通过JAVA直接执行的结果是存放在本地的,通过Hadoop执行的结果是放到Hdfs上的。

下面的截图是通过JAVA执行后,在/home/fenglibin/java/result/下面生成四个文件:

其中两个.crc文件是隐藏,是用于CRC校验的,我们不需要关心;

_SUCCESS是一个空文件,只是用于表示当前操作执行成功;

part_r_00000里面存放的就是我们每年最大值的输出结果,内容如下:

 

下面的截图是通过Hadoop执行,在~/java/result目录下面的结果:

part_r_00000里面的内容和通过JAVA执行结果是一样的,这里就不贴图了。通过Hadoop命令执行,里面多了一个_logs目录,它里面存放了本次用于执行的jar文件以及本次执行Hadoop用到的配置信息文件“*_conf.xml”,这个配置文件需要重点关注一下,因为这个文件里面包含了本次计算执行所需要的所有配置信息,以下为本次执行过后的配置文件:

 

五、搭建Hadoop集群

上面的步骤,确认了单机可以执行Hadoop的伪分布执行,真正的分布式执行无非也就是多几台slave机器而已,配置方面的有一点点区别,配置起来就非常简单了。

1、准备三台服务器

192.168.56.101

192.168.56.102

192.168.56.103

在每台机器的/etc/hosts中都将ip及hostname给映射上:

192.168.56.101  nginx1

192.168.56.102  nginx2

192.168.56.103  nginx3

其中192.168.56.101为前面配置的那台服务器,用于做为namenode及jobtracker,另外两台用于做slaves,用于执行datanode及tasktracker。

对Hadoop来说,从hdfs的角度来看有namenode及datanode,namenode只能够有一个,而datanode可以有多个,namenode存放的是datanode中文件的元数据,客户端通过namenode获取datanode中文件的信息;从jobtracker角度来说看有jobtracker及tasktracker,jobtracker只能够有一个,而tasktracker可以有多外,tasktracker通过jobtracker来调度。

2、三台服务器要具有一致的配置信息

1)、JDK的路径必须相同;

2)、操作Hadoop的用户必须相同;

3)、Hadoop的存放路径必须相同;

Slave机器上的hadoop可直接将namenode上面的hadoop拷贝过去,不用做任何修改,只要路径放置就可以了;

4)、每台机器~/.ssh目录下存放相同的id_rsa及authorized_keys

将namenode的机器上的~/.ssh/id_rsa及authorized_keys拷贝到每台slave机器上的~/.ssh中,当然slave机器中也必须是安装了ssh的了,然后在每台机器上都通过ssh访问一下其它的两台机器,确保都是可以不输入密码访问的。

5)、三台机器的/etc/profile中的内容相同;

3、修改$HADOOP_HOME/conf/slaves文件

这个文件存放的是所有datanode的IP或者机器名,每行指定一个。我们这里使用nginx2及nginx3来做为datanode,因此slaves文件的配置如下:

nginx2

nginx3

 

4、修改$HADOOP_HOME/conf/masters文件(此例中可选)

masters文件中放置的是secondarynamenode的机器名,其中默认的内容为“localhost”,但是在生产环境中,肯定不会将namenode和secondarynamenode放置在同一台服务器上,在此例中我就将secondaryname设置在第三台服务器上(因为没有更多的服务器了),那么此时文件中的内容应该如下:

nginx3

5、修改core-site.xml、mapred-site.xml及hdfs-site.xml

只需要做简单的修改就可以了,不同点以红色字体标识出。

core-site.xml

<configuration> 

  <property> 

    <!-- 用于设置Hadoop的文件系统,由URI指定 -->

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

    <value>hdfs://nginx1:9000</value> 

  </property> 

  <property>

<!-- 配置Hadoop的临时目录,默认在/tmp目录下,但是/tmp上面可能会被系统自动清理掉。-->

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

<!-- 目录如果不存在,需要手动创建 -->

    <value>/home/fenglibin/hadoop_tmp</value>

    <description>A base for other temperary directory</description>

  </property>

</configuration> 

 

mapred-site.xml:

<configuration> 

  <property> 

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

    <value>nginx1:9001</value> 

  </property> 

</configuration>

 

    hdfs-site.xml:

<configuration> 

  <property> 

<name>dfs.replication</name> 

<!-- 这里有两台datanode -->

    <value>2</value> 

  </property> 

</configuration>

 

6、启动验证

DataNode都是通过NameNode启动起来的,因而启动的时候只需要在NameNode上执行start-all.sh就可以了,此时我们查看各服务器中的进程。

Nginx1(NameNode)所在服务器:

fenglibin@ubuntu1110:/usr/local/hadoop-1.2.1$ jps

2834 NameNode

3011 JobTracker

3108 Jps

Ngnix2:

fenglibin@ubuntu11102:~$ jps

984 DataNode

1075 TaskTracker

1420 Jps

Ngnix3:

fenglibin@ubuntu11103:~$ jps

1374 Jps

1021 TaskTracker

919 SecondaryNameNode

846 DataNode

从上面的进程信息,可以看到nginx1中启动了namenode及jobtracker,,nginx2和nginx3都分别启动了DataNode及TaskTracker,只是nginx3中比nginx2中多启动了一个SecondaryNameNode,这也是我们希望的结果。

通过如下命令:

hadoop dfsadmin -report

可得到如下输出:

Warning: $HADOOP_HOME is deprecated.

 

Safe mode is ON

Configured Capacity: 15283421184 (14.23 GB)

Present Capacity: 11366895616 (10.59 GB)

DFS Remaining: 11366797312 (10.59 GB)

DFS Used: 98304 (96 KB)

DFS Used%: 0%

Under replicated blocks: 0

Blocks with corrupt replicas: 0

Missing blocks: 0

 

-------------------------------------------------

Datanodes available: 2 (2 total, 0 dead)

 

Name: 192.168.56.102:50010

Decommission Status : Normal

Configured Capacity: 7641710592 (7.12 GB)

DFS Used: 49152 (48 KB)

Non DFS Used: 1959288832 (1.82 GB)

DFS Remaining: 5682372608(5.29 GB)

DFS Used%: 0%

DFS Remaining%: 74.36%

Last contact: Thu Dec 26 17:19:30 CST 2013

 

 

Name: 192.168.56.103:50010

Decommission Status : Normal

Configured Capacity: 7641710592 (7.12 GB)

DFS Used: 49152 (48 KB)

Non DFS Used: 1957236736 (1.82 GB)

DFS Remaining: 5684424704(5.29 GB)

DFS Used%: 0%

DFS Remaining%: 74.39%

Last contact: Thu Dec 26 17:19:29 CST 2013

 

成功了。

其它问题记录

Ubuntu虚拟机中找不到eho0网卡时,可以删除文件70-persistent-net.rules解决:

rm /etc/udev/rules.d/70-persistent-net.rules

 

你可能感兴趣的:(Hadoop环境搭建、配置及通过执行计算来验证的案例)