[Hadoop] Linux(CentOS6.4)单机Hadoop伪分布式配置

准备工作

完成Linux Master主机中SSH无密码登录配置,详情见:[Linux] CentOS6.4配置SSH无密码登录

完成Hadoop安装文件的解压工作,hadoop-2.6.4所在目录:/usr/hadoop/hadoop-2.6.4。hadoop的安装配置详情见:[Hadoop] Linux(CentOS6.4)下Hadoop单机/集群的安装和配置 的前半部分(Linux单机环境中Hadoop的安装与配置)。

修改配置文件

Hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,节点即是NameNode也是DataNode。

需要修改的配置为/user/hadoop/hadoop-2.6.4/etc/hadoop/目录下的:

  • hadoop-env.sh
  • core-site.xml
  • mapred-site.xml.template
  • hdfs-site.xml

说明:首先对上述需要配置修改的原始文件,进行备份,以供在进行Hadoop集群配置时,方便使用。

首先使用root用户,将修改hadoop安装目录(/usr/hadoop/)下所有目录和文件的权限:

su - root
chown -R hadoop:hadoop /usr/hadoop/

然后,修改hadoop配置文件:

  • 使用用户:hadoop(将/usr/hadoop/目录的权限改为hadoop的也可以方便操作)
  • 运行目录:/usr/hadoop/hadoop-2.6.4/

1. core-site.xml配置:其中的hadoop.tmp.dir的路径可以根据自己的习惯进行设置。

image

代码如下:

<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>

2. mapred-site.xml.template配置:

image

代码如下:

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>

3. hdfs-site.xml配置: 其中dfs.namenode.name.dir和dfs.datanode.data.dir的路径可以自由设置,最好在hadoop.tmp.dir的目录下面

image

代码如下:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
</property>
</configuration>

4. 如果在后面运行hadoop时,出现找不到JAVA_HOME变量,修改hadoop-env.sh文件如下内容将jdk的安装目录添加到该配置文件中):

image

修改配置hadoop-env.sh配置文件:

image

配置完成后,运行hadoop,如下内容。

运行Hadoop

1. 初始化HDFS系统

在/usr/hadoop/hadoop-2.6.4/目录下运行:

bin/hdfs namenode -format

成功的话,最后的提示如下,Exitting with status 0 表示成功,Exitting with status 1: 则是出错。若出错,可试着加上 sudo或检查/usr/hadoop/及子目录文件夹的权限是否与正在使用的用户相匹配。

image

初始化HDFS系统成功后,之后在使用Hadoop系统时,不需要重新初始化。

2. 开启NameNode和DataNode守护进程

在/usr/hadoop/hadoop-2.6.4/目录下运行:

sbin/start-dfs.sh

启动成功的截图如下:

image

3. 使用jps命令查看hadoop进程信息,若上述命令都执行成功,则如下:

image

4. hadoop启动过程中的错误查看和处理

在启动hadoop的过程中,可能会出现启动报错的情况,则可以在如下的log文件中查看报错信息进行处理(最新的错误信息在文件的最底端):

image

例如,在上述进行开启NameNode和DataNode的守护进程时,在log文件中出现了如下的错误提示:

在/usr/hadoop/hadoop-2.6.4/logs/hadoop-hadoop-namenode-loaclhost.localdomain.log文件中:

image

在/usr/hadoop/hadoop-2.6.4/logs/hadoop-hadoop-datanode-loaclhost.localdomain.log文件中:

image

错误原因是在对/home/hadoop/(在配置文件中设置的hadoop的文件夹目录)进行修改权限时,没有对其中的子目录和文件进行修改权限,

image

使用root用户,重新执行修改目录权限的命令:

su - root
chown -R hadoop:hadoop /home/hadoop

再次运行NameNode和DataNode守护进程命令,hadoop启动成功。

5. 在浏览器中查看Hadoop运行情况

在浏览器中输入 http://localhost:50070 ,即可查看相关信息:

image

在伪分布式Hadoop配置下运行WordCount Demo

首先创建几个所需的目录(在/usr/hadoop/hadoop-2.6.4/目录下运行):

bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop

接着将etc/hadoop中的文件作为输入文件复制到分布式文件系统中,即将/usr/hadoop/etc/hadoop复制到分布式文件系统中的/user/hadoop/input中。上一步创建的 /user/hadoop 相当于 HDFS 中的用户当前目录,可以看到复制文件时无需指定绝对目录,下面的命令的目标路径就是 /user/hadoop/input:

bin/hdfs dfs -put etc/hadoop input

运行MapReduce作业,执行成功的话跟单机模式相同,输出作业信息:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar grep input output 'dfs[a-z.]+'

查看运行结果:

bin/hdfs dfs -cat output/*

也可以将运行结果取回到本地:

rm -R ./output
bin/hdfs dfs -get output output
cat ./output/*

结果如下,注意到跟单机模式中用的不是相同的数据,所以运行结果不同(换成原来的数据,结果是一致的)。

可以看到,使用bin/hdfs dfs -命令可操作分布式文件系统, 如:

bin/hdfs dfs -ls /user/hadoop           # 查看`/user/hadoop`中的文件
bin/hdfs dfs -rm -R /user/hadoop/input/*    # 删除 input 中的文件
bin/hdfs dfs -rm -R /user/hadoop/output     # 删除 output 文件夹

注意:

1. 运行程序时,输出目录需不存在:运行 Hadoop 程序时,结果的输出目录(如output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。建议在程序中加上如下代码进行删除,避免繁琐的命令行操作:

Configuration conf = new Configuration();
Job job = new Job(conf);
...
/* 删除输出目录 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);
...

结束Hadoop进程,则运行:

sbin/stop-dfs.sh

2. 下次再启动hadoop,无需进行HDFS的初始化,只需要运行 sbin/stop-dfs.sh 就可以

参考资料:

http://www.cnblogs.com/lijingchn/p/5574476.html

http://www.linuxidc.com/Linux/2015-03/115268.htm

http://www.linuxidc.com/Linux/2015-02/113486.htm