接着上一篇: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