目 录
1 绪论 1
1.1 项目背景 1
1.1.1 Hadoop的发展 1
1.1.2 兴起的Spark 2
2 Hadoop云计算环境的搭建 3
2.1 准备工作 3
2.2 环境说明 3
2.3 网络环境配置 4
2.4 SSH无密码验证登陆 5
2.5 Master上安装JDK 6
2.6 Master安装Hadoop 6
2.7 启动Hadoop集群 11
2.8 常见的问题 FAQ 12
在介绍Spark之前,我们先来介绍一下Hadoop的存在解决了大数据的可靠存储和处理,其独特的优点在于可以通过廉价的集群节点让计算性能得以线性上升,它主要有两个重要的部分:HDFS和MapReduce。HDFS是通过普通的PC机组成的集群上提供可靠的文件存储,通过将块保存多个副本的办法解决服务器或者硬盘坏掉的问题。MapReduce是通过简单的Mapper和Reducer的抽象提供一个编程模型,复杂的数据可以通过Mapper和Reducer的抽象处理,经过Map到Reduce处理的结果集放到集群上执行,得到处理结果。而其中的Shuffle是一个非常重要的过程,它是集群分布式处理数据的体现。
图1.1.1(图片来源:Hadoop Definitive Guide By Tom White)
上图即是一个广义的Shuffle的体现即整个Map到Reduce的过程
我们通过上图也可以看到Hadoop的局限和不足
(1) 抽象层次低,只有两个操作,Map和Reduce,表达力欠缺,导致结果的代码比较冗长,而且难以上手。中间结果放到HDFS文件系统中,必然会有较多的I/O操作,易造成高延迟。
(2)对于迭代式数据处理性能较差,适用于Batch数据处理,对于交互式的数据处理,实时数据的处理支持不够。
1.Apache Spark是一个新型的大数据处理引擎,主要的特点是提供了一个集群的分布式内存抽象,以支持需要的工作集的应用。而这个抽象便是RDD,RDD就是一个不可变的带分区的记录集合,RDD提供了RDD上的两类操作:Transformation和Action,Transformation是用来定义一个新的RDD,而Action则是返回一个结果集合,下图为Spark的整体架构图:
图1.1.2 Spark的整体架构图
2.Spark 解决了Hadoop的哪些问题了?
(1) 基于RDD的抽象,实数据处理逻辑的代码非常简短,易上手。
(2) 对于Hadoop只提供的两个操作而言,Spark提供了很多转换和动作,很多基本操作join,GroupBy已经在RDD转换和动作中实现。
(3) 一个Job可以包含RDD的多个转换操作,在调度是可以生成多个阶段(Stage),而且如果多个map操作的RDD的分区不变,是可以放在同一个Task中进行的。
(4) 中间结果会放到内存中,内存放不下时会写入到本地磁盘,而不是HDFS,由于HDFS有本身的数据分配策略,由不同的node处理,已经决定数据的位置,就没有必要在存放到HDFS中,因为写入HDFS是网络操作,操作网络流必然有握手机制,这样就会增加了延迟。
(5)通过在内存中缓存数据,提高迭代式计算的性能。
Hadoop的缺陷有很多,最大的缺陷是Map+Reduce的模型,这个模型不适合描述复杂的数据处理过程。如果说Mapreduce是公认的分布式数据处理的低层次抽象,类似逻辑电路中的与门,或门和非门,那么Spark的RDD就是分布式大数据处理得高层次抽象,类似逻辑电路中的编码器或者译码器。
(1)Linux版本:CentOS-6.7-x86_64-bin-DVD1.iso
(2)JDK版本安装包:jdk-7u79-linux-x64.tar
(3)Hadoop版本安装包:hadoop-2.6.0.tar
(4)Scala版本安装包:scala-2.10.4.tgz
(5)Spark版本安装包:spark-1.5.2-bin-hadoop2.6.tgz
这里还要介绍两款远程操作软件:FileZille+Putty,大家在自己在做开发时,一般不建议在虚拟机上执行命令,因为那样不方便。而下面很多的文上传到Linux时用FileZille,很方便而不需要用到U盘,而Putty可以远程操作Linux。
集群包括3个节点,1个Master,2个Slave,节点之间局域网连接,可以相互ping通,(注意:介于学校的锐捷客户端不允许一个用户有多个网口地址,作者在此建议,在虚拟机搭建环境时,将网络设置成Host-only模式,若不然,可能会被锐捷客户端禁止上网。在进行虚拟机配置的时候,请务必将Linux的swap的空间设置2G大小或者尽量大一些。原因以及解决方法请见后面FAQ。)
机器名称 |
IP地址 |
hadoop001 |
192.168.10.20 |
hadoop002 |
192.168.10.21 |
hadoop003 |
192.168.10.22 |
上图的四个节点均是CentOS6.0系统,为了不使后面文件权限而导致复杂的文件授权读写操作,下面一律采用root用户,其中Hadoop001是一个Mater(NameNode)节点,而Hadoop002以及Hadoop003各为一个DataNode节点。
(1)查看当前的机器名
用下面的命令显示机器的名称,如果跟上图规划不同,请修改。
命令:hostname
这一步操作hadoop002和hadoop003,都要进行操作。
(2)关闭三台机器的防火墙
命令:service iptables stop
这一步在每一台机器上都要执行,不然在进行后面的各项操作时,可能会遇到障碍,比如可能会遇到集群安全模式开启的情况以及无法访问端口WEB界面的情况。
(3)配置文件hosts文件
这一步操作是必须要进行的,“/etc/hosts/”这个文件用来配置主机将用的DNS服务器信息,当用户进行网络连接时,首先查找该文件,寻找对应的主机名对应的IP地址。
命令:vi /etc/hosts在配置文件后面添加下面的信息:
192.168.10.20 hadoop001
192.168.10.21 hadoop002
192.168.10.22 hadoop003
这一步操作hadoop002和hadoop003,都要进行操作。
(4)下载所需软件
JDK下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads
JDK版本:jdk-7u79-linux-x64.tar.gz
Hadoop下载地址:http://archive.apache.org/dist/hadoop/common/
Hadoop版本:hadoop-2.6.0.tar.gz
将上述下载的软件分别放到hadoop001文件/usr/java和/usr/hadoop下。
Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后了,NameNode是通过SSH(Secure Shell)来启动和停止各个DateNode上的各种守护进程的。这就必须在节点之间执行指令的时候不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataNode进程,同样的,DataNode也是使用SSH无密码登录到NameNode。
(1)Master机器上生成密码对
在Master节点上执行以下命令:ssh-keygen -t rsa
接着会提示保存路径,我们直接回车采用默认保存路径。
命令:cd .ssh 查看生成密钥对文件:id_rsa和id_rsa.pub
然后将Master节点上做如下配置,将id_rsa.pub追加到授权的key文件中去,
命令:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
这一步完成后,执行测试命令:ssh hadoop001 可以看到免密码登录到hadoop001了。
上述操作4步均要在hadoop002和hadoop003上执行。
(2)配置Master和Slave无密码相互登陆
hadoop001免密码hadoop002,命令:ssh-copy-id -i hadoop002
然后免密码登录hadoop002,命令:ssh hadoop002
同样配置hadoop003免密码登录到hadoop002,命令:ssh-copy-id -i hadoop002
hadoop002免密码登录到hadoop001和hadoop003,下面的命令在hadoop002上执行。
命令:scp /root/.ssh/authorized_keys hadoop001:/root/.ssh/
scp /root/.ssh/authorized_keys hadoop003:/root/.ssh/
上述命令在执行之后,这时三台机器就可以免密码相互登录,测试命令:ssh+主机名,在每一台机器上测试是否免密码其他两台机器上,这一步必须测试,若有问题必须解决,若不解决,则在最后格式化系统的时候,就会出现问题。
解压JDK安装包并修改生成文件权限:
解压命令:tar -zxvf jdk-7u79-linux-x64.tar.gz
并用下面的命令修改权限:
chmod +x jdk-7u79-linux-x64.tar.gz
配置环境变量:vi /etc/profile
在“/etc/profile”文件的尾部添加以下内容:
依次按键“ESC + :+ wq”保存退出,并使配置立即生效:source /etc/profile
验证安装成功,用下面的命令:java -version
上述的安装JDK环境要在三台机器上都要执行,并使配置生效。
解压Hadoop安装包并修改生成文件权限:
解压命令:tar -zxvf hadoop-2.6.0.tar.gz
在三台虚拟机上创建下列文件如下图:
命令 :mkdir /home/hadoop/hadoop/tmp
mkdir /home/hadoop/hadoop/dfs
mkdir /home/hadoop/hadoop/dfs/data
mkdir /home/hadoop/hadoop/dfs /name
所建立的文件如下表示:
上图所建立的文件,即使现在不建立,我们后面在配置文件的时候,也会自动建立,然后配置Hadoop的路径,将其/bin添加到路径,命令:vi /etc/profile,在文件尾部添加:
接下来配置hadoop的文件,一定要用下面的绝对路径才能进入/etc/hadoop文件下,若是使用相对路径,则无法探测到下列文件。
命令: cd /usr/hadoop/hadoop-2.6.0/etc/hadoop/
查看里面的文件:ll
其中要修改以下四个文件:hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-env.sh,
yarn-site.xml ,yarn-env.sh在解压hadoop版本的安装包之后,文件里面是不存在mapred-site.xml,只存在模版mapred-site.xml.template使用下面命令生成:
命令:cp mapred-site.xml.template mapred-site.xml
(1)配置hadoop-env.sh:
命令:vi hadoop-env.sh 在该文件后面添加下面配置内容:
export JAVA_HOME=/usr/java/jdk1.7.0_79
(2)配置yarn-env.sh:
命令:vi yarn-env.sh 在该文件参数里面配置一下内容,若已经生成则不再配置:
export JAVA_HOME=/usr/java/jdk1.7.0_79
(3)配置slaves
命令:vi slaves 在文件参数里面将两个子节点的主机名写入:
hadoop002
hadoop003
(4)配置文件core-site.xml
修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。
命令:vi core-site.xml 在文件参数里面添加以下内容:
如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录:tmp/hadoop,而这个目录在每次重启之后都会被系统删除掉,那么又得重新执行format才行,否则会出错,若重新格式化,则会造成slave节点无法找到的问题。io.file.buffer.size的默认的大小是4M,HDFS文件系统的地址是:hdfs://hadoop001:9000
(5)配置文件hdfs-site.xml
修改Hadoop中HDFS的配置,命令:vi hdfs-site.xml给这个文件添加以下信息:
这是设置secondary namenode的地址和端口,副本数设置为1。
(6)配置文件mapred-site.xml
命令:vi mapred-site.xml 在文件参数里面配置以下参数:
上面配置的MapReduce的基本参数的,配置的是Jobhistory的端口和地址。以及Jobhistory查看的端口和地址。
(7)配置文件yarn-site.xml
命令:vi yarn-site.xml
这个命令是配置yarn的核心文件,在参数配置里面配置下面的参数:
这个文件,我们必须配置,但我们在后面不一定用到,当然如果搭建的是以yarn为基础文件系统的Spark的集群环境,这个文件则必须配置。我们只用到了HDFS文件系统,可以进行最小化配置:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.10.20:9001</value>
</property>
</configuration>
若是在后面在想要连接eclipse进行应用开发时,注意上面一定不要写localhost,一定要填写IP地址。
(8)将配置的文件发配给hadoop002和hadoop003两个节点
将hadoop001上的文件复制到其他两个节点上:
命令:scp -r /usr/hadoop hadoop002:/usr/hadoop
scp -r /usr/hadoop hadoop003:/usr/hadoop
scp /etc/profile hadoop002:/etc
scp /etc/profile hadoop003:/etc
然后在hadoop002和hadoop003执行命令:source /etc/profile使得配置生效。
(1)hadoop格式化
命令:hadoop namenode -format 最好初始化一次,若多次初始化,即使格式化成功,但是主节点将无法启动datanode.原因及解决方案,请见后面的FAQ。
(2)启动hadoop集群
命令:sbin/start-dfs.sh 我们不需要启动全部集群功能(sbin/start-all.sh)
(3)查看检测
我们依次在三台机上使用命令:jps
当jps后看主节点上出现NameNode,而从节点上出现DataNode时,表明集群都已经启动。我们查看集群的配置与情况,执行命令:bin/hdfs dfsadmin -report ,这个命令是查看其群的信息的命令。
上面显示的只是一部分信息,完整的信息包括三台机器的信息。也可以从以下web界面进行访问:
http://192.168.10.20:50070/dfshealth.jsp
(1) hadoop多次格式化导致集群无法正常启动
原因:多次格式化之后,会造成主节点的集群的ID号与从节点的所保存的集群的ID号不符合造成的,从节点所保留依旧是之前的集群ID号以及之前的主节点ID号,这时就会导致无法启动DataNode。当然要是搭建是一台机器的伪分布的话,则影响不大,本人之前配置过伪分布测试过,多次格式化没问题。
第一种解决方案:
这里有两种在之前建立的Master上/home/hadoop/hadoop/dfs/name下,在格式化之后会有生成一系列文件,使用命令: cd current/VERSION/,用里面的clusterID,修改在Slave上/home/hadoop/hadoop/hadoop/dfs/name/data/current/VERSION文件里面的clusterID ,然后重新启动集群。
第二种解决方案:
1.先删除“/usr/hadoop/hadoop-2.6.0/tmp”
命令:rm -rf /usr/hadoop/hadoop-2.6.0/tmp
2.创建“/usr/hadoop/hadoop-2.6.0/tmp”
命令:mkdir /usr/hadoop/hadoop-2.6.0/tmp
3.删除“/tmp”下以“hadoop”开头的文件
命令:rm -rf /tmp/hadoop*
4.重新格式化
命令: bin/hdfs namenode format
5 重新启动集群
命令:sbin/start-all.sh
以上所做的原因:每次namenode format 会重新创建一个namenodeID,而tmp/dfs/data下包含了上次格式化的ID,namenode format 清空了namenode的数据,但是没有清空datanode下的数据,导致失败,所以清空tmp里面的记录数据。
(2)Swap分区的若是过小,造成的Java虚拟机内存不足
原因:Scala程序的运行是以Java虚拟机为基础的,至于为什么本文章建议使用2G的Swap的空间大小了,因为分配给虚拟机的内存大小是1G的,通常情况下建议Swap应该是为物理内存的2~2.5倍(由于不知道这个建议,在后面运行程序的时候,遇到了很多问题,看了日志提示:JVM存储空间不够,而这对Hadoop程序就没有影响,但是对于Spark来说,就影响较大了,如果运行的数据稍微大一些,就会报错了。),而且Spark是基于内存即算的,所以Swap更应该大一些。
解决方案:两种方案一是创建swap分区,一种创建Swap文件,本文采取是创建swap文件的方法。执行dd命令,新增一个1000MB的Swap文件
执行命令:dd if=/dev/zero of=/swapfile bs=10M count=100
然后执行:mkswap /swapfile
执行命令:swapon /swapfile
最后执行:vi /etc/fstab
添加下面的内容:/swapfile swap swap defaults 0 0
(3)其他的小问题
以下问题都是作者在整个过程中遇到一些小问题,每个问题都花了不少的时间解决,在此也记录一下:
1.在下载上述所需要的软件时,一定使用专用的下载器,比如:迅雷,在此不建议用浏览器内站功能下载,由于网络的原因,可能造成下载的tar文件不全,就像我之前遇到的一个情况:jdk解压之后,没有bin文件,导致我的jdk一直都没有安装成功。
如何测试自己下载的文件是完整的,这里有个方法:要下载运行到Linux的软件时,先在自己的Windows电脑上解压一下,看看是否完整,若不完整,则无法解压,但是这个方法无法在Linux测试,因为不管文件是否完整,都不会报错。
2.在文件参数进行配置的时候,一定要注意书写,字母大小写的区分,半角全角,由于配置文件的特殊性,多一个空格就可能导致最后集群格式化失败。
3.若是修改文件后,一是注意要记得保存并使得配置生效,若最后配置未生效,那么一定记得修改文件权限,使得当前的用户具有读写的权限,然后再使得配置生效。