Hadoop单机模式运行
Hadoop 默认配置是以非分布式模式运行,即单 Java 进程,方便进行调试。可以执行附带的例子 WordCount 来感受下 Hadoop 的运行。将 input 文件夹中的文件作为输入,统计当中符合正则表达式 wo[a-z.]+
的单词出现的次数,并输出结果到 output 文件夹中。
$ cd /usr/local/hadoop
$ mkdir input
$ cp ./etc/hadoop/*.xml input
$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'wo[a-z.]+'
$ cat ./output/*
执行成功后如下所示,输出了作业的相关信息,输出的结果是符合正则的单词dfsadmin出现了1次
hadoop@ubuntu:~/opt/hadoop-2.6.0$ cat ./output/*
2 word
1 work
如果需要再次运行,需要删除output文件夹(因为Hadoop 默认不会覆盖结果文件):
$ rm -rf output
Hadoop伪分布式配置
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode。
Hadoop 的配置文件位于 /home/hadoop/opt/hadoop-2.6.0/etc/hadoop/
中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。
修改配置文件 core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/opt/hadoop-2.6.0/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
接着修改配置文件 hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/opt/hadoop-2.6.0/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/opt/hadoop-2.6.0/tmp/dfs/data</value>
</property>
</configuration>
配置完成后,执行 namenode 的格式化:
hadoop@ubuntu:~/opt/hadoop-2.6.0$ bin/hdfs namenode -format
最后几行如下:
15/05/13 08:50:15 INFO namenode.FSImage: Allocated new BlockPoolId: BP-707136192-127.0.1.1-1431532215593
15/05/13 08:50:15 INFO common.Storage: Storage directory /home/hadoop/opt/hadoop-2.6.0/tmp/dfs/name has been successfully formatted.
15/05/13 08:50:16 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
15/05/13 08:50:16 INFO util.ExitUtil: Exiting with status 0
15/05/13 08:50:16 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1
************************************************************/
接着开启 NaneNode 和 DataNode 守护进程。(只开启hdfs)
hadoop@ubuntu:~/opt/hadoop-2.6.0$ sbin/start-dfs.sh
出现下面的错误提示:
Starting namenodes on [localhost]
localhost: Error: JAVA_HOME is not set and could not be found.
localhost: Error: JAVA_HOME is not set and could not be found.
Starting secondary namenodes [0.0.0.0]
解决办法:
打开hadoop-env.sh中设置JAVA_HOME,修改
export JAVA_HOME=/home/hadoop/opt/jdk1.8.0_45
问题解决~~~
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/opt/hadoop-2.6.0/logs/hadoop-hadoop-namenode-ubuntu.out
localhost: starting datanode, logging to /home/hadoop/opt/hadoop-2.6.0/logs/hadoop-hadoop-datanode-ubuntu.out
Starting secondary namenodes [0.0.0.0]
The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ECDSA key fingerprint is 1a:e1:fa:ce:18:2c:44:b7:0f:3b:38:fc:fd:05:8d:97.
Are you sure you want to continue connecting (yes/no)? yes
0.0.0.0: Warning: Permanently added '0.0.0.0' (ECDSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /home/hadoop/opt/hadoop-2.6.0/logs/hadoop-hadoop-secondarynamenode-ubuntu.out
启动完成后,可以通过命令 jps
来判断是否成功启动,若成功启动则会列出如下进程: NameNode
、DataNode
和SecondaryNameNode
。(如果SecondaryNameNode没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试;如果 NameNode 或 DataNode 没有启动,请仔细检查之前步骤)。
hadoop@ubuntu:~/opt/hadoop-2.6.0$ jps
4576 Jps
4274 DataNode
4162 NameNode
4473 SecondaryNameNode
成功启动后,可以访问 Web 界面 http://localhost:50070 来查看 Hadoop 的信息:
Hadoop伪分布式实例-WordCount
上面的单机模式,WordCount 读取的是本地数据,伪分布式读取的则是HDFS上的数据。要使用 HDFS,首先需要创建用户目录
hadoop@ubuntu:~/opt/hadoop-2.6.0$ bin/hdfs dfs -mkdir -p /user/hadoop
解释如下:
-mkdir [-p] <path> ... :
Create a directory in specified location.
-p Do not fail if the directory already exists
接着将 etc/hadoop 中的文件作为输入文件复制到分布式文件系统中,即将 /home/hadoop/opt/hadoop-2.6.0/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。上一步已创建了用户目录 /user/hadoop ,因此命令中就可以使用相对目录如 input,其对应的绝对路径就是 /user/hadoop/input:
$ bin/hdfs dfs -mkdir -p /user/hadoop/input
$ bin/hdfs dfs -put etc/hadoop/*.xml /user/hadoop/input
复制完成后,可以通过如下命令查看文件列表:
hadoop@ubuntu:~/opt/hadoop-2.6.0$ bin/hdfs dfs -ls /user/hadoop/input
或者使用
bin/hdfs dfs -ls .
Found 8 items
-rw-r--r-- 1 hadoop supergroup 4436 2015-05-13 18:26 input/capacity-scheduler.xml
-rw-r--r-- 1 hadoop supergroup 991 2015-05-13 18:26 input/core-site.xml
-rw-r--r-- 1 hadoop supergroup 9683 2015-05-13 18:26 input/hadoop-policy.xml
-rw-r--r-- 1 hadoop supergroup 1121 2015-05-13 18:26 input/hdfs-site.xml
-rw-r--r-- 1 hadoop supergroup 620 2015-05-13 18:26 input/httpfs-site.xml
-rw-r--r-- 1 hadoop supergroup 3523 2015-05-13 18:26 input/kms-acls.xml
-rw-r--r-- 1 hadoop supergroup 5511 2015-05-13 18:26 input/kms-site.xml
-rw-r--r-- 1 hadoop supergroup 690 2015-05-13 18:26 input/yarn-site.xml
伪分布式运行MapReduce作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹删掉来验证这一点)。
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
$ bin/hdfs dfs -cat output/*
在hdfs中把输出结果删除
bin/hdfs dfs -rmr outpu
将运行结果取回到本地:
$ rm -R ./output
$ bin/hdfs dfs -get output output # 将 HDFS 上的 output 文件夹拷贝到本机
$ cat ./output/*
结果如下:
1 dfsadmin
1 dfs.replication
1 dfs.namenode.name.dir
1 dfs.datanode.data.dir
Hadoop运行程序时,默认输出目录不能存在,因此再次运行需要执行如下命令删除 output文件夹:
$ bin/hdfs dfs -rmr /user/hadoop/output # 删除 output 文件夹