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.xml、mapred-site.xml及hdfs-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需要在Linux运行,并且Hadoop是基于Java的,在继续进行下面的步骤之前,请确认你已经准备好Linux操作系统以及Java 6或以上版本,并且已经正确的设置了JAVA_HOME。
搭建Hadpp的版本为1.2.1 下载地址为:http://apache.fayea.com/apache-mirror/hadoop/common/hadoop-1.2.1/
解压缩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 |
否则就只有退出重新登陆才会生效。
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登陆就设置成功了。
这里重点介绍几个目录bin、conf及lib目录。
文件名称 |
说明 |
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调用 |
文件名称 |
说明 |
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 |
|
存放的是Hadoop运行时依赖的的jar包,Hadoop在执行的时候会把lib目录下面的jar全部加到classpath中。如果不想通过HADOOP_CLASSPATH指定自己的JAR文件所在路径,可以把计算需要用的jar全部都拷贝到lib目录中。
这个文件中设置的是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,我的内存没有这么大,所以我也设置了一个这个值。
其它还有不少,也可以看看了,本例不需要用到。
<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> |
<configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> </configuration> |
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> |
hadoop namenode -format |
./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.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 |
一个简单的求每年温度最大值的程序。
准备两个名为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 |
每行有两列,分别表示年份和温度。
该代码来自于《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); } } |
javac -cp $HADOOP_HOME/hadoop-core-1.2.1.jar hadoop/MaxTemperature.java |
执行的方式有两种,直接通过java命令和$HADOOP_HOME/bin/hadoop命令,不过不同的执行方式有一定的区别。
有如下特点:
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/ |
有如下特点:
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的伪分布执行,真正的分布式执行无非也就是多几台slave机器而已,配置方面的有一点点区别,配置起来就非常简单了。
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来调度。
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中的内容相同;
这个文件存放的是所有datanode的IP或者机器名,每行指定一个。我们这里使用nginx2及nginx3来做为datanode,因此slaves文件的配置如下:
nginx2 nginx3 |
masters文件中放置的是secondarynamenode的机器名,其中默认的内容为“localhost”,但是在生产环境中,肯定不会将namenode和secondarynamenode放置在同一台服务器上,在此例中我就将secondaryname设置在第三台服务器上(因为没有更多的服务器了),那么此时文件中的内容应该如下:
nginx3 |
只需要做简单的修改就可以了,不同点以红色字体标识出。
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 |