您的位置:首页 > 运维架构 > Linux

分布式集群搭建(hadoop2.6.0+CentOS6.5)

2016-08-07 18:52 645 查看
摘要:之前安装过hadoop1.2.1集群,发现比较老了,后来安装cloudera(hadoop2.6.0),发现集成度比较高,想知道原生的hadoop什么样子,于是着手搭建一个分布式集群(三台),方便与cloudera的安装进行对比,来更加深入学习Hadoop整个生态系统。一开始安装的CentOS7,发现好多命令都变了,时间成本比较高,为了以后少些麻烦,还是果断换回CentOS6.5了,hadoop果断选择2.6.0了。太新的版本需要额外时间来了解,对于加班较多的来说,学习成本太高了。在安装过程,遇到了好多细节问题,真是“纸上得来终觉浅,绝知此事要躬行”!
在实际安装之前,先简单说下VMWare的网络模式:

■ VMNet1:使用的是host-only的链接模式,即虚拟机只能与主机构成内部通信,无法对外网进行访问

■ VMNet0:模式:使用桥接模式,安装VM后,在VM里建立虚拟机 默认 就是该模式。

      场景:如果你只是需要一台虚拟机可以和宿主互通,并可以访问外网,此模式即可。

      描述:安装虚拟机系统后不需要调整网络,物理网络中的 “路由” 所包含的DHCP服务器会自动识别该虚拟机并为其分配IP地址。如果没有路由,可以自己手动在系统分配,原则是和宿主机在同一网段并指向相同的网关即可通信。
■ VMNet8 模式:NAT网络模式

      场景:在宿主机安装多台虚拟机,和宿主组成一个小局域网,宿主机,虚拟机之间都可以互相通信,虚拟机也可访问外网。例如 搭建 hadoop 集群,分布式服务。

1.hadoop集群规划

192.168.10.11 hadoop1 namenode

192.168.10.12 hadoop2 datanode

192.168.10.13 hadoop3 datanode

2.安装三台CentOS虚拟机,配置网络模式为NAT

本人电脑HP笔记本8G内存,三台虚拟机内存都设为1G,启动时若提示“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”,进bios设置选项“处理器虚拟化技术”为enabled。

打开VMWare,文件->新建虚拟机,选择CentOS7系统,依次点击下一步完成添加虚拟机,三台虚拟机名称依次为:centos6.5_1,centos6.5_2,centos6.5_3.

安装完成后,打开VMWare,编辑->虚拟网络编辑器,修改VMnet8的子网IP为192.168.10.0



点击上图中的“NAT设置”,确认网关为192.168.10.2



回到windows,打开网络和共享中心->更改适配器设置->右键VMnet8->属性,确认IPv4为:192.168.10.1



选中虚拟机 -> 右键设置 -> 网络适配器 - 确认为NAT模式->确定    

测试虚拟机网络,使用ifconfig命令查看ip地址,看到如下:



配置ip地址:vi /etc/sysconfig/network-scripts/ifcfg-eth0



注:ONBOOT="yes",这样在重启的时候会自动启动网卡;BOOTPROTO="dhcp"应改为none,否则设置的ip和看到的会不同;DNS1设置为VMnet8的网关,才可以通过主机访问外网;

重启网络服务:service network restart
三台虚拟机依次设置IP为192.168.10.11,192.168.10.12,192.168.10.13
至此虚拟机已可以访问外网,windows主机与虚拟机可以互相ping通,并都可以访问外网。原来虚拟机里的网络这么多设置的,学习了。虽然花了好长时间才整好网络,但还是很有满足感的,“绝知此事要躬行”啊!

3.修改三台节点主机名及与IP映射关系

修改主机名:
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop1

重启网络服务生效

修改主机名和IP的映射关系:
vi /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.11 hadoop1
192.168.10.12 hadoop2
192.168.10.13 hadoop3

注意:这里需要将每台机器的ip及主机名对应关系都写进去.

4.关闭防火墙

#查看防火墙状态
service iptables status
#关闭防火墙
service iptables stop
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off

5.重启Linux

reboot

6.无秘钥认证

(1) ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
(2) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
把暴露出来的公共密钥按顺序导入authorized_keys中保存
(3) chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
注:ssh机制很严谨,对文件的权限要求非常严格,这里需要把.ssh文件夹的权限设置为700(只有所有者有读和写以及执行的权限),authorized_keys的权限设置为600(只有所有者有读和写的权限)
(4) ssh hadoop2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh hadoop3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp authorized_keys hadoop@HDS02:/home/hadoop/.ssh/
scp authorized_keys hadoop@HDS03:/home/hadoop/.ssh/
最终authorized_keys文件要有各个集群服务器的信息
注:前三步在三个节点都执行,第四步在主节点执行。公钥分发完成之后,最后随机选两台服务器,进行无密码登录验证是否异常。各个节点之间的无秘钥认证需要测试通过才能进行下一步

7.NTP时间同步

集群中所有主机必须保持时间同步,如果时间相差较大会引起各种问题。具体思路如下:master节点作为ntp服务器,对所有datanode节点提供时间同步服务。所有datanode节点以master节点为基础同步时间
所有节点安装相关组件:yum install ntp。完成后,配置开机启动:chkconfig ntpd on,检查是否设置成功:chkconfig --list ntpd其中2-5为on状态就代表成功

7.1主节点配置

编辑NTP服务端配置文件ntp.conf,使用local时间作为ntp服务提供给ntp客户端:
# vi /etc/ntp.conf
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

配置文件完成,保存退出,启动服务,执行如下命令:service ntpd start
检查是否成功,用ntpstat命令查看同步状态,出现以下状态代表启动成功:
synchronised to NTP server (xxx.xxx.xxx.xxx) at stratum 4
time correct to within 75 ms
polling server every 1024 s
如果出现异常请等待几分钟,一般等待5-10分钟才能同步

7.2配置ntp客户端

编辑所有datenode节点的NTP服务端配置文件ntp.conf,配置server为主节点的主机名或IP:
# vi /etc/ntp.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool .
# 这里是主节点的主机名或IP
server xxx.xxx.xxx.xxx
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

ok保存退出,启动datanode节点的ntp服务,先手动同步一下主节点,通过ntpstat查询是否同步成功:
# service ntpd start
# ntpdate –u –hadoop1
# ntpstat



注:需要多等待一会儿才可以正常同步时间。

8.安装JDK(三台)

(1)卸载自带openjdk
使用rpm -qa | grep java查询java相关的包,使用rpm -e --nodeps包名卸载
(2)解压jdk包
tar -zxf jdk-7u75-linux-x64.tar.gz –C /opt
(3)环境变量配置
vi/etc/profile
##jdk
export JAVA_HOME=/opt/jdk1.7.0_75
export JRE_HOME=/opt/jdk1.7.0_75/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

#刷新配置
source /etc/profile
(4)JDK版本验证
java -version



#which java 检查java安装目录
#env|grep JAVA_HOME 检查是否配置JAVA_HOME
这里遇到一个小问题,我是在window用SecureCRT执行的source,在虚拟机看java版本提示没有,再次source可以看到了:这个文件一般是linux系统中存在,是在开机加载系统时或登录时执行的一个配置文件,其主要功能类似初始化一些环境变量。

9.安装hadoop(三台)

先上传hadoop的安装包到hadoop1上去/soft,使用 tar -zxf hadoop-2.6.0.tar.gz -C /opt解压. 注意:hadoop2.x的配置文件$HADOOP_HOME/etc/hadoop,这里即:/opt/hadoop-2.6.0/etc/hadoop
每台机器服务器都要配置,且都是一样的,配置完一台其他的只需要拷贝,每台机器上的core-site.xml和mapred-site.xml都是配master服务器的hostname.

9.1配置hadoop

第一个:hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/opt/jdk1.7.0_75

第二个:core-site.xml
<!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NameNode)的地址 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop1:9000</value>
</property>

<property>
  <name>io.file.buffer.size</name>
  <value>131072</value>
  <description>Size of read/write buffer used inSequenceFiles.</description>
</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/hadoop-2.6.0/tmp</value>
</property>
注:hadoop访问文件的IO操作都需要通过代码库。因此,在很多情况下,io.file.buffer.size都被用来设置缓存的大小。不论是对硬盘或者是网络操作来讲,较大的缓存都可以提供更高的数据传输,但这也就意味着更大的内存消耗和延迟。这个参数要设置为系统页面大小的倍数,以byte为单位,默认值是4KB,一般情况下,可以设置为64KB(65536byte)。
注:hadoop.tmp.dir 是hadoop文件系统依赖的基础配置,很多路径都依赖它。如果hdfs-site.xml中不配置namenode和datanode的存放位置,默认就放在这个路径中。

第三个:hdfs-site.xml
创建目录:
[root@hadoop1 hadoop-2.6.0]# mkdir -p dfs/name
[root@hadoop1 hadoop-2.6.0]# mkdir -p dfs/data
[root@hadoop1 hadoop-2.6.0]# mkdir -p dfs/namesecondary

修改配置文件
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>hadoop1:50090</value>
  <description>The secondary namenode http server address andport.</description>
</property>

<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:///opt/hadoop-2.6.0/dfs/name</value>
  <description>Path on the local filesystem where the NameNodestores the namespace and transactions logs persistently.</description>
</property>

<property>
  <name>dfs.datanode.data.dir</name>
  <value>file:///opt/hadoop-2.6.0/dfs/data</value>
  <description>Comma separated list of paths on the local filesystemof a DataNode where it should store its blocks.</description>
</property>

<property>
  <name>dfs.namenode.checkpoint.dir</name>
  <value>file:///opt/hadoop-2.6.0/dfs/namesecondary</value>
  <description>Determines where on the local filesystem the DFSsecondary name node should store the temporary images to merge. If this is acomma-delimited list of directories then the image is replicated in all of thedirectories for redundancy.</description>
</property>

<!-- 指定HDFS副本的数量 -->
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>

<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>

注: 属性“dfs.namenode.name.dir”表示NameNode存储命名空间和操作日志相关的元数据信息的本地文件系统目录,该项默认本地路径为”/tmp/hadoop-{username}/dfs/name”;
属性”dfs.datanode.data.dir“表示DataNode节点存储HDFS文件的本地文件系统目录,由”file://本地目录”组成,该项默认本地路径为”/tmp/hadoop-{username}/dfs/data”。
属性“dfs.namenode.secondary.http-address”表示SecondNameNode主机及端口号(如果无需额外指定SecondNameNode角色,可以不进行此项配置);

第四个:mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop1:10020</value>
  <description>MapReduce JobHistoryServer IPC host:port</description>
</property>

<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop1:19888</value>
  <description>MapReduce JobHistoryServer Web UI host:port</description>
</property>
注:属性“mapreduce.framework.name”表示执行mapreduce任务所使用的运行框架,默认为local,需要将其改为”yarn”
注:Hadoop自带了一个历史服务器,可以查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,可以通过下面的命令来启动Hadoop历史服务器$ sbin/mr-jobhistory-daemon.sh start historyserver。这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况。
注:Hadoop2.x中没有jobtracker、tasktracker,改为现在的ResourceManager、NodeManger
第五个:yarn-site.xml
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop1</value>
</property>
<!-- reducer获取数据的方式 中间数据调度使用的机制 -->
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
注:yarn.nodemanager.aux-services,NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序。

[root@hadoop1 opt]# scp -r hadoop-2.6.0/ root@hadoop2:/opt/
[root@hadoop1 opt]# scp -r hadoop-2.6.0/ root@hadoop3:/opt/
注:这里将配置完的hadoop整个文件复制到hadoop2和hadoop3的时候,用的是cp -r,复制完成后发现hadoop2和hadoop3的文件大小比hadoop大1M,应该一样才对啊,一级一级目录找吧,肯定有不一样的。果然,native的大小不一样,这里有个软链接:当用cp命令copy一个软链接时,copy的是软链接所对应的内容,而不是它本身。要直接cp软链接就需要加-d参数。

9.2配置Slaves文件

只需要namenode节点机,这里的HDM01既做namenode也兼datanode,一般情况namenode要求独立机器,namenode不兼datanode
vi /opt/etc/hadoop/slaves,配置如下内容:
hadoop2
hadoop3

9.3将hadoop添加到环境变量

vim /etc/proflie
export HADOOP_HOME=/opt/hadoop-2.6.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile

9.4格式化namenode

hdfs namenode -format
报警告:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
因为官方提供的lib目录中.so文件是在32位系统下编译的,如果是64位系统,需要自己下载源码在64位上重新编译。下载hadoop-native-64-2.6.0.tar解压替换native文件夹内容。
[root@hadoop1 soft]# tar -xvf hadoop-native-64-2.6.0.tar -C /opt/hadoop-2.6.0/lib/native/

9.5启动hadoop

sbin/start-all.sh



提示已过时,执行stop-all.sh停止。重新启动:
先启动HDFS:sbin/start-dfs.sh
再启动YARN: sbin/start-yarn.sh





9.6验证是否启动成功 使用jps命令验证



查看集群状态:
[root@hadoop1 bin]# hdfs dfsadmin -report


http://192.168.1.101:50070 (HDFS管理界面)


http://192.168.1.101:8088 (MR管理界面)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: