CentOS 6.3下Hadoop伪分布式平台搭建
最近要写一个数据量较大的程序,所以想搭建一个hbase平台试试。搭建hbase伪分布式平台,需要先搭建Hadoop平台。本文主要介绍伪分布式平台搭建过程。
目录:
一、前言
二、环境搭建
三、命令测试
四、启动YARN
五、web查看
一、前言
1、开始搭建前上官网看了一下,发现最新版本是3.0,但一想到跨版本而且又是最新版本的一般都会出现各种不一样的问题,所以决定使用了2.7.3,hadoop2的最新版本,至于跟后面搭建hbase的版本兼不兼容的情况等遇到再看怎么处理(实验证明最新版本的hbase1.2.3跟hadoop2.7.3是完美兼容的)。
2、机器只有实体机一台 10.1.2.108,CentOS 6.3,64位系统
4、由于开了多个窗口,所以本文中的shell命令有时候是root运行,有时候是hadoop账号运行,需要注意hostname以便区分
二、环境搭建
1、新建hadoop用户
公司的机器是配好ssh的,如果没安装机器可以使用命令
yum install openssh-clients -y yum install openssh-server -y
安装成功后配置免密登陆需要先切换hadoop账号,使用ssh-keygen生成sshkeys,并且将公钥授权给本机
重启ssh服务。
-bash: /usr/bin/ssh: Permission denied
则root下使用下面命令
chmod a+x /usr/bin/ssh
5、安装hadoop
因为我下载的编译后的包,所以是可以直接解压运行的。
hadoop默认就是单机模式,java单进程运行,方便调试。我们可以直接使用原生的例子来测试hadoop是否安装成功,运行下面命令就可以看到hadoop原生所有例子
若出现提示 “WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决)。
6、伪分布式安装
先设置环境变量,修改~/.bashrc,修改后source ~/.bashrc
export HADOOP_HOME=/usr/local/hadoop export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
hadoop的配置文件在etc/hadoop下面,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
修改core-site.xml,增加两个property,有些人会把ip写成localhost,但个人建议使用ip会比较有保证,不会那么容易出错。
<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://10.1.2.108:9000</value> <description>NameNode URI</description> </property> </configuration>
修改hdfs-site.xml
三、命令测试
由于DataNode出问题之后,我把hostname修改为了master,之后的命令会是下面这样
[root@master ~]# [hadoop@master ~]$
上面运行的单机例子读取和写入的都是本地的文件系统,而伪分布式读取写入的是HDFS上的数据。
[hadoop@master ~]$ hdfs dfs -mkdir /user/hadoop # 新建目录作为个人账号目录 [hadoop@master ~]$ hdfs dfs -mkdir input # 新建 [hadoop@master ~]$ hdfs dfs -ls 16/11/03 00:10:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 1 items drwxr-xr-x - hadoop supergroup 0 2016-11-03 00:06 input [hadoop@master ~]$ hdfs dfs -ls /user/hadoop 16/11/03 00:10:42 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 1 items drwxr-xr-x - hadoop supergroup 0 2016-11-03 00:06 /user/hadoop/input [hadoop@master ~]$ hdfs dfs -ls -R / 16/11/03 00:14:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable drwxr-xr-x - hadoop supergroup 0 2016-11-03 00:14 /user drwxr-xr-x - hadoop supergroup 0 2016-11-03 00:14 /user/hadoop drwxr-xr-x - hadoop supergroup 0 2016-11-03 00:06 /user/hadoop/input
在运行hadoop伪分布式实例之前我们先删掉之前单机模式产生的output文件夹,然后开始运行
[hadoop@master hadoop]$ hdfs dfs -put *.txt input 16/11/03 09:58:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable [hadoop@master hadoop]$ hdfs dfs -ls input 16/11/03 09:58:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 3 items -rw-r--r-- 1 hadoop supergroup 84854 2016-11-03 09:58 input/LICENSE.txt -rw-r--r-- 1 hadoop supergroup 14978 2016-11-03 09:58 input/NOTICE.txt -rw-r--r-- 1 hadoop supergroup 1366 2016-11-03 09:58 input/README.txt [hadoop@master hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'SOFT[A-Z]+' [hadoop@master hadoop]$ hdfs dfs -ls output 16/11/03 09:59:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 2 items -rw-r--r-- 1 hadoop supergroup 0 2016-11-03 09:59 output/_SUCCESS -rw-r--r-- 1 hadoop supergroup 12 2016-11-03 09:59 output/part-r-00000 [hadoop@master hadoop]$ ls output ls: cannot access output: No such file or directory [hadoop@master hadoop]$ hdfs dfs -cat output/part-r-00000 16/11/03 10:00:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 49 SOFTWARE [hadoop@master hadoop]$ hdfs dfs -get output ./output # 将文件夹取回到本地文件系统 16/11/03 10:03:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable [hadoop@master hadoop]$ ls output/ part-r-00000 _SUCCESS [hadoop@master hadoop]$ cat output/part-r-00000 49 SOFTWARE [hadoop@master hadoop]$
注意运行 Hadoop 程序时,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录
四、启动YARN
原框架的问题逐渐浮出水面,主要的问题集中如下:
1、JobTracker 是 Map-reduce 的集中处理点,存在单点故障。
2、JobTracker 完成了太多的任务,造成了过多的资源消耗,当 map-reduce job 非常多的时候,会造成很大的内存开销,潜在来说,也增加了 JobTracker fail 的风险,这也是业界普遍总结出老 Hadoop 的 Map-Reduce 只能支持 4000 节点主机的上限。
3、在 TaskTracker 端,以 map/reduce task 的数目作为资源的表示过于简单,没有考虑到 cpu/ 内存的占用情况,如果两个大内存消耗的 task 被调度到了一块,很容易出现 OOM。
4、在 TaskTracker 端,把资源强制划分为 map task slot 和 reduce task slot, 如果当系统中只有 map task 或者只有 reduce task 的时候,会造成资源的浪费,也就是前面提过的集群资源利用的问题。
5、源代码层面分析的时候,会发现代码非常的难读,常常因为一个 class 做了太多的事情,代码量达 3000 多行,,造成 class 的任务不清晰,增加 bug 修复和版本维护的难度。
6、从操作的角度来看,现在的 Hadoop MapReduce 框架在有任何重要的或者不重要的变化 ( 例如 bug 修复,性能提升和特性化 ) 时,都会强制进行系统级别的升级更新。更糟的是,它不管用户的喜好,强制让分布式集群系统的每一个用户端同时更新。这些更新会让用户为了验证他们之前的应用程序是不是适用新的 Hadoop 版本而浪费大量时间。
Yarn 框架相对于老的 MapReduce 框架什么优势呢?我们可以看到:
1、这个设计大大减小了 JobTracker(也就是现在的 ResourceManager)的资源消耗,并且让监测每一个 Job 子任务 (tasks) 状态的程序分布式化了,更安全、更优美。
2、在新的 Yarn 中,ApplicationMaster 是一个可变更的部分,用户可以对不同的编程模型写自己的 AppMst,让更多类型的编程模型能够跑在 Hadoop 集群中,可以参考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。
3、对于资源的表示以内存为单位 ( 在目前版本的 Yarn 中,没有考虑 cpu 的占用 ),比之前以剩余 slot 数目更合理。
4、老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。
5、Container 是 Yarn 为了将来作资源隔离而提出的一个框架。这一点应该借鉴了 Mesos 的工作,目前是一个框架,仅仅提供 java 虚拟机内存的隔离 ,hadoop 团队的设计思路应该后续能支持更多的资源调度和控制 , 既然资源表示成内存量,那就没有了之前的 map slot/reduce slot 分开造成集群资源闲置的尴尬情况。
接下来开始修改配置文件。
[hadoop@master hadoop]$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
修改etc/hadoop/mapred-site.xml,增加property
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
修改etc/hadoop/yarn-site.xml,增加property
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
启动YARN
[hadoop@master hadoop]$ start-yarn.sh starting yarn daemons starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-resourcemanager-master.out localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-master.out [hadoop@master hadoop]$ jps 51616 NameNode 51771 DataNode 51995 SecondaryNameNode 3421 ResourceManager 3550 NodeManager 3919 Jps
可以发现,比之前多了两个进程 NodeManager, ResourceManager。启动 YARN 之后,运行实例的方法还是一样的,仅仅是资源管理方式、任务调度不同。有兴趣的读者可以观察日志对比变化。
注意在单机上启动YARN可能会发现测试实例的运行速度变慢了(可以看出单机伪分布式并不适合使用YARN),这时候如果要关闭YARN直接启动伪分布式平台则需要将mapred-site.xml删掉,保留原来的mapred-site.xml.template 即可。停止YARN命令如下
[hadoop@master hadoop]$ stop-yarn.sh stopping yarn daemons stopping resourcemanager localhost: stopping nodemanager no proxyserver to stop [hadoop@master hadoop]$ jps 51616 NameNode 7236 Jps 51771 DataNode 51995 SecondaryNameNode
如果要关闭hadoop伪分布式平台,则先停止YARN,再停止NameNode
hadoop@master hadoop]$ stop-yarn.sh stopping yarn daemons stopping resourcemanager localhost: stopping nodemanager no proxyserver to stop 、 [hadoop@master hadoop]$ jps 51616 NameNode 7236 Jps 51771 DataNode 51995 SecondaryNameNode [hadoop@master hadoop]$ stop-dfs.sh 16/11/03 10:36:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Stopping namenodes on [localhost] localhost: stopping namenode localhost: stopping datanode Stopping secondary namenodes [0.0.0.0] 0.0.0.0: stopping secondarynamenode 16/11/03 10:36:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable [hadoop@master hadoop]$ jps 9463 Jps
重新启动并查看运行进程和集群状态信息
[hadoop@master hadoop]$ start-dfs.sh [hadoop@master hadoop]$ start-yarn.sh [hadoop@master hadoop]$ jps 12178 ResourceManager 12690 Jps 11540 NameNode 11943 SecondaryNameNode 12312 NodeManager 11707 DataNode [hadoop@master hadoop]$ hdfs dfsadmin -report
五、web查看
由于我没有使用web查看过,所以不知道网页查看是长什么样子的。但端口应该是50030和和50070。可以打开页面访问http://your ip:50030,http://your ip:50070
至此,伪分布式hadoop平台搭建完成。要了解更多请参考官网文档。
下面关于Hadoop的文章您也可能喜欢,不妨看看: