一、Hadoop是什么?
从狭义来说,Hadoop指的是Apache下的一款开源框架,目前常用的是Hadoop2版本。
Hadoop2主要包含以下3个组件:
与Hadoop1区别在于1版本把资源管理和海量数据计算的任务都丢给MapReduce,即Hadoop1只有一个HDFS和MapReduce组成。
- HDFS:一个Hadoop的分布式文件系统,支持NameNode横向扩展,解决海量数据的存储。
- YARN:一个负责作业调度和集群资源管理的框架,解决资源任务调度。
- MapReduce:一个分布式运算编程框架,运行在YARN上,用来解决海量数据的计算。
从广义来说,Hadoop类似于Spring,已经形成了一个Hadoop生态圈,许多技术都和Hadoop进行集成使用起来。
总结:Hadoop的应用场景并不会跟某些行业或某些业务挂钩在一起,它只是一款海量数据分析处理的软件平台,提供HDFS、MapReduce、YARN这些模块来对外提供帮助。
二、Hadoop2集群理论
搭建我使用的版本是:Hadoop2.6.4
Hadoop集群一般指的是HDFS集群和YARN集群,两者在逻辑上分离,物理上在一起,如下图:
前两种主要用于调试,属于单机部署,后面一种才是生产环境部署。
- Standalone mode(独立模式):仅在一个机器运行一个java进程。
- Pseudo-Distributed(伪分布式模式):仅在一个机器上HDFS的NameNode和DataNode、YARN的ResourceManager和NodeManager,但分别启动单独的java进程。
- Cluster mode(群集模式):会使用N台主机组成一个Hadoop集群,这种部署方式下,主节点和从节点会公开部署在不同的机器上。
三、实际操作搭建hadoop集群
- 1、在VMware14虚拟机中安装centos7操作系统,并命名为master,我全程按这个教程装的,很详细。
附带安装教程:https://blog.csdn.net/babyxue/article/details/80970526。 - 2、安装好虚拟机系统之后,通过xshell这个软件来在windows系统上远程连接到虚拟机的linux系统进行操作更加方便,并且通过xftp这个软件来把jdk和hadoop上传到linux系统中,很实用这2款软件,服务器必备利器,学生可以通过邮箱注册进行免费下载。怎么上传jdk和hadoop到服务器上去我就不讲述了,自行百度,上传之后就是在服务器安装jdk和hadoop,这个也自行百度,网上一大把。
- 3、
注意:以下操作都是基于root用户来进行的,否则你可能会因为权限不够而无法修改配置文件。
配置ip地址,敲命令vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改指定文件配置,复制下面的内容进去替换掉原来的内容,#后面是注释可以删掉
TYPE="Ethernet" # 网络类型为以太网
BOOTPROTO="static" # 手动分配ip
NAME="ens33" # 网卡设备名,设备名一定要跟文件名一致
DEVICE="ens33" # 网卡设备名,设备名一定要跟文件名一致
ONBOOT="yes" # 该网卡是否随网络服务启动
IPADDR="10.14.28.100" # 该网卡ip地址就是你要配置的固定IP,如果你要用xshell等工具连接,220这个网段最好和你自己的电脑网段一致,否则有可能用xshell连接失败
GATEWAY="10.14.28.2" # 网关
NETMASK="255.255.255.0" # 子网掩码
DNS1="8.8.8.8" # DNS,8.8.8.8为Google提供的免费DNS服务器的IP地址
接着配置网络工作,敲命令vi /etc/sysconfig/network
进行配置
NETWORKING=yes # 网络是否工作,此处一定不能为no
配置公共DNS服务(可选),在/etc/resolv.conf
文件里增加如下配置
nameserver 8.8.8.8
最后关闭防火墙和重启网络服务
systemctl stop firewalld # 临时关闭防火墙
systemctl disable firewalld # 禁止开机启动
service network restart #重启网络服务
克隆步骤1新建的虚拟机master,以此克隆出3个新的虚拟机,并分别命名为slave1、slave2、slave3,克隆操作:在VMware中,把当前新建好的虚拟机关闭掉,因为在开启状态是不能克隆的,然后右键虚拟机-->选择管理-->克隆-->完成克隆副本-->选择保存的位置。
我们要完成的集群是这样的架构。
和上面一样的配置,只是修改了主机ip而已,不固定,在同一个网段就好(即网络号相同),然后重启网络服务,命令和上面一样就省略掉了。
然后,修改主机名,敲命令
hostnamectl set-hostname slave1(你要的主机名字)
,之后敲命令
vi /etc/hosts
修改hosts文件,将名字和IP建立联系,然后重启reboot命令。最后这是关键,4台虚拟机都同样的操作都修改好后,互相ping一下看看通不通,比如在windows使用cmd命令行ping4台虚拟机试试,4台虚拟机互相ping下或者ping下windows。最后4台虚拟机就如下图配置好了。
-
4、之后使用xshell这个软件远程连接4台虚拟机,步骤如下:
- 5、上图的master相当于namenode,存储着文件名,记录文件存放的位置,其他3台slave相当于datanode,存储着真实的数据。外部访问都是通过namenode来间接访问datanode,namenode相当于管理者,datanode相当于数据提供者。
- 6、cd进入到
/usr/local/hadoop/etc/hadoop
目录下,显示所有文件会看到有个core-site.xml
文件,这个文件是告诉master在哪里,slave被谁管理。修改此文件,在里面的configuration标签里写下述内容,4台虚拟机都要写:
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
- 7、经过上面的文件配置,就可以启动hadoop了,namenode与datanode默认是装在一起的,所以得分开输入命令分别启动。
先格式化下namenode,敲命令hdfs namenode -format
,然后4台虚拟机都配置下主机名与主机ip的关联,敲命令vi /etc/hosts
编辑一个文件来配置主机。输入以下内容
10.14.28.100 master
10.14.28.101 slave1
10.14.28.102 slave2
10.14.28.103 slave3
然后就可以敲命令hadoop-daemon.sh start namenode
单独启动namenode,再输入jps
命令查看java进程,可看看namenode和datanode进程是否启动。和敲命令hadoop-daemon.sh start datanode
单独启动datanode。如下图:(PS:如果想要启动所有节点的话,就可以cd /usr/local/hadoop/sbin
目录下,使用start-all.sh
命令启动全部,相反关闭全部的话就是stop-all.sh
命令。)
上图解释:hadoop在接受一个文件的时候,当文件超过128M的时候,会自动进行分块,正如上面的b1、b2这种,然后还会对文件进行备份处理,默认分成3份,正如上面的slave1、slave2、slave3机器都存放在b1这样的数据。上面的图其实画得不标准,应该是有master机器启动这namenode进程,还有slave1、slave2、slave3三台机器各启动这datanode进程,master机器管理着3台slave机器。体现出了hadoop是可以横向水平扩展的(比如不断得增加datanode存储数据),还有安全稳定性,这依靠着冗余存储,某台机器宕机了不影响对外提供服务(比如slave1宕机了,数据在slave2照样可以找到,另外namenode宕机了还有the second namenode这个节点来替代namenode)
四、在集群实现ssh免密登录
背景:完成了上述的集群搭建,想要在master机器上想远程登录到slave1机器上,则输入命令
ssh slave1
,之后就需要输入密码,如下图。但这比较繁琐,所以我们可以配置下完成集群机器间的免密登录。关于免密登录的原理:就是生成私钥和公钥,这2个是成对存在的,当我们把登录的信息用私钥加密,然后把公钥传递给其他机器,这样远程登录到其他机器时会对登录信息用公钥进行解密,只有对应的公钥和私钥才能完成加解密,所以这样就不需要每次都密码验证了。
步骤:输入命令ls -la
可查看当前目录下的所有文件和文件夹,包括隐藏文件夹,于是我发现我master机器上没有.ssh文件夹,而slave1、slave2、slave3机器上都有.ssh文件夹,所以我怀疑我的master是没有通过RSA加密算生成了密钥,包括私钥和公钥。
输入ssh-keygen -t rsa
这条命令后,连续按3次回车即可通过RSA加密算生成了密钥,包括私钥和公钥。接着输入ssh-copy-id slave1
命令然后根据提示输入密码后就把公钥传给了slave1机器。对应还有输入ssh-copy-id slave2、ssh-copy-id slave3
命令。如下图结果:
exit
。
背景:一个个地登录比较麻烦,我们可不可以直接在master机器上对集群的所有datanode节点进行统一的启动关闭管理?于是就有了下面的操作。配置统一集群节点管理
vi slave
命令修改文件,管理着多少台slave机器就输入多少台
slave1
slave2
slave3
......
之后输入start-dfs.sh
命令即可启动namenode和datanode节点。如下操作:
五、期间排错
- 1、输入命令
hdfs dfsadmin -report | more
来报告下集群机器的情况,如果出现下图错误1,则要检查下fs.default.name是否配置了。具体操作是先cd /usr/local/hadoop/etc/hadoop
目录下,再vi core-site.xml
修改配置,加上上面的第6点,之后:wq
保存退出即可。 - 2、再次输入命令
hdfs dfsadmin -report | more
报告下,出现下图错误2,则要第一时间反应过来是不是服务器主机名没有和ip地址映射上,于是输入命令vi /etc/hosts
修改配置,加上上面的第7点,之后:wq
保存退出即可。 - 3、再次输入命令
hdfs dfsadmin -report | more
报告下,出现下图错误3,这个问题我找了好久,最后在一篇博客中发现有大神评论说是本地用户administrator(本机windows用户)没有权限引起去远程操作hadoop系统,所以得在hadoop的hdfs-site.xml
配置文件配置取消hadoop hdfs用户权限检查。先cd /usr/local/hadoop/etc/hadoop
目录下,再vi hdfs-site.xml
修改配置文件,在<configuration>标签组内加入下面代码
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
- 4、再次输入命令
hdfs dfsadmin -report | more
报告下,这次成功了,但是namenode没有管理到datanode节点,如下图:netstat -ntlp
命令,查看hadoop集群对外提供的端口号。一般是50070,之后就可以在浏览器地址栏中输入集群主机名+端口号进行访问了。比如http://10.14.28.100:50070
,之后web界面是这样的。cd /usr/local/hadoop/etc/hadoop
目录下,再vi hdfs-site.xml
修改配置文件,在<configuration>标签组内加入以下代码即可。不过切记,修改完配置文件,要关闭namenode和datanode节点服务,再重新开启才可以生效,我修改完没重启在这里栽了跟头还好所耗时间不长就被我意识到了),感谢~
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
- 5、同一集群节点管理遇错,拒绝连接,解决方案下面这篇文章可能有效。
https://www.imooc.com/article/12083 - 6、遇到下图错误4,就首先考虑下Namenode和Datanode的clusterID相同,这个clusterID在hadoop启动目录下的
current
文件夹的VERSION文件中,查看下是否和datanode机器上匹配,因为格式化一次namenode的话这个clusterID可能会变化。
我的做法是:在namenode机器上进入到/var/hadoop/dfs/name/current/
查看VERSION文件的clusterID,然后把这个clusterID负责到所有datanode机器上的/var/hadoop/dfs/data/current
的VERSION文件中替换掉里面的clusterID,确保namenode机器和datanode机器的clusterID是一致的。
参考文章:https://www.jianshu.com/p/079c341e424a?utm_campaign
https://blog.csdn.net/u013310025/article/details/52796233