====Hadoop 的运行方式是由配置文件决定的====(运行Hadoop时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置fs.defaultFS和dfs.replication就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为/tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行format才行。所以我们进行了设置,同时也指定dfs.namenode.name.dir和dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
配置完成后,执行 NameNode 的格式化:
接着开启 NameNode 和 DataNode 守护进程。
hadoop@hadoop1:/usr/local/hadoop$ ./sbin/start-dfs.sh成功启动后,可以访问 Web 界面 :50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
上面的单机模式,wordcount 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hadoop fs -mkdir -p /user/hadoop注意:创建的用户目录不能直接在系统中查看,因为hadoop创建的是逻辑上的目录,必须在hadoop上才能查看。查看命令如下:
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hadoop fs -ls /接着将 ./etc/hadoop 中的 xml文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input中。我们使用的是hadoop用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir input hadoop@hadoop1:/usr/local/hadoop$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input复制完成后,可以通过如下命令查看文件列表:
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hadoop fs -ls input伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hadoopjar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hdfs dfs -cat output/*运行结果还可以取回本地
hadoop@hadoop1:/usr/local/hadoop$ rm -r ./output # 先删除本地的 output 文件夹(如果存在) hadoop@hadoop1:/usr/local/hadoop$ ./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机 hadoop@hadoop1:/usr/local/hadoop$ cat ./output/*Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
hadoop@hadoop1:/usr/local/hadoop$ ./bin/hdfs dfs -rm -r output # 删除 output 文件夹==备注:./bin/hdfs dfs = ./bin/hadoop fs==
关闭 Hadoop
hadoop@hadoop1:/usr/local/hadoop$ ./sbin/stop-dfs.sh注意
下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh 就可以!
新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也称为 YARN,Yet Another Resource Negotiator)。