hadoop简介

2019-08-15  本文已影响0人  quanzongwei

一. 什么是hadoop

hadoop是一个具有分布式存储和分布式计算能力的分布式软件系统

hadoop基本特点

二. 解决的问题

三. 应用场景

四. NFS

NFS即网络文件系统, 多台主机共享服务器中的数据


NFS

但是这种文件系统存在一些缺陷

  1. 缺少数据冗余
  2. 数据集中, 无法进行分布式计算

五. 系统架构

主要分为三部分

5.1 HDFS

HDFS是一个可靠的有容错机制的分布式文件系统


HDFS architecture
  1. HDFS系统由一个命名节点(nameNode)和多个数据节点(dataDode)构成
  2. 写数据可以在dataNode中直接写, 也可以先通过nameNode再随机选一个dataNode
  3. 读取数据的时候, 通过nameNode查询映射关系,再查询指定的数据节点
  4. 支持构造一个伪分布式系统, 在一台机器上运行多个数据节点
  5. nameNode响应用户请求,执行mkdir put get list等文件管理操作

5.1.1 数据分块

一个文件被分为多个数据块, 数据块的大小可配置, 除了最后一个数据块以外, 其他的数据块大小一样, 默认128M


enter description here

5.1.2 副本选择

5.1.2.1 数据块写

每个数据块的冗余副本数可配置


replicas wite

首先了解下rack的概念, rack, 机架, 通过配置将一个区域的机器放到一个机架中, 通常一个机架内部节点之间的通信速度较快
(简单理解为一个机房即可)

副本选择算法如下:

  1. 数据块插入的节点存储数据块的第一副本(如果是通过nameNode插入, 那么随机选一个数据节点存储数据块的第一副本)
  2. 选择其他的rack(机架), 将第二和第三副本写入这个rack(机架)的两个不同的数据节点
  3. 如果副本数配置大于3, 则剩余的副本随机分不到不同的dataNode节点

这种策略既保证了数据的可靠性, 又一定程度上提高了性能

示例:

replicas write example
该架构中,存在1个hadoop集群, 3个机架(rack), 一个nameNode, 8个dataNode分布在3个机架上
以下是写请求的全过程:
首先客户端对文件进行切分
  1. 客户端向nameNode发起写请求
  2. nameNode创建文件名称, 返回需要插入的节点列表信息
  3. 客户端向host2写入block1
    3.1. host2数据写成功后向客户端返回响应信息
    3.1.1. 客户端通知nameNode,block1数据写入host2成功
    3.2. host2数据写成功后, host2向rack2(集群中其他的随机rack)中的host1写入block1
    3.2.1. host1数据写成功后, 向nameNode同步信息
    3.2.2. host1数据写成功后, host1向rack2(2号副本和3号副本写入的rack是相同的)中的host3写入block1
    3.2.2.1. host3数据写入成功后, 向nameNode同步信息
    3.3. host2数据写成功后,向nameNode同步信息
  4. 客户端向host7写入block2
    4.1. host7数据写成功后向客户端返回响应信息
    4.1.1. 客户端通知nameNode,block2数据写入host7成功
    4.2. host7数据写成功后, host7向rack3(集群中其他的随机rack)中的host8写入block2
    4.2.1. host8数据写成功后, 向nameNode同步信息
    4.2.2. host8数据写成功后, host8向rack3(2号副本和3号副本写入的rack是相同的)中的host4写入block2
    4.2.2.1. host4数据写入成功后, 向nameNode同步信息
    4.3. host2数据写成功后,向nameNode同步信息
  5. 文件写入完成

注:

在hadoop支持存储类型和存储策略之后, 保存文件的时候可以指定存储策略, 只有支持对应的存储类型的数据节点上才可以
保存这种数据, 如果支持这种存储策略的节点不足(少于副本数配置),则执行备选方案

5.1.2.2 数据库读

读取数据的时候优先选择离用户最近的rack(机架)

5.2 MapReduce

主要用于分布式数据计算, 可以使用上次分享的spark来替代


map reduce architecture

5.3 Yarn

主要用于资源调度, 2.x版本引入, 是hadoop重要组件

hadoop1.0和2.0的区别


1.0和2.0的区别

yarn在hadoop中的角色


yarn in hadoop

yarn运行过程


enter description here
  1. resourceManager: 资源管理器, 全局只有一个
  2. nodeManager: 节点管理器, 每个节点对应一个,向resourceManager同步节点信息(CPU内存等等)
  3. application master: 应用管理器,负责处理节点内部的任务的分配
  4. container: 资源的抽象, application master负责分配自己所在节点的资源给某个task(任务),这组资源就被抽象为container

客户端提交任务到resourceManager, 然后resourceManager进行资源分配

数据节点之间使用RPC通信,比如Container处理后的数据传递给其他节点的application master

六. 安装

  1. 安装JDK1.8
  2. 安装hadoop3.1.2

七. 配置

单机伪分布式
1.配置环境变量~/.bashrc

export JAVA_HOME=/root/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/root/hadoop-3.1.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  1. 配置hadoop-env.sh
export JAVA_HOME=/root/jdk1.8.0_121
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"

  1. 配置core-site.xml
<configuration>
  <!-- 指定hdfs的nameservice -->
  <property>
      <name>fs.defaultFS</name>
      <value>hdfs://server1:9000</value>
  </property>
  <property>
      <name>io.file.buffer.size</name>
      <value>131072</value>
  </property>
</configuration>
  1. 配置mapred-site.xml
<configuration>
  <!-- Configurations for MapReduce Applications: -->
  <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
   </property>
   <!-- 以下是143内存错误需要加的参数-->
   <property>
        <name>mapreduce.map.memory.mb</name>
        <value>1500</value>
        <description>每个Map任务的物理内存限制</description>
    </property>
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>3000</value>
        <description>每个Reduce任务的物理内存限制</description>
    </property>
    <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmx1200m</value>
    </property>
    <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmx2600m</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
  1. 配置workers
server1 # 本机
  1. 配置yarn-site.xml
<configuration>
    <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>server1</value>
    </property>
    <!-- 配置外网只需要替换外网ip为真实ip,否则默认为 localhost:8088 -->
    <!-- <property>
                 <name>yarn.resourcemanager.webapp.address</name>
          <value>外网ip:8088</value>
    </property> -->
    <!-- Configurations for NodeManager: -->
    <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
    <property>

    <!--执行mapreduce任务时候类不存在错误,需要导入以下类库; 执行hadoop classpath命令获取-->
    <property>
        <name>yarn.application.classpath</name>
        <value>/root/hadoop-3.1.2/etc/hadoop:/root/hadoop-3.1.2/share/hadoop/common/lib/*:/root/hadoop-3.1.2/share/hadoop/common/*:/root/hadoop-3.1.2/share/hadoop/hdfs:/root/hadoop-3.1.2/share/hadoop/hdfs/lib/*:/root/hadoop-3.1.2/share/hadoop/hdfs/*:/root/hadoop-3.1.2/share/hadoop/mapreduce/lib/*:/root/hadoop-3.1.2/share/hadoop/mapreduce/*:/root/hadoop-3.1.2/share/hadoop/yarn:/root/hadoop-3.1.2/share/hadoop/yarn/lib/*:/root/hadoop-3.1.2/share/hadoop/yarn/*</value>
    </property>
    <!-- 以下是143内存错误需要加的参数-->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>22528</value>
        <discription>每个节点可用内存,单位MB</discription>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1500</value>
        <discription>单个任务可申请最少内存,默认1024MB</discription>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>16384</value>
        <discription>单个任务可申请最大内存,默认8192MB</discription>
    </property>
</configuration>
  1. 配置hdfs-site.xml
<configuration>
<!-- Configurations for NameNode: -->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>/var/lib/hadoop/hdfs/name/</value>
</property>
<property>
  <name>dfs.blocksize</name>
  <value>268435456</value>
</property>
<property>
  <name>dfs.namenode.handler.count</name>
  <value>100</value>
</property>
<!-- Configurations for DataNode: -->
<property>
  <name>dfs.datanode.data.dir</name>
  <value>/var/lib/hadoop/hdfs/data/</value>
</property>
<!--副本数配置, 不可以大于集群中的节点总数-->
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<property>
  <name>dfs.http.address</name>
  <value>server1:50070</value>
</property>
</configuration>

八. 启动

start-dfs.sh
start-yarn.sh

两个网站被启动
server1:50070 文件查看
server:8088 节点状态查看

九. 基本操作

hadoop fs -mkdir /testdir
hadoop fs -put /root/xxx /testdir
hadoop fs -get xxx xxx
hadoop fs -ls /

# 计算圆周率
hadoop jar hadoop-mapreduce-examples-3.1.2.jar pi 5 5
# word count
hadoop jar hadoop-mapreduce-examples-3.1.2.jar wordcount /wordcount/input /wordcount/output

十. 文件目录

十一. 探讨

  1. 数据分块后, 数据就不完整了, 各个节点是否可以处理各自的数据块? 比如一个很大的文本文件
    答: mapreduce进行文件split操作后, 除了第一个split块, 其他的split块自动跳过第一行, 该行数据不作处理
    参考: https://wiki.jikexueyuan.com/project/hadoop/read-data.html
  2. 为啥不把整个文件多所有数据块写入同一个rack?
    答: 因为写入多个rack, 读取的时候从不同的rack获取数据, 可以提高读取数据的速度, 不会因为单个rack的带宽瓶颈
    而降低IO性能
    参考: https://blog.csdn.net/u010670689/article/details/82715181

参考

安装教程
https://blog.csdn.net/dream_an/article/details/80258283
hdfs 架构
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
hdfs rack只看一张图
https://blog.51cto.com/zengzhaozheng/1347777
hadoop生态-图片好
https://www.cnblogs.com/zhangwuji/p/7594725.html
yarn 架构
https://www.cnblogs.com/wcwen1990/p/6737985.html

上一篇 下一篇

猜你喜欢

热点阅读