一文读懂Hadoop、HBase、Hive、Spark分布式系统架构

栏目: 数据库 · 发布时间: 8年前

内容简介:一文读懂Hadoop、HBase、Hive、Spark分布式系统架构

一文读懂Hadoop、HBase、Hive、Spark分布式系统架构

机器学习、数据挖掘等各种大数据处理都离不开各种开源分布式系统,hadoop用户分布式存储和map-reduce计算,spark用于分布式机器学习,hive是分布式数据库,hbase是分布式kv系统,看似互不相关的他们却都是基于相同的hdfs存储和yarn资源管理,本文通过全套部署方法来让大家深入系统内部以充分理解分布式系统架构和他们之间的关系

本文结构

首先,我们来分别部署一套hadoop、hbase、hive、spark,在讲解部署方法过程中会特殊说明一些重要配置,以及一些架构图以帮我们理解,目的是为后面讲解系统架构和关系打基础。

之后,我们会通过运行一些程序来分析一下这些系统的功能

最后,我们会总结这些系统之间的关系

分布式hadoop部署

首先,在 http://hadoop.apache.org/releases.html 找到最新稳定版tar包,我选择的是

http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz

下载到 /data/apache 并解压

在真正部署之前,我们先了解一下 hadoop 的架构

hadoop分为几大部分:yarn负责资源和任务管理、hdfs负责分布式存储、map-reduce负责分布式计算

先来了解一下yarn的架构:

yarn的两个部分:资源管理、任务调度。

资源管理需要一个全局的ResourceManager(RM)和分布在每台机器上的NodeManager协同工作,RM负责资源的仲裁,NodeManager负责每个节点的资源监控、状态汇报和Container的管理

任务调度也需要ResourceManager负责任务的接受和调度,在任务调度中,在Container中启动的ApplicationMaster(AM)负责这个任务的管理,当任务需要资源时,会向RM申请,分配到的Container用来起任务,然后AM和这些Container做通信,AM和具体执行的任务都是在Container中执行的

yarn区别于第一代hadoop的部署(namenode、jobtracker、tasktracker)

然后再看一下hdfs的架构:hdfs部分由NameNode、SecondaryNameNode和DataNode组成。DataNode是真正的在每个存储节点上管理数据的模块,NameNode是对全局数据的名字信息做管理的模块,SecondaryNameNode是它的从节点,以防挂掉。

最后再说map-reduce:Map-reduce依赖于yarn和hdfs,另外还有一个JobHistoryServer用来看任务运行历史

hadoop虽然有多个模块分别部署,但是所需要的程序都在同一个tar包中,所以不同模块用到的配置文件都在一起,让我们来看几个最重要的配置文件:

各种默认配置:core-default.xml, hdfs-default.xml, yarn-default.xml, mapred-default.xml

各种web页面配置:core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml

从这些配置文件也可以看出hadoop的几大部分是分开配置的。

除上面这些之外还有一些重要的配置:hadoop-env.sh、mapred-env.sh、yarn-env.sh,他们用来配置程序运行时的 java 虚拟机参数以及一些二进制、配置、日志等的目录配置

下面我们真正的来修改必须修改的配置文件。

修改etc/hadoop/core-site.xml,把配置改成:

  


 
   


  
    
     
   fs.defaultFS
  
    


  
    
     
   hdfs://127.0.0.1:8000
  
    


 
   


 
   


  
    
     
   io.file.buffer.size
  
    


  
    
     
   131072
  
    


 
   

  

这里面配置的是hdfs的文件系统地址:本机的9001端口

修改etc/hadoop/hdfs-site.xml,把配置改成:

  


 
   


  
    
     
   dfs.namenode.name.dir
  
    


  
    
     
   file:/data/apache/dfs/name
  
    


 
   


 
   


  
    
     
   dfs.datanode.data.dir
  
    


  
    
     
   file:/data/apache/dfs/data
  
    


 
   


 
   


  
    
     
   dfs.datanode.fsdataset.volume.choosing.policy
  
    


  
    
     
   org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
  
    


 
   


 
   


  
    
     
   dfs.namenode.http-address
  
    


  
    
     
   127.0.0.1:50070
  
    


 
   


 
   


  
    
     
   dfs.namenode.secondary.http-address
  
    


  
    
     
   127.0.0.1:8001
  
    


 
   

  

这里面配置的是hdfs文件存储在本地的哪里以及secondary namenode的地址

修改etc/hadoop/yarn-site.xml,把配置改成:

  


 
   


  
    
     
   yarn.resourcemanager.hostname
  
    


  
    
     
   127.0.0.1
  
    


 
   


 
   


  
    
     
   yarn.resourcemanager.webapp.address
  
    


  
    
     
   127.0.0.1:8088
  
    


 
   


 
   


  
    
     
   yarn.nodemanager.aux-services
  
    


  
    
     
   mapreduce_shuffle
  
    


 
   


 
   


  
    
     
   yarn.nodemanager.aux-services.mapreduce.shuffle.class
  
    


  
    
     
   org.apache.hadoop.mapred.ShuffleHandler
  
    


 
   


 
   


  
    
     
   yarn.log-aggregation-enable
  
    


  
    
     
   true
  
    


 
   


 
   


  
    
     
   yarn.log-aggregation.retain-seconds
  
    


  
    
     
   864000
  
    


 
   


 
   


  
    
     
   yarn.log-aggregation.retain-check-interval-seconds
  
    


  
    
     
   86400
  
    


 
   


 
   


  
    
     
   yarn.nodemanager.remote-app-log-dir
  
    


  
    
     
   /YarnApp/Logs
  
    


 
   


 
   


  
    
     
   yarn.log.server.url
  
    


  
    
     
   http://127.0.0.1:19888/jobhistory/logs/
  
    


 
   


 
   


  
    
     
   yarn.nodemanager.local-dirs
  
    


  
    
     
   /data/apache/tmp/
  
    


 
   


 
   


  
    
     
   yarn.scheduler.maximum-allocation-mb
  
    


  
    
     
   5000
  
    


 
   


 
   


  
    
     
   yarn.scheduler.minimum-allocation-mb
  
    


  
    
     
   1024
  
    


 
   


 
   


  
    
     
   yarn.nodemanager.vmem-pmem-ratio
  
    


  
    
     
   4.1
  
    


 
   


 
   


  
    
     
   yarn.nodemanager.vmem-check-enabled
  
    


  
    
     
   false
  
    


 
   

  

这里面配置的是yarn的日志地址以及一些参数配置

通过cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml创建etc/hadoop/mapred-site.xml,内容改为如下:

  


 
   


  
    
     
   mapreduce.framework.name
  
    


  
    
     
   yarn
  
    


  
    
     
   Execution framework set to Hadoop YARN.
  
    


 
   


 
   


  
    
     
   yarn.app.mapreduce.am.staging-dir
  
    


  
    
     
   /tmp/hadoop-yarn/staging
  
    


 
   


 
   


  
    
     
   mapreduce.jobhistory.address
  
    


  
    
     
   127.0.0.1:10020
  
    


 
   


 
   


  
    
     
   mapreduce.jobhistory.webapp.address
  
    


  
    
     
   127.0.0.1:19888
  
    


 
   


 
   


  
    
     
   mapreduce.jobhistory.done-dir
  
    


  
    
     
   ${yarn.app.mapreduce.am.staging-dir}/history/done
  
    


 
   




 
   


  
    
     
   mapreduce.jobhistory.intermediate-done-dir
  
    


  
    
     
   ${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate
  
    


 
   


 
   


  
    
     
   mapreduce.jobhistory.joblist.cache.size
  
    


  
    
     
   1000
  
    


 
   




 
   


  
    
     
   mapreduce.tasktracker.map.tasks.maximum
  
    


  
    
     
   8
  
    


 
   


 
   


  
    
     
   mapreduce.tasktracker.reduce.tasks.maximum
  
    


  
    
     
   8
  
    


 
   


 
   


  
    
     
   mapreduce.jobtracker.maxtasks.perjob
  
    


  
    
     
   5
  
    


  
    
     
   The maximum number of tasks for a single job.

A value of -1 indicates that there is no maximum. 
  
    


 
   

  

这里面配置的是mapred的任务历史相关配置

如果你的hadoop部署在多台机器,那么需要修改etc/hadoop/slaves,把其他slave机器ip加到里面,如果只部署在这一台,那么就留一个localhost即可

下面我们启动hadoop,启动之前我们配置好必要的环境变量:

export JAVA_HOME=”你的java安装地址”

先启动hdfs,在此之前要格式化分布式文件系统,执行:

./bin/hdfs namenode -format myclustername

如果格式化正常可以看到/data/apache/dfs下生成了name目录

然后启动namenode,执行:

./sbin/hadoop-daemon.sh —script hdfs start namenode

如果正常启动,可以看到启动了相应的进程,并且logs目录下生成了相应的日志

然后启动datanode,执行:

./sbin/hadoop-daemon.sh —script hdfs start datanode

如果考虑启动secondary namenode,可以用同样的方法启动

下面我们启动yarn,先启动resourcemanager,执行:

./sbin/yarn-daemon.sh start resourcemanager

如果正常启动,可以看到启动了相应的进程,并且logs目录下生成了相应的日志

然后启动nodemanager,执行:

./sbin/yarn-daemon.sh start nodemanager

如果正常启动,可以看到启动了相应的进程,并且logs目录下生成了相应的日志

然后启动MapReduce JobHistory Server,执行:

./sbin/mr-jobhistory-daemon.sh start historyserver

如果正常启动,可以看到启动了相应的进程,并且logs目录下生成了相应的日志

下面我们看下web界面

打开 http://127.0.0.1:8088/cluster 看下yarn管理的集群资源情况(因为在yarn-site.xml中我们配置了yarn.resourcemanager.webapp.address是127.0.0.1:8088)

打开 http://127.0.0.1:19888/jobhistory 看下map-reduce任务的执行历史情况(因为在mapred-site.xml中我们配置了mapreduce.jobhistory.webapp.address是127.0.0.1:19888)

打开 http://127.0.0.1:50070/dfshealth.html 看下namenode的存储系统情况(因为在hdfs-site.xml中我们配置了dfs.namenode.http-address是127.0.0.1:50070)

到此为止我们对hadoop的部署完成。下面试验一下hadoop的功能

先验证一下hdfs分布式文件系统,执行以下命令看是否有输出:

[root@MYAY hadoop]# ./bin/hadoop fs -mkdir /input[root@MYAY hadoop]# cat data1234[root@MYAY hadoop]# ./bin/hadoop fs -put input /input[root@MYAY hadoop]# ./bin/hadoop fs -ls /inputFound 1 items

-rw-r--r-- 3 root supergroup 8 2016-08-07 15:04 /input/data

这时通过 http://127.0.0.1:50070/dfshealth.html 可以看到存储系统的一些变化

下面我们以input为输入启动一个mapreduce任务

[root @MYAY hadoop]# ./bin/hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar -input /input -output /output -mapper cat -reducer wc

之后看是否产生了/output的输出:

[root@MYAY hadoop]# ./bin/hadoop fs -ls /outputFound 2 items
-rw-r—r— 3 root supergroup 0 2016-08-07 15:11 /output/_SUCCESS
-rw-r—r— 3 root supergroup 25 2016-08-07 15:11 /output/part-00000[root@MYAY hadoop]# ./bin/hadoop fs -cat /output/part-00000
4 4 12

这时通过  http://127.0.0.1:19888/jobhistory 可以看到mapreduce任务历史:

也可以通过 http://127.0.0.1:8088/cluster 看到任务历史

为什么两处都有历史呢?他们的区别是什么呢?

我们看到cluster显示的其实是每一个application的历史信息,他是yarn(ResourceManager)的管理页面,也就是不管是mapreduce还是其他类似mapreduce这样的任务,都会在这里显示,mapreduce任务的Application Type是MAPREDUCE,其他任务的类型就是其他了,但是jobhistory是专门显示mapreduce任务的

hbase的部署

首先从 http://www.apache.org/dyn/closer.cgi/hbase/ 下载稳定版安装包,我下的是 https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/hbase-1.2.2-bin.tar.gz

解压后修改conf/hbase-site.xml,改成:

  


 
   


  
    
     
   hbase.cluster.distributed
  
    


  
    
     
   true
  
    


 
   


 
   


  
    
     
   hbase.rootdir
  
    


  
    
     
   hdfs://127.0.0.1:8001/hbase
  
    


 
   


 
   


  
    
     
   hbase.zookeeper.quorum
  
    


  
    
     
   127.0.0.1
  
    


 
   

  

其中hbase.rootdir配置的是hdfs地址,ip:port要和hadoop/core-site.xml中的fs.defaultFS保持一致

其中hbase.zookeeper.quorum是zookeeper的地址,可以配多个,我们试验用就先配一个

启动hbase,执行:

./bin/start-hbase.sh

这时有可能会让你输入本地机器的密码

启动成功后可以看到几个进程起来,包括zookeeper的HQuorumPeer和hbase的HMaster、HRegionServer

下面我们试验一下hbase的使用,执行:

hbase(main):001:0> status1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load

创建一张表



hbase(main):004:0> create 'table1','field1'0 row(s) in 1.3430 seconds



=> Hbase::Table - table1

获取一张表



hbase(main):005:0> t1 = get_table('table1')

0 row(s) in 0.0010 seconds



=> Hbase::Table - table1

添加一行



hbase(main):008:0> t1.put 'row1', 'field1:qualifier1', 'value1'0 row(s) in 0.4160 seconds

读取全部



hbase(main):009:0> t1.scan

ROW COLUMN+CELL

row1 column=field1:qualifier1, timestamp=1470621285068, value=value11 row(s) in 0.1000 seconds

我们同时也看到hdfs中多出了hbase存储的目录:

[root@MYAY hbase]# ./hadoop/bin/hadoop fs -ls /hbaseFound 7 items

drwxr-xr-x - root supergroup 0 2016-08-08 09:05 /hbase/.tmp

drwxr-xr-x - root supergroup 0 2016-08-08 09:58 /hbase/MasterProcWALsdrwxr-xr-x - root supergroup 0 2016-08-08 09:05 /hbase/WALsdrwxr-xr-x - root supergroup 0 2016-08-08 09:05 /hbase/data

-rw-r--r-- 3 root supergroup 42 2016-08-08 09:05 /hbase/hbase.id

-rw-r--r-- 3 root supergroup 7 2016-08-08 09:05 /hbase/hbase.version

drwxr-xr-x - root supergroup 0 2016-08-08 09:24 /hbase/oldWALs

这说明hbase是以hdfs为存储介质的,因此它具有分布式存储拥有的所有优点

hbase的架构如下:

其中HMaster负责管理HRegionServer以实现负载均衡,负责管理和分配HRegion(数据分片),还负责管理命名空间和table元数据,以及权限控制

HRegionServer负责管理本地的HRegion、管理数据以及和hdfs交互。

Zookeeper负责集群的协调(如HMaster主从的failover)以及集群状态信息的存储

客户端传输数据直接和HRegionServer通信

hive的部署

http://mirrors.hust.edu.cn/apache/hive 下载安装包,我下的是 http://mirrors.hust.edu.cn/apache/hive/stable-2/apache-hive-2.1.0-bin.tar.gz

解压后,我们先准备hdfs,执行:

[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /tmp[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /user[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /user/hive[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /user/hive/warehourse[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -chmod g+w /tmp[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -chmod g+w /user/hive/warehourse

使用hive必须提前设置好HADOOP_HOME环境变量,这样它可以自动找到我们的hdfs作为存储,不妨我们把各种HOME和各种PATH都配置好,如:

HADOOP_HOME=/data/apache/hadoop

export HADOOP_HOME

HBASE_HOME=/data/apache/hbase

export HBASE_HOME

HIVE_HOME=/data/apache/hive

export HIVE_HOME

PATH=$PATH:$HOME/bin

PATH=$PATH:$HBASE_HOME/bin

PATH=$PATH:$HIVE_HOME/bin

PATH=$PATH:$HADOOP_HOME/bin

export PATH

拷贝创建hive-site.xml、hive-log4j2.properties、hive-exec-log4j2.properties,执行

[root@MYAY hive]# cp conf/hive-default.xml.template conf/hive-site.xml

[root@MYAY hive]# cp conf/hive-log4j2.properties.template conf/hive-log4j2.properties

[root@MYAY hive]# cp conf/hive-exec-log4j2.properties.template conf/hive-exec-log4j2.properties

修改hive-site.xml,把其中的${system:java.io.tmpdir}都修改成/data/apache/tmp,你也可以自己设置成自己的tmp目录,把${system:user.name}都换成用户名

:%s/${system:java.io.tmpdir}/\/data\/apache\/tmp/g:%s/${system:user.name}/myself/g

初始化元数据数据库(默认保存在本地的derby数据库,也可以配置成mysql),注意,不要先执行hive命令,否则这一步会出错,具体见 http://stackoverflow.com/questions/35655306/hive-installation-issues-hive-metastore-database-is-not-initialized ,下面执行:

[root @MYAY hive]# schematool -dbType derby -initSchema

成功之后我们可以以客户端形式直接启动hive,如:

[root @MYAY hive]# hivehive> show databases;

OKdefaultTime taken: 1.886 seconds, Fetched: 1 row(s)

hive>

试着创建个数据库是否可以:

hive> create database mydatabase;OK

Time taken: 0.721 seconds

hive> show databases;OK

default

mydatabase

Time taken: 0.051 seconds, Fetched: 2 row(s)

hive>

这样我们还是单机的hive,不能在其他机器登陆,所以我们要以server形式启动:

nohup hiveserver2 &> hive.log &

默认会监听10000端口,这时可以通过jdbc客户端连接这个服务访问hive

hive的具体使用在这里不赘述

spark部署

首先在 http://spark.apache.org/downloads.html 下载指定hadoop版本的安装包,我下载的是 http://d3kbcqa49mib13.cloudfront.net/spark-2.0.0-bin-hadoop2.7.tgz

spark有多种部署方式,首先支持单机直接跑,如执行样例程序:

./bin/spark-submit examples/src/main/python/pi.py 10

它可以直接运行得出结果

下面我们说下spark集群部署方法:

解压安装包后直接执行:

[root @MYAY spark-2.0.0-bin-hadoop2.7]# sbin/start-master.sh

这时可以打开  http://127.0.0.1:8080/ 看到web界面如下:

根据上面的url:spark://MYAY:7077,我们再启动slave:

[root @MYAY spark-2.0.0-bin-hadoop2.7]# ./sbin/start-slave.sh spark://MYAY:7077

刷新web界面如下:

出现了一个worker,我们可以根据需要启动多个worker

下面我们把上面执行过的任务部署到spark集群上执行:

./bin/spark-submit —master spark://MYAY:7077 examples/src/main/python/pi.py 10

web界面如下:

spark程序也可以部署到yarn集群上执行,也就是我们部署hadoop时启动的yarn

我们需要提前配置好HADOOP_CONF_DIR,如下:

HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop/

export HADOOP_CONF_DIR

下面我们把任务部署到yarn集群上去:

./bin/spark-submit —master yarn —deploy-mode cluster examples/src/main/python/pi.py 10

看  http://127.0.0.1:8088/cluster 效果如下:

总结一下

hdfs是所有hadoop生态的底层存储架构,它主要完成了分布式存储系统的逻辑,凡是需要存储的都基于其上构建

yarn是负责集群资源管理的部分,这个资源包括计算资源和存储资源,因此它也支撑了hdfs和各种计算模块

map-reduce组件主要完成了map-reduce任务的调度逻辑,它依赖于hdfs作为输入输出及中间过程的存储,因此在hdfs之上,它也依赖yarn为它分配资源,因此也在yarn之上

hbase基于hdfs存储,通过独立的服务管理起来,因此仅在hdfs之上

hive基于hdfs存储,通过独立的服务管理起来,因此仅在hdfs之上

spark基于hdfs存储,即可以依赖yarn做资源分配计算资源也可以通过独立的服务管理,因此在hdfs之上也在yarn之上,从结构上看它和mapreduce一层比较像

总之,每一个系统负责了自己擅长的一部分,同时相互依托,形成了整个hadoop生态。

来源:架构师之旅公众号

一文读懂Hadoop、HBase、Hive、Spark分布式系统架构

慧都控件|提供软件技术整体解决方案

云集全球三千余款优秀控件、软件产品,提供行业领先的咨询、培训与开发服务

企业QQ:800018081|电话:023-66090381


以上所述就是小编给大家介绍的《一文读懂Hadoop、HBase、Hive、Spark分布式系统架构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

We Are the Nerds

We Are the Nerds

Christine Lagorio-Chafkin / Hachette Books / 2018-10-2 / USD 18.30

Reddit hails itself as "the front page of the Internet." It's the third most-visited website in the United States--and yet, millions of Americans have no idea what it is. We Are the Nerds is an eng......一起来看看 《We Are the Nerds》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具