Hadoop的伪分布式模式

接着上一篇:Hadoop的版本选择和单机模式

下面来看一下hadoop2.5.1的伪分布式模式
安装ssh
在伪分布式模式下工作时必须启动守护进程,而启动守护进程的前提是已经成功安装SSH。hadoop并不严格区分伪分布式模式和全分布式模式,它只是启动集群主机集的守护进程;SSH-ing到各个主机并启动一个守护进程。在伪分布式模式下,主机就是本地计算机,因而伪分布式模式可视作全分布式模式的一个特例。需要指出的是,必须确保用户能够SSH到本地主机,并不需要输入密码就可以登录。

sudo yum install ssh

然后基于口令创建一个新SSH密钥,以启用无密码登录

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

测试:

ssh localhost

如果成功无需输入密码

修改配置文件
core-site.xml、hdfs-site.xml、yarn-site.xml 、mapred-site.xml. 四个文件
core-site.xml

<property>
       <name>fs.defaultFS</name>
       <value>hdfs://127.0.0.1:9000</value>
</property>

只配置了hdfs的url路径,因为是伪分布式模式,所有ip是本地ip
官网配置:http://hadoop.apache.org/docs/r2.5.1/hadoop-project-dist/hadoop-common/core-default.xml

hdfs-site.xml

<property>
       <name>dfs.namenode.name.dir</name>
       <value>file:/usr/local/hadoop-2.5.1/dfs/name</value>
</property>
<property>
       <name>dfs.datanode.data.dir</name>
       <value>file:/usr/local/hadoop-2.5.1/dfs/data</value>
</property>

只配置了namenode和datanode的存储路径,默认存储在:file://${hadoop.tmp.dir}/dfs/name和data下
官网配置:http://hadoop.apache.org/docs/r2.5.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

mapred-site.xml:默认只有mapred-site.xml.template,可以拷贝一份

cp mapred-site.xml.template mapred-site.xml
<property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
</property>

新框架支持第三方 MapReduce 开发框架以支持如 SmartTalk/DGSG 等非 Yarn 架构,注意通常情况下这个配置的值都设置为 Yarn,如果没有配置这项,那么提交的 Yarn job 只会运行在 locale 模式,而不是分布式模式。
官方配置:http://hadoop.apache.org/docs/r2.5.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

yarn-site.xml

<property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
</property>

为了能够运行MapReduce程序,需要让各个NodeManager在启动时加载shuffle server,shuffle server实际上是Jetty/Netty Server,Reduce Task通过该server从各个NodeManager上远程拷贝Map Task产生的中间结果。上面增加的两个配置均用于指定shuffle serve。
官方配置:http://hadoop.apache.org/docs/r2.5.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

监控
如果没有单独配置 hdfs-site.xml中的dfs.namenode.http-address,默认端口50070,http://ip:50070 就可以访问namenode节点信息
我这边因为是在虚拟机中,所有还需要开启端口:
查询50070端口是否打开:

firewall-cmd --query-port=50070/tcp

返回yes 表示打开
打开端口:

firewall-cmd --add-port=50070/tcp

如果没有单独配置yarn-site.xml中的yarn.resourcemanager.webapp.address,默认的端口8088,访问http://ip:8088/ 就可以访问hadoop管理页面

启动
启动文件都在:$HADOOP_HOME/sbin下

1.格式化namenode以防有脏数据

hdfs namenode -format

2.启动和停止namenode和datanode

hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop datanode

jps查看一下是否有DataNode和NameNode进程,如果没有可以查看日志:$HADOOP_HOME/logs

3.启动和停止nodemanager和resourcemanager

yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh stop nodemanager

jps查看一下是否有NodeManager和ResourceManager进程,如果没有可以查看日志:$HADOOP_HOME/logs

注:在启动过程中遇到这样的问题:

Java HotSpot(TM) 64-Bit Server VM warning: 
You have loaded library /root/hadoop-2.5.1/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard.
The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.

在hadoop-env.sh文件的末尾添加:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

测试hdfs
查看hdfs根目录文件:

hadoop fs -ls / 

拷贝本地的文件到hdfs中:

hadoop dfs -put input/ /in 

查看hdfs中的in目录文件:

hadoop fs -ls /in 

测试mapreduce
运行hadoop自带的wordcount实例可以统计一批文本文件中单词出现的次数

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar wordcount /in /out

查看hdfs中的out目录文件:

hadoop fs -ls /out 
hadoop fs -cat /out/*

结果:

hadoop  1
hello   2
world   1

到此基本上整个流程跑通了

遇到的坑:遇到问题直接查看logs是最好的解决办法

1.namenode启动失败:file:/usr/local/hadoop-2.5.1/dfs/name 没有name文件夹,创建name文件夹
2.datanode启动失败:已经存在id了,猜测是之前产生的脏数据,file:/usr/local/hadoop-2.5.1/dfs/data 清空
3.nodemanager启动失败:因为yarn.nodemanager.aux-services配置的value是mapreduce.shuffle(网上找的),报无效的名称
修改为mapreduce_shuffle
4.测试mapreduce失败:因为没有在yarn-site.xml中配置yarn.nodemanager.aux-services