Hadoop 集群搭建笔记

beat_it 贡献于2013-11-16

作者 Sky  创建于2013-10-30 14:05:00   修改者Sky  修改于2013-10-30 14:09:00字数5495

文档摘要:分布式集群系统安装伪分布模式安装比较简单,集群模式是在伪分布模式基础上进行修改的,所以伪分布模式安装必须搞定。以下是操作步骤1.确定集群的结构由于SecondaryNameNode是执行合并任务的,内存占用特别大,所以单独一台大内存的节点。以上4个ip可以是单独的物理机,也可以是虚拟机。生产环境中,一般是物理机。假设各节点安装的linux版本完全一致。
关键词:

超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 第4章:Hadoop集群 4.1.分布式集群系统安装 伪分布模式安装比较简单,集群模式是在伪分布模式基础上进行修改的,所以伪分布模式安装必须搞定。 以下是操作步骤 1.确定集群的结构 IP(主机名) 角色 192.168.1.220(hadoop0) NameNode、JobTracker 192.168.1.221(hadoop1) SecondaryNameNode 192.168.1.222(hadoop2) DataNode、TaskTracker 192.168.1.223(hadoop3) DataNode、TaskTracker 由于SecondaryNameNode是执行合并任务的,内存占用特别大,所以单独一台大内存的节点。 以上4个ip可以是单独的物理机,也可以是虚拟机。生产环境中,一般是物理机。 假设各节点安装的linux版本完全一致。 假设各ip已经设置完成了主机名、防火墙关闭、ssh免密码登录等事项。并且在192.168.1.220上已经成功安装了hadoop的伪分布模式。如果还没有搞定的同学,可以参考前面的文章。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 2.绑定各ip与主机名的映射关系 修改hadoop0的/etc/hosts文件,增加以下内容 192.168.1.220 hadoop0 192.168.1.221 hadoop1 192.168.1.222 hadoop2 192.168.1.223 hadoop3 目的是在hadoop0上通过主机名可以找到各个机器。 然后在hadoop0的终端中执行命令 scp  /etc/hosts hadoop1:/etc scp /etc/hosts hadoop2:/etc scp /etc/hosts hadoop3:/etc 该命令是把hadoop0的hosts文件复制到其他节点的对应文件中 3.确保各个节点之间ssh可以免密码登录 在hadoop0的终端中执行以下命令 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop1 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop2 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3 这样做是把公钥信息拷贝到其他节点中。同理,其他节点也执行类似操作,如hadoop1中执行以下命令 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop0 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop2 ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 在hadoop2、hadoop3中也执行类似操作。 4.在其他节点搭建环境 首先把hadoop0中的${HADOOP_HOME}/tmp和${HADOOP_HOME}/logs删掉,命令如下。 rm -rf /usr/local/hadoop/tmp rm -rf /usr/local/hadoop/logs 然后在hadoop0执行以下命令 scp -r /usr/local/hadoop hadoop1:/usr/local scp -r /usr/local/jdk hadoop1:/usr/local scp -r /etc/profile hadoop1:/etc/ 执行完毕后,把命令中的hadoop1替换为hadoop2执行,替换为hadoop3执行。 以上操作是把hadoop0中的jdk文件夹和hadoop文件夹及环境变量复制到其他节点,避免安装了。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 5.修改集群配置文件 在hadoop0的${HADOOP_HOME}/conf目录中,找到masters文件,删除内容,添加hadoop1; 找到slaves文件,删除内容,添加hadoop2和hadoop3,每个节点一行,不能写在一行中。 注意:只修改hadoop0的配置文件,其他节点的任何hadoop配置文件都不能修改。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 6.启动集群环境 在hadoop0节点,执行以下命令 hadoop namenode -format start-all.sh 第一条命令是格式化文件系统,第二条命令是启动hadoop集群。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 7.验证是否成功 在hadoop0执行命令jps,可以看到两个java进程,分别是NameNode、JobTracker; 在hadoop1执行命令jps,可以看到一个java进程,是SecondaryNameNode; 在hadoop2执行命令jps,可以看到两个java进程,分别是DataNode、TaskTracker; 在hadoop3执行命令jps,可以看到两个java进程,分别是DataNode、TaskTracker; 收工,搞定了!! 4.2. Hadoop的安全模式 在hadoop集群的时候,集群的运行会进入到安全模式(safeMode)下。在安全模式下运行一段时间后,自动退出。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 那么,系统在安全模式下干什么了? 当集群启动的时候,会首先进入到安全模式。系统在安全模式下,会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是5,那么在dataNode上就应该有5个副本存在,假设只存在3个副本,那么比率就是3/5=0.6。在配置文件hdfs-default.xml中定义了一个最小的副本率,见图7-1 图7-1 我们的副本率0.6明显小于0.999,因此系统会自动的复制副本到其他dataNode,争取是的最小副本率>=0.999。如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多于的3个副本。 安全模式对我们有什么影响哪? 这时,不允许客户端进行任何修改文件的操作,包括上传文件、删除文件、重命名、创建文件夹等操作。比如,创建文件时,在源代码中就有对安全模式的判断,如图7-2 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 图7-2 当我们在安全模式下进行修改文件操作时,会报出如下错误,如图7-3 图7-3 正常情况下,安全模式会运行一段时间自动退出的。只需要我们稍等一会就可以了。到底等多长时间哪,我们可以通过50070端口查看安全模式退出的剩余时间,如图7-4。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 图7-4 虽然不能进行修改文件的操作,但是可以浏览目录结构、查看文件内容的。 我们可以控制是否进入或者退出安全模式吗? 在命令行下是可以控制安全模式的进入、退出和查看的, 命令hadoop fs –safemode get 查看安全模式状态 命令hadoop fs –safemode enter 进入安全模式状态 命令hadoop fs –safemode leave 离开安全模式状态 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 操作如图7-5所示 图7-5 安全模式,是hadoop集群的一种保护机制,在启动时,最好是等待集群自动退出,然后再进行文件操作。 4.3. Hadoop中的心跳机制 主节点和从节点之间的通信是通过心跳机制实现的,如NameNode与DataNode之间,JobTracker和TaskTracker之间。所谓“心跳”是一种形象化描述,指的是持续的按照一定频率在运行,类似于心脏在永无休止的跳动。 图7-6指的是dataNode向NameNode发送心跳的周期是3秒。 图7-6 当长时间没有发送心跳时,NameNode就判断DataNode的连接已经中断,不能继续工作了,就把他定性为”dead node”。NameNode会检查dead node中的副本数据,复制到其他的data node中。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 我们现在来看一下他们之间通过心跳是如何实现通信的。 NameNode与DataNode之间的心跳 通过前面的RPC机制介绍,我们知道NameNode与DataNode直接的通信是通过DataNodeProtocol接口实现的。如图7-7所示。 图7-7 该接口的实现类是NameNode,是由DataNode调用的。下面我们就来分析一下他们之间是如何通信的。 先看一下DataNode中的代码,如图7-8所示。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 图7-8 该方法是DataNode中非常重要的方法,该方法在系统运行时会进入一个死循环中,定期的调用方法访问NameNode,访问周期见第963行代码,这里的变量heatBeatInterval是从配置文件读取的,如图7-9所示,默认值是3000毫秒,也就说循环间隔不低于3秒钟。快过频繁的运行会增加系统的负载。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn 那么,当进入if条件语句时,就会执行第972行的代码。这里就是通过namenode调用其sendHearbeat方法。这里的namenode其实是DataNode获得的NameNode实例的代理对象,如图7-10所示。DataNode与NameNode的通信是通过 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 DataNodeProtocol接口实现的。那么,我们下面重点看一下调用的sendHeartbeat方法,如图7-11。 图7-9 图7-10 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 图7-11 在图7-11中,sendHeartbeat方法的原型定义位于DataNodeProtocol接口的定义中。该传递的第一个形参是包含DataNode注册信息的类,包含DataNode的唯一标示、名称、版本、ipc端口等信息,这些信息可以让NameNode把这个DataNode与其他DataNode区分开。第二、三、四个形参表示当前DataNode上面的容量空间、使用量、剩余量。DataNode把这些信息告诉NameNode后,供NameNode做决策。 还要注意,该方法有返回值,是一个DatanodeCommand数组。也就是说NameNode根据DataNode送来的信息做出决策,并把这些决策封装为DatanodeCommand,发送回DataNode。DataNode拿到NameNode送来的命令后,就要进行处理,见代码第980行。 从上面的分析可以看出,所有的DataNode是通过不断的死循环来向NameNode发送自身状况信息,NameNode在拿到所有DataNode的汇报信息后,综合权衡各种情况,然后向DataNode发回命令。这正是前面分析的RPC机制的客户机与服务器关系的体现。 本文转载于超人Hadoop网络学习社区:http://bbs.superwu.cn JobTracker与TaskTracker之间的心跳 MapReduce的计算机制是通过一个JobTracker和很多的TaskTracker之间的协作完成的。JobTracker作为管理端,是负责接收用户的作业请求,然后分配秩序任务给TaskTracker去执行的。在TaskTracker执行过程中,通过心跳机制会不断的向JobTracker汇报自己的执行情况,供JobTracker做出决策。下面分析一下心跳的过程。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 二者的心跳通信是通过接口InterTrackerProtocol实现的,如图7-12所示。 图7-12 该接口的实现类是JobTracker,是被TaskTracker调用的。下面我们看一下TaskTracker是如何调用的。TaskTracker会调用接口的heartbeat方法,如图7-13所示。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 图7-13 该方法的形参有5个。第一个形参是TaskTrackerStatus最重要,包括TaskTracker的通信端口、最多运行Map任务数、最多运行Reduce任务数、失败任务数等。目的是给JobTracker提供足够的信息做出决策。JobTracker在综合了所有TaskTracker提交的各种状态报告后,会对不同TaskTracker做出决策,通过返回值HeartbeatResponse实现的,该返回值中包含对TaskTracker的各种指示,具体信息如图7-14所示。 图7-14 在图7-14中,TaskTracker发送心跳请求,接收到JobTracker发送回来的HeartbeatResponse对象。该对象中含有新的任务,TaskTracker就需要处理新的任务了。这就是心跳机制主要做的事情。 那么,什么情况下TaskTracker可以接受新任务哪?如图7-15所示。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录 图7-15 从图7-15中可以看到,是否有能力接受新任务要看几个参数的值。分别是maxMapSlots、maxReduceSlots、acceptNewTasks。前两者相当于map任务、reduce任务执行最大限制数。如果超过这个数,那么就不再接受新的任务。默认值,二者都是2。参数acceptNewTasks的取值,取决于本地文件系统(linux系统)的剩余空间。如果本地文件系统还有剩余磁盘空间,足够任务运行,那么改值就是true。否则,就是false。默认情况下,只要磁盘有剩余空间,acceptNewTasks的值就是true。 以上就是对MapReduce的心跳机制的简单分析。通过上面的分析,我们看到只要TaskTracker条件允许,就不断的接受JobTracker分配的任务。这就保证了整个作业的正常运行。 超人Hadoop网络学习社区—http://bbs.superwu.cn|吴超.沉思录

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档