hadoop平台搭建入门

2018-06-27  本文已影响0人  zxcasongs

学习hadoop平台搭建也有一段时间了,期间也遇到很多问题,为了解决这些问题查了很多资料,浪费不少时间,今天写下这篇博客,为了帮助初学者,更快解决遇到的问题。

首先,我们要搭建的是完全分布式,mysql作为hive元数据库,spark完全分布式,如果有需要会更新hadoop HA,这个等下次再说,这次需要用到的软件有 hadoop-2.7.5.tar,jdk-8u151-linux-x64.tar,apache-hive-2.1.1-bin.tar,mysql-connector-java-6.0.6.tar,spark-2.0.2-bin-hadoop2.7,我会把这些软件放到百度云里分享给大家,大家可以到文章结尾查找。

现在开始部署环境我用到的系统是ubuntu-16.04.3-desktop-amd64,我也会放在最后的百度云里,这次会用到三台虚拟机分别为:

master 192.168.0.1 namenode secondarynamenode  resourcemanager hive 

slave1 192.168.0.2 datanode nodemanager worker

slave2 192.168.0.3 datanode nodemanager worker

修改主机名的命令为:sudo vi /etc/hosts,将上面内容粘贴进去即可,可以用scp /etc/hosts x@slave1:/etc 发送到其他的电脑,但要注意修改hosts文件需要有权限,如果你的用户没有权限,可以自己一台一台的用sudo vi /etc/hosts修改。

修改完主机名之后需要重启才能生效,重启之后就要给虚拟机上传软件了,如果你用的crt连接虚拟机的话,可以用rz上传文件,如果没有安装,可以用 sudo apt install lrzsz 安装, 如果没有crt,也可以用ftp上传,我用的是FlashFTP,这些软件一会也会分享给大家。

上传完之后,开始解压这些软件,用到的命令是 tar zxvf XXX -C ~ ,这里我喜欢直接解压到家目录里,~

代表家目录。

XXX:为文件名

这是tar命令常用到的参数:

-z:有gzip属性的  gz

-j:有bz2属性的   bz2

-J :有xz属性的   xz

-v:显示所有过程

-c: 建立压缩档案

-x:解压

-C 指定输出路径

解压完要修改环境变量这是我的环境变量命令是:sudo vi /etc/profile,按G到最后一行,添加你的环境变量,因为我文件都解压到root的家目录里所以HOOM都在root里,修改完同样用命令 scp /etc/profile X@slavex 传给别的虚拟机。

查看java的环境变量有没有设置好可以用命令java查看,如果设置好会出现:

下面开始修改hadoop文件,进入到hadoop目录下,hadoop的配置文件为etc/hadoop,进入会看到很多配置文件,我们需要配置的只有5个分别为 core-site.xml,haoop-env.sh,hdfs-site.xml,mapred-site.xml(这个文件默认为mapred-site.xml.template 需要改名为mapred-site.xml),yarn-site.xml,slaves,配置这几个文件的时候我查找了许多大神的博客,但配置项实在是太多了,后来经过很多次的调试,我找的了一个最简化的配置项。

首先配置core-site.xml文件

fs.default.name也可以写为fs.defaultFS,后面的应该是比较新的版本写法但意思一样,这个配置项是配置namenode的9000是它的端口,

hadoop.tmp.dir 是配置他的临时文件存放地址,如果不配置的话他默认存放在/tmp下,如果重启虚拟机的话,这个目录会清空,导致hadoop无法正常启动。所以一般把这个目录配置到hadoop目录下,如果多次格式化hadoop的时候可能会导致namendoe id 和datanode id 不一致。后面我会详细讲解这个问题。

haoop-env.sh

这个文件需要修改你的JAVA_HOME,找到这一行把#去掉,然后修改路径

hdfs-site.xml 这个配置项是用来配置DataNode个数,在这次配置中我们有一个namenode,和两个datanode,所以dfs.replication配置项应该为2。

mapreduce-site.xml

这个文件里,只有一个必须的配置项,但为了给大家拓展一下,我会写出两个不是必要的配置项。

必要:

这个配置项指定使用yarn运行mapreduce程序,yarn是hadoop2版本才使用的资源管理框架,负责集群资源管理和调度。Hadoop 1.0资源管理由两部分组成:资源表示模型和资源分配模型,想详细了解的同学可以自行百度。

不是必要的:

<property>

<name>dfs.name.dir</name>

<value>xxx</value>

</property>

这个参数用于确定将HDFS文件系统的元信息保存在什么目录下。

如果这个参数设置为多个目录,那么这些目录下都保存着元信息的多个备份。

<property>

<name>dfs.data.dir</name>

<value>xxx<value>

</property>

这个参数用于确定将HDFS文件系统的数据保存在什么目录下。

我们可以将这个参数设置为多个分区上目录,即可将HDFS建立在不同分区上。

重点

yarn-site.xml 

这个文件配置项很多,而且都很重要,如果涉及到调优的话,一般都会涉及到这个文件的内容。

master为我的namenode主机名

下面我来解释一下这三个配置项的意思:

yarn.resourcemanager.address

参数解释:ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等。

yarn.resourcemanager.scheduler.address

参数解释:ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等。

yarn.resourcemanager.resource-tracker.address

参数解释:ResourceManager对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。

这三个参数在伪分布式时可以不用配置,但在完全分布式中,如果不配置,yarn进程会正常启动,但执行任务时会卡主。一会我会详细讲解这个问题。

yarn.nodemanager.resource.memory-mb

【存疑】

表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量,这个参数另一种说法是,该参数的默认值是8192MB,即使你的机器内存不够8192MB,YARN也会按照这些内存来使用,对于这两种说法,我比较认可第二种,因为我以前都是用2G内存搭建的平台,这个参数都是默认,但一直正常运行,不用修改。

讲到这我想给大家扩展一下yarn框架

ResourceManager做的事情是负责协调集群上计算资源的分配。调度、启动每一个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在情况。

NodeManager 功能比较专一,根据要求启动和监视集群中机器的计算容器container。负责 Container 状态的维护,并向 RM 保持心跳汇报该节点资源使用情况。

ApplicationMaster 负责一个 Job 生命周期内的所有工作。注意每一个Job都有一个 ApplicationMaster。它和MapReduce任务一样在容器中运行。AM通过与RM交互获取资源,然后然后通过与NM交互,启动计算任务。

容器是由ResourceManager进行统一管理和分配的。有两类container:一类是AM运行需要的container;另一类是AP为执行任务向RM申请的。

Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。

这只是对yarn初步的理解,在此需要注意的是,cotainer是一个抽象的理解。

yarn.nodemanager.vmem-pmem-ratio

任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1,因为开始运行任务的时候,会先检查分配给他的资源,如果需要的虚拟内存小于分配给他的虚拟内存任务会失败,如果不想让他运行时检查虚拟内存,可以通过下一个参数关闭检测,并不会影响任务运行。

yarn.nodemanager.vmem-check-enabled

是否启用一个线程检查每个任务证使用的虚拟内存量,如果任务超出了分配值,则直接将其kill,默认是true,修改是将参数改为 false。

最后一个文件 slaves

在这个文件里添加上,你的datanode节点的主机名。

修改完配置文件就可以下发hadoop文件到slave节点用到的命令是:scp -r [hadoop-版本] [用户名]@[主机名]:~

发送到slave主机的用户的家目录。

将hadoop文件下发到slave文件之后就可以格式化文件系统了,在此,我用一张图来描述linux文件系统和hdfs文件系统的区别。

需要注意的是 hadoop1 版本的默认hdfs块大小为64M,而Hadoop2默认的块大小为128M。

hdfs文件系统的特点

HDFS优点:

高容错性:数据自动保存多个副本,副本丢失后,自动恢复

适合批处理:移动计算而飞数据。数据位置暴露给计算框架

适合大数据处理:GB,TB,设置PB级数据。百万规模以上文件数量。10K+节点规模。

流式文件访问:一次性写入,多次读取。保证数据一致性。

可构建在廉价机器上:通过多副本提高可靠性。提供容错和恢复机制。

HDFS缺点:

不适合低延迟数据访问场景:比如毫秒级,低延迟与高吞吐率。

不适合小文件存取场景:占用NameNode大量内存。寻道时间超过读取时间。

不适合并发写入,文件随机修改场景:一个文件只能有一个写者。仅支持append。

hdfs文件系统在存储文件的流程是,client客户端向namenode发送存储请求,namenode检查路径是否可以存储,如果可以回复请求,client客户端将文件分为128M一个块的文件(如果文件小于128M占一个块,但存储在分布式系统上是它实际大小),比如一个257M的文件,client会把它且分为2个128M的文件和1个1M的文件,当写完一份文件后,datanode会将这份文件复制到其他的节点上面,默认是存放三份,HDFS文件系统主要是用来处理大量数据时使用,增大他的数据块容量有利于文件块的定位,但也不是越大越好,如果有大量的小数据存入到HDFS系统中,因为数据的元数据都存放在datanode中,因此,HDFS所能存储的文件数量会受到namenode内存的限制。

拓展

namenode 作用,运行原理

NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。

在此引出secondary namenode 的概念,初次听到这个词可能很多人以为这是namenode的备份,其实不然,这里就要讲一下namenode的工作原理:

namenode主要由两个文件组成fsimage,edit logs 。当“写请求”到来时namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:

edit logs文件会变的很大,怎么去管理这个文件是一个挑战。

NameNode的重启会花费很长时间,因为有很多改动[笔者注:在edit logs中]要合并到fsimage文件上。

如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧](此处摘自hadoop的NAMENODE的管理机制,工作机制和DATANODE的工作原理 - CSDN博客 想详细了解可以去看看)

因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edit logs文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力。

SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。

上面的图片展示了Secondary NameNode是怎么工作的。

首先,它定时到NameNode去获取edit logs,并更新到fsimage上。[笔者注:Secondary NameNode自己的fsimage]

一旦它有了新的fsimage文件,它将其拷贝回NameNode中。

NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。总之我理解的secondary name是用来帮助namenode处理元数据的更新。

好,讲解完namenode,secondary namenode开始重回搭建平台的话题,上回说到修改完配置文件,开始格式化文件系统命令为:hdfs namenode -format 或者hadoop namenode -format 成功后会显示

成功格式化后,就可以启动你的进程了。

start-dfs.sh的作用在于启动主节点的namenode,启动secondnamenode,以及各从节点的datanode进程。

stop-dfs.sh的作用在于关闭主节点的namenode,启动secondnamenode,以及各从节点的datanode进程。

启动完进程,可以用命令:jps 查看

我的namenode节点:bootstrap不是我启动的,他是一个前端框架。

我的datanode节点

start-yarn.sh 启动yarn 

namenode节点

datanode节点: org 那个不是

启动完进程就可以测试一下搭建的环境首先建一个文件a.txt,在里面随便写上一些内容

然后上传文件到hdfs系统上,命令hadoop fs -put a.txt  /  上传a.txt 到hdfs的根目录,然后开始我们第一个wordcount 程序,hadoop jar xxx(你的hadoop路径)/share/hadoop/mapreduce/hadoop-mapreduce-examples-xxx(你的hadoop版本).jar wordcount     /a.txt(输入路径 我把a.txt 放在根下)    /output(输出路径这里我放在根下的output目录中),这是我的运行命令:注意输出目录必须是之前不存在的

运行完之后,检查一下输出的结果:hadoop fs -cat /output/part-00000

成功,这是最简单的wordcount,用到的是hadoop自带的一个jar包,以后根据不同的需求,需要自己写wordcount程序,基本会用java或者python写,都有自己的框架,学习起来也不算太难。

在这里我放上基本的一些hadoop命令:

复制 hadoop fs -cp /tmp/input/hadoop1/hadoop/*.* /tmp/input/hadoop

本地文件上传到hdfs上 hadoop fs -put /tmp/input/hadoop1/hadoop/*.* /tmp/input/hadoop

从hdfs上下载文件  hadoop fs -get /tmp/input/hadoop1/hadoop/*.* /tmp/input/hadoop

查看文件列表  hadoop fs -ls /tmp/input/hadoop1/hadoop/

这些是最基本的命令,hadoop 的命令和linux 差别不大,学会linux即可掌握这些命令。

测试完之后,hadoop搭建基本完成,我们开始搭建hive,首先来简单介绍一下hive:

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

搭建hive,我们用到了mysql作为元数据库,在ubuntu中可以使用命令:sudo apt install mysql-client mysql-server 安装mysql,安装完之后会出现配置界面让你输入root用户密码,输入完成,再输入一遍密码,配置完成。

赋给hive用户权限,在这里给hive登录的用户名为hive密码也是hive。

1.进入mysql,我给mysql,root用户密码为123456,mysql-uroot -p,登录成功。

2.grant all on *.* to hive@'%' identified by 'hive'  这里赋予权限还有几种远程登录,感兴趣的可以去看一下。

3.配置完权限,需要用命令 flush privileges 刷新一下权限,然后退出。

4.修改hive配置项,进入$HIVE_HOME/conf,首先修改hive-site.xml.temp,改名为hive-site.xml,然后找到里面的HADOOP_HOME 删掉前面的#,修改后面的路径为你的hadoop目录,然后新建文件hive-site.xml,添加配置项

修改这个配置文件有点小技巧,可以去hive-default.xml.template文件中粘贴这些配置项,然后修改。

修改完之后进入$HIVE_HOME/lib 拷贝jline-2.1.2(可能和我的版本不一样) ,到$HADOOP_HOME/share/hadoop/yarn/lib

这时还有一个mysql和hive连接的驱动 mysql-connector-java-5.1.45.tar(最好别用太高版本,这个文件我也会上传),将这个文件放到$HIVE_HOME/lib中

进入$HIVE_HOME/bin,执行./schematool -initSchema -dbType mysql ,初始化元数据库,如果出现初始化失败,首先检查配置文件有没有出错,如果配置文件没有问题,那就可能要修改mysql的绑定ip,修改 /etc/mysql/mysql.conf.d/mysqld.cnf,找到里面的bind-address 默认为127.0.0.1 修改为0.0.0.0,此时在重新初始化。

初始化完成之后,进入$HIVE_HOME/sbin目录下,执行./hive ,启动hive。

有些任务可能涉及到将查询到的结果输出到控制台或者重定向到某个文档内 可以使用hive -e "xxxx"

重定向 hive -e "xxx" >>xx.txt,还有大量数据在hive和hdfs互导时会用到sqoop,感兴趣的可以去看一下。

spark 分布式搭建

我用的软件版本是spark-2.0.2-bin-hadoop2.7,解压完软件包之后,进入conf目录,将slaves.template改名为slaves,

添加slave主机名,修改spark-env.sh.template为spark-env.sh,添加配置项

spark_master_ip 为namenode的 ip

下发spark到datanode节点,下发完成后,进入$SPARK_HOME/sbin,执行start-all.sh,启动spark进程,看到namenode上有master,datanode上有worker就说明正常启动了。

遇到的问题

在刚开始搭建平台的时候,遇到过很多问题,但问题解决后都没有记下来,现在只能一点一点回去找,所以暂时更新到这里,后续会添加上这一块。

未完待续.....

资源

hadoop 搭建资源

密码:5dct

上一篇下一篇

猜你喜欢

热点阅读