一、需求
公司线上运行有hadoop1.0和hadoop2.0,由于hadoop1.0没有处理jobtracker失败机制,它是一个单点故障,但业务还是以1.0为主,会慢慢过渡到2.0。
二、架构图
二、知识点储备
1、hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker介绍
http://zouqingyun.blog.51cto.com/782246/1656353
2、hadoop有三种运行模式
独立(或本地)模式
无需运行任何守护进程,所有程序都在同一个JVM上执行。在独立模式下测试和调试MapReduce程序很方便,因此该模式在开发阶段比较合适
伪分布模式
Hadoop守护进程运行在本地机器上,模拟一个小规模集群
全分布模式
Hadoop守护进程运行在一个集群上。
2、Hadoop的配置文件:
hadoop-env.sh: 用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等;
core-site.xml: 用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;
hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;
mapred-site.xml:HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;
masters: hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode;
slaves:Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;
三、基本环境准备
1、机器
IP地址 主机名 扮演的角色 10.1.2.214 master NameNode,JobTracker 10.1.2.215 slave-one DataNode,TaskTracker 10.1.2.216 slave-two SecondaryNameNode,DataNode和TaskTrakcer
2、系统版本
CentOS release 6.5 2.6.32-431.el6.x86_64
3、关闭3台所有防火墙
service iptables stop
4、集群环境,时间同步很重要
master
启动ntpd服务
[root@master ~]# service ntpd start 正在启动 ntpd: [确定]
添加定时网络时间服务器
[root@master ~]# crontab -e no crontab for root - using an empty one 30 * * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn > /dev/null 2>&1
slave-one
[root@slave-one ~]# crontab -l 10 * * * * /usr/sbin/ntpdate 10.1.2.214 >/dev/null 2>&1
slave-two
[root@slave-twon ~]# crontab -l 10 * * * * /usr/sbin/ntpdate 10.1.2.214 >/dev/null 2>&1
5、三台主机hosts要对应
[root@master ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.1.2.214 master 10.1.2.215 slave-one 10.1.2.216 slave-two
6、安全起见,运行Hadoop需要以普通用户的身份进行,因此,接下来先建立运行hadoop进程的用户hadoop并给其设定密码。其他两台也一样
[root@master ~]# vim /etc/hosts [root@master ~]# groupadd hadoop [root@master ~]# useradd -g hadoop hadoop [root@master ~]# echo "123456" | passwd --stdin hadoop
7、配置hadoop用户能够以基于密钥的验正方式登录本地主机,以便Hadoop可远程启动各节点上的Hadoop进程并执行监控等额外的管理工作。注意了,3台都要做相互免密钥!
[root@master ~]# su hadoop [hadoop@master ~]$ ssh-keygen -t rsa -P '' [hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub [email protected] [hadoop@master ~]$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]
8、修改文件名柄
默认情况下,linux最大文件句柄数为1024个。服务器在大并发达到极限时,就会报出“too many open files”。这对集群来说,数量大时,会挂掉的
vim /etc/security/limits.conf
* soft nofile 102400 * hard nofile 102400
重新登录,执行ulimit -a ,ok ,参数生效了
四、安装配置hadoop集群
1、安装包准备
hadoop-1.0.4.tar.gz jdk1.7.0_25.tar.gz
2、安装jdk
2.1 安装JDK
Hadoop依赖于1.6 update 8或更新版本的Java环境
[root@master hadoop1.0]# tar jdk-8u66-linux-x64.gz -C /usr/local/
2.2 Hadoop运行时需要能访问到如前安装的Java环境,这可以通过将其二进制程(/usr/local/jdk1.8.0_66)所在的目录添加至PATH环境变量的路径中实现,也可以通过设定hadoop-env.sh脚本来进行。这里采用前一种方式,编辑/etc/profile.d/java.sh,在文件中添加如下内容:
JAVA_HOME=/usr/usr/local/jdk1.8.0_66 PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH
2.3 hadoop用户,并执行如下命令测试jdk环境配置是否就绪。
[hadoop@master data0]$ java -version java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
3、hadoop安装配置
3.1安装
[root@master hadoop1.0]# tar xf hadoop-1.0.4.tar.gz -C /usr/local/ [root@master hadoop1.0]# chown hadoop:hadoop /usr/local/hadoop-1.0.4/ -R
3.2 Java环境变量两种方法
3.2.1编辑/etc/profile.d/hadoop.sh,设定HADOOP_HOME环境变量的值为hadoop的解压目录,并让其永久有效。编辑/etc/profile,添加如下内容
HADOOP_BASE=/usr/local/hadoop-1.0.4 PATH=$HADOOP_BASE/bin:$PATH export HADOOP_BASE PATH
3.2.2 去到conf配置目录下找到环境变量文件 hadoop-env.sh 确认JAVA_HOME路径是否正确
export JAVA_HOME=/usr/local/jdk1.8.0_66
3.3 切换至hadoop用户,并执行如下命令测试hadoop是否就绪。
[hadoop@master root]$ hadoop version Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release Hadoop 1.0.4 Subversion https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290 Compiled by hortonfo on Wed Oct 3 05:13:58 UTC 2012 From source with checksum fe2baea87c4c81a2c505767f3f9b71f4
3.4 配置文件,在/usr/local/usr/local/hadoop-1.0.4/conf/目录下
3.4.1 hadoop-env.sh
记录脚本用到的环境变量,以运行hadoop
namenode内存空间分配在这里为4096,在master机器上设置
export HADOOP_HEAPSIZE=4096
3.4.1 core-site.xml
注意fs.default.name属性要正确配置,该属性用于配置namenode节点,我们都知道一个hadoop系统中一般只有一个namenode节点管理所有的datanode,所以设置一定要正确:hdfs://master:9000。一般默认都是9000端口
fs.default.name hdfs://master:9000 hadoop.tmp.dir /data0/hadoop/tmp io.file.buffer.size 65536
3.4.2 hdfs-site.xml
dfs.replication属性,顾名思义表示指定的hadoop文件块的备份数量,一般默认是3份,可以设为1
dfs.name.dir属性,非常重要,用来设置存放namenode数据的目录,如果这个目录访问失败,则会导致namenode启动失败
dfs.data.dir属性,用来指定datanode上本地存放数据的目录,与namenode的设置独立没有关系
dfs.name.dir属性,非常重要,namenode用来存储永久性的元数据的目录列表。namenode在列表上的各个目录中均存放相同元数据文件,如果这个目录访问失败,则会导致namenode启动失败
dfs.data.dir属性,用来指定datanode上本地存放数据块的目录列表,与namenode的设置独立没有
关系
fs.checkpoint.dir属性,辅助namenode存放检查点的目录列表。在所列的每个目录中均存放一份检查点文件副本
dfs.name.dir /data0/hadoop/dfs/name dfs.data.dir fs.checkpoint.dir /data0/hadoop/dfs/namesecondary fs.checkpoint.period 600 The number of seconds between two periodic checkpoints. dfs.namenode.handler.count 20 The number of server threads for the namenode. dfs.replication 2 dfs.datanode.du.reserved 32212254720 (30GB)Reserved space in bytes per volume. Always leave this much space free for non dfs use. dfs.datanode.max.xcievers 4096 The number of server threads for the datanode. fs.trash.interval 300 time in minutes, 300 means 5 hours dfs.http.address 0.0.0.0:50070 dfs.secondary.http.address slave-two:50090 dfs.balance.bandwidthPerSec 5242880 Default value is 1048576(1mb), that's too slow, set it to 5242880(5mb). We cann't set it to a high value, e.g. 20mb, this will affect the execution of map/reduce task. dfs.hosts.exclude /home/hadoop/hadoop-1.0.4/conf/exclude_hosts Names a file that contains a list of hosts that are not permitted to connect to the namenode. The full pathname of the file must be specified. If the value is empty, no hosts are excluded.
3.4.3 mapred-site.xml
mapred.jop.tracker属性用来设置JobTracker的主机、IP地址和端口,本机的话可以设置为:master:9001
maped.local.dir属性,逗号分隔的目录名称,默认值${hadoop.tmp.dir}/mapred.local。存储作业的中间数据的目录列表。作业终止时,数据被清除
maped.system.dir属性,类型为URI,默认值${hadop.tmp.dir}/mapred/system。在作业运行期间存储共享文件的目录,相对于fs.default.name
maped.task tracker.map.tasks.maximum属性,类型为int,默认值为2,在任一时刻。允许在tasktracker上运行的map任务的最大数量
mapred.tasktracker.reduce.tasks.maximum属生,类型为string,默认值为-Xmx200m。JVM选项,用于启动运行map和reduce任务的tasktracker子进程。该属性可以针对每个作业进行设置。例如,可以设置JVM属性,支支技调试
mapreduce.map.java.opts属性,类型为String,默认值-Xmx200m。JVM选项,针对运行map的任务的子进程(在1.x版本中不出现)
mapreduce.reduce.java.opts属性,类型为String,默认值-Xmx200m。JVM选项,针对运行reduce任务的子进程(在1.x版本中不出现)
mapred.job.tracker master:9001 mapred.job.tracker.http.address 0.0.0.0:50030 mapred.local.dir /data0/hadoop/mapred/map_loc mapred.system.dir /hadoop/mapred/system mapreduce.jobtracker.staging.root.dir /hadoop/mapred/staging mapred.job.tracker.handler.count 20 mapred.acls.enabled false mapred.tasktracker.map.tasks.maximum 8 mapred.tasktracker.reduce.tasks.maximum 4 mapred.child.java.opts -Xmx2048M -Xms512M io.sort.mb 320 io.sort.factor 50 mapred.reduce.slowstart.completed.maps 0.80
3.4.4 masters
运行辅助namenode的机器列表(每行一个)
slave-two
3.4.5 slavees
运行datanode和tasktracker的机器列表(每行一个)
slave-one slave-two
3.5 另外两台机器配置
3.5.1 把maseter下/usr/local/hadoop-1.0.4,/usr/local/jdk1.7.0_25,/etc/这两个目录和/etc/profile.d/hadoop.sh,/etc/profile.d/java.sh复制到另外两台机器,注意改好hadoop权限
[hadoop@master local]$ scp -r /etc/profile.d/java.sh [email protected]:/etc/profile.d/ [hadoop@master local]$ scp -r /etc/profile.d/java.sh [email protected]:/etc/profile.d/ [hadoop@master local]$ scp -r /usr/local/hadoop-1.0.4 [email protected]:/usr/local/ [hadoop@master local]$ scp -r usr/local/jdk1.7.0_25 [email protected]:/usr/local/jdk1.7.0_25
3.6 格式化名称节点
以hadoop用户运行如下命令
[hadoop@master root]$ hadoop namenode -format 16/01/08 19:11:37 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = master/10.1.2.214 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.0.4 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct 3 05:13:58 UTC 2012 ************************************************************/ 16/01/08 19:11:37 INFO util.GSet: VM type = 64-bit 16/01/08 19:11:37 INFO util.GSet: 2% max memory = 19.815 MB 16/01/08 19:11:37 INFO util.GSet: capacity = 2^21 = 2097152 entries 16/01/08 19:11:37 INFO util.GSet: recommended=2097152, actual=2097152 16/01/08 19:11:37 INFO namenode.FSNamesystem: fsOwner=hadoop 16/01/08 19:11:37 INFO namenode.FSNamesystem: supergroup=supergroup 16/01/08 19:11:37 INFO namenode.FSNamesystem: isPermissionEnabled=true 16/01/08 19:11:37 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100 16/01/08 19:11:37 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s) 16/01/08 19:11:37 INFO namenode.NameNode: Caching file names occuring more than 10 times 16/01/08 19:11:37 ERROR namenode.NameNode: java.io.IOException: Cannot create directory /data0/hadoop/dfs/name/current at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.clearDirectory(Storage.java:297) at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:1320) at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:1339) at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:1164) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1271) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288) 16/01/08 19:11:37 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at master/10.1.2.214 ************************************************************/
提示出错,无法创建/data0/hadoop目录,由此在三台机集事先创建/data0/hadoop目录并赋值于属主属组hadoop,再来执行
[hadoop@master data0]$ hadoop namenode -format 16/01/08 19:34:30 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = master/10.1.2.214 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.0.4 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct 3 05:13:58 UTC 2012 ************************************************************/ 16/01/08 19:34:30 INFO util.GSet: VM type = 64-bit 16/01/08 19:34:30 INFO util.GSet: 2% max memory = 19.815 MB 16/01/08 19:34:30 INFO util.GSet: capacity = 2^21 = 2097152 entries 16/01/08 19:34:30 INFO util.GSet: recommended=2097152, actual=2097152 16/01/08 19:34:30 INFO namenode.FSNamesystem: fsOwner=hadoop 16/01/08 19:34:30 INFO namenode.FSNamesystem: supergroup=supergroup 16/01/08 19:34:30 INFO namenode.FSNamesystem: isPermissionEnabled=true 16/01/08 19:34:30 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100 16/01/08 19:34:30 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s) 16/01/08 19:34:30 INFO namenode.NameNode: Caching file names occuring more than 10 times 16/01/08 19:34:30 INFO common.Storage: Image file of size 112 saved in 0 seconds. 16/01/08 19:34:30 INFO common.Storage: Storage directory /data0/hadoop/dfs/name has been successfully formatted. 16/01/08 19:34:30 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at master/10.1.2.214 ************************************************************
出现“Storage directory /data0/hadoop/dfs/name has been successfully formatted.”一行信息表明对应的存储已经格式化成功。
3.7 启动hadoop
[hadoop@master data0]$ start-dfs.sh starting namenode, logging to /data0/hadoop/logs/hadoop-hadoop-namenode-master.out 10.1.2.216: starting datanode, logging to /data0/hadoop/logs/hadoop-hadoop-datanode-slave-two.out 10.1.2.215: starting datanode, logging to /data0/hadoop/logs/hadoop-hadoop-datanode-slave-one.out 10.1.2.216: starting secondarynamenode, logging to /data0/hadoop/logs/hadoop-hadoop-secondarynamenode-slave-two.out [hadoop@master data0]$ start-mapred.sh starting jobtracker, logging to /data0/hadoop/logs/hadoop-hadoop-jobtracker-master.out 10.1.2.216: starting tasktracker, logging to /data0/hadoop/logs/hadoop-hadoop-tasktracker-slave-two.out 10.1.2.215: starting tasktracker, logging to /data0/hadoop/logs/hadoop-hadoop-tasktracker-slave-one.out
也可以start-all.sh来执行
3.8 运行jps命令查看正在运行的Hadoop进程
[hadoop@master data0]$ jps | grep -iv "jps" 30772 NameNode 30960 JobTracker
[hadoop@slave-one conf]$ jps 27826 TaskTracker 27311 DataNode 28640 Jps
[hadoop@slave-two conf]$ jps | grep -vi jps 12359 SecondaryNameNode 12773 TaskTracker 12268 DataNode
3.9 Hadoop守护进程的地址和端口
Hadoop守护进程一般同时运行RPC和HTTP两个服务器,RPC服务器支技守护进程间的通信,HTTP服务器则提供与用户交互的Web页面。
3.9.1 RPC服务器属性
fs.default.name属性,默认值file:///。被设为一个HDFS的URI时,该属性描述namenode的RPC服务器地址和端口,若未指定,默认8080端口
dfs.datanode.ipc.address属性,默认值0.0.0.0:50020。datanode的RPC服务器地址和端口
mapred.job.tracker属性,默认值local。被设为主机名称和端口号时,该属性指定jobtracker的RPC服务器地址和端口。常用端口号8021
mapred.taksk.tracker.report.address属性,默认值127.0.0.1:0。trakstracker的RPC服务器地址和端口号,tasktracker的子JVM利用它和tasktracker通信。在本例中,使用任一空闲端口均可行的。因为服务器仅绑定回送地址。仅当本机没有回送地址时才需要变更默认设置。
3.9.1 HTTP服务器的属性
mapred.job.tracker.http.address,默认值0.0.0.0:50030。jobtarcker的HTTP服务器地址和端口
mapred.task.tracker.http.address,默认值0.0.0.0:50060。tasktracker的HTTP服务器地址和端口
dfs.http.address,默认值0.0.0.0:50070。namenode的HTTP服务器地址和端口
dfs.datanode.http.address,默认值0.0.0.0:50075。datanode的HTTP服务器地址和端口
dfs.secondary.http.address,默认值0.0.0.0:50090。辅助namenode的HTTP服务器地址和端口
4.jobtracker界面
5.Namenode界面