你好,游客 登录
背景:
阅读新闻

hadoop2.6.0的环境搭建

[日期:2016-06-30] 来源:极客头条  作者: [字体: ]

目  录

Hadoop

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

绪论

1.1  项目背景

1.1.1  Hadoop 的发展

在介绍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.1.2  兴起的 Spark

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 就是分布式大数据处理得高层次抽象,类似逻辑电路中的编码器或者译码器。

Hadoop 云计算环境的搭建

2.1  准备工作

(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 。

2.2  环境说明

集群包括 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 节点。

2.3  网络环境配置

( 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 版本 : 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 下。

2.4  SSH 无密码验证登陆

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+ 主机名,在每一台机器上测试是否免密码其他两台机器上,这一步必须测试,若有问题必须解决,若不解决,则在最后格式化系统的时候,就会出现问题。

2.5  Master 上安装 JDK

解压 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 环境要在三台机器上都要执行,并使配置生效。

2.6  Master 安装 Hadoop

解压 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 使得配置生效。

2.7  启动 Hadoop 集群

( 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

http://192.168.10.20:50070/dfshealth.jsp

2.8  常见的问题 FAQ

导致集群无法正常启动

原因:多次格式化之后,会造成主节点的集群的 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.若是修改文件后,一是注意要记得保存并使得配置生效,若最后配置未生效,那么一定记得修改文件权限,使得当前的用户具有读写的权限,然后再使得配置生效。





收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款