Hadoop教程

hadoop2.7.6(一)

本文主要是介绍hadoop2.7.6(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、hadoop的发展

二、hadoop框架

Hadoop Common:基础型功能

Hadoop Distributed File System (HDFS™):一种分布式文件系统,可提供对应用程序数据的高吞吐量访问。负责存放数据

Hadoop YARN:作业调度和集群资源管理的框架。负责资源的调配

Hadoop MapReduce:基于 YARN 的系统,用于并行处理大型数据集。大数据的计算框架

Hadoop框架透明地为应⽤提供可靠性和数据移动。它实现了名为MapReduce的编程范式:应⽤程序被分割成许多⼩部分,⽽每个部分都能在集群中的任意节点上执⾏或重新执⾏。此外,Hadoop还提供了分布式⽂件系统,⽤以存储所有计算节点的数据,这为整个集群带来了⾮常⾼的带宽。MapReduce和分布式⽂件系统的设计,使得整个框架能够⾃动处理节点故障。它使应⽤程序与成千上万的独⽴计算的电脑和PB级的数据。

一句话简述:Hadoop是一个适合海量数据的分布式存储和分布式计算的平台。

三、分布式文件系统(从这开始,下面都是属于Hadoop中的原理)

1、FS File System

文件系统时极域硬盘之上的文件管理的工具

我们用户操作文件系统可以和硬盘进行解耦

2、DFS Distributed File System

分布式文件系统

将我们的数据存放在多台电脑上存储

分布式文件系统有很多,HDFS(Hadoop Distributed FileSyetem)是Hadoop自带的分布式文件系统

HDFS是mapreduce计算的基础

三、文件切分的思想(引出分而治之的思想 第一个核心思想)

a. 文件存放在一个磁盘上效率肯定是最低的

读取效率低

如果文件特别大会超出单机的存储范围

b. 字节数组

文件在磁盘真实存储文件的抽象概念

数组可以进行拆分和组装,源文件不会收到影响

c. 切分数据

对字节数组进行切分

d. 拼接数据

按照数组的偏移量将数据连接到一起,将字节数组连接到一起

e. 偏移量

当前数据在数组中的相对位置,可以理解为下标

数组都有对应的索引,可以快速定位数据

f. 数据存储的原理:

不管文件的大小,所有的文件都是由字节数组构成

如果我们要切分文件,就是将一个字节数组分成多份

我们将切分后的数据拼接到一起,数据还可以继续使用

我们需要根据数据的偏移量将他们重新拼接到一起

四、Block拆分标准

数据块Block

a. 是磁盘进行数据 读/写的最小单位,数据被切分后的一个整体被称之为块 ​ b. 在Hadoop 1默认大小为64M,在Hadoop 2及其之后默认大小为128M块,这么大是为了最小化寻址开销 ​ c. 同一个文件中,每个数据块的大小要一致除了最后一个节点外 ​ 不同文件中,块的大小可以不一致 ​ 文件大小不同可以设置不同的块的数量 ​ HDFS中小于一个块的大小的文件不会占据整个块的空间 ​ d. 真实情况下,会根据文件大小和集群节点的数量综合考虑块的大小 ​ e. 数据块的个数=Ceil(文件大小/每个块的大小)

拆分的数据块需要等大

a. 数据计算的时候简化问题的复杂度(否则进行分布式算法设计的时候会因为数据量不一很难设计) ​ b. 数据拉取的时候时间相对一致 ​ c. 通过偏移量就知道这个块的位置 ​ d. 相同文件分成的数据块大小应该相等

注意事项

a. 只要有任意一个块丢失,整个数据文件被损坏 ​ b. HDFS中一旦文件被存储,数据不允许被修改 ​ 修改会影响偏移量

修改会导致数据倾斜(单节点数据量过多)

修改数据会导致蝴蝶效应 ​ c. 但是可以被追加(一般不推荐) ​ 追加设置需要手动打开 ​ d. 一般HDFS存储的都是历史数据.所以将来Map Reduce都用来进行离线数据的处理 ​ f. 块的大小一旦文件上传之后就不允许被修改 128M-512M

五、Block数据安全

a. 只要有任意一个块丢失,整个数据文件被损坏 ​ b. 肯定要对存储数据做备份 ​ c. HDFS是直接对原始数据进行备份的,这样能保证恢复效率和读取效率 ​ d. 备份的数据肯定不能存放在一个节点上,使用数据的时候可以就近获取数据 ​ f. 备份的数量要小于等于节点的数量 ​ g. 每个数据块默认会有三个副本,相同副本是不会存放在同一个节点上 ​ h. 副本的数量可以变更 ​ 可能近期数据被分析的可能性很大,副本数可以多设置几个 ​ 后期数据很少被分析,可以减少副本数

六、Block的管理效率

需要专门给节点进行分工

  • 存储 DataNode 实际存储数据的节点

  • 记录 NameNode

  • 日志 Secondary NameNode

Hadoop集群搭建(完全分布式版本)

一、准备工作

  • 三台虚拟机:master、node1、node2

  • 时间同步

    ntpdate ntp.aliyun.com
  • 调整时区

    cp  /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
  • jdk1.8

    java -version
  • 修改主机名

    三台分别执行 vim /etc/hostname 并将内容指定为对应的主机名
  • 关闭防火墙:systemctl stop firewalld

    • 查看防火墙状态:systemctl status firewalld

    • 取消防火墙自启:systemctl disable firewalld

  • 静态IP配置

    • 直接使用图形化界面配置(不推荐)

    • 手动编辑配置文件进行配置

      1、编辑网络配置文件
      vim /etc/sysconfig/network-scripts/ifcfg-ens33
      ​
      TYPE=Ethernet
      BOOTPROTO=static
      HWADDR=00:0C:29:E2:B8:F2
      NAME=ens33
      DEVICE=ens33
      ONBOOT=yes
      IPADDR=192.168.190.100
      GATEWAY=192.168.190.2
      NETMASK=255.255.255.0
      DNS1=192.168.190.2
      DNS2=223.6.6.6
      ​
      需要修改:HWADDR(mac地址,centos7不需要手动指定mac地址)
              IPADDR(根据自己的网段,自定义IP地址)
              GATEWAY(根据自己的网段填写对应的网关地址)
      ​
      2、关闭NetworkManager,并取消开机自启
      systemctl stop NetworkManager
      systemctl disable NetworkManager
      ​
      3、重启网络服务
      systemctl restart network
  • 免密登录

    # 1、生成密钥
    ssh-keygen -t rsa
    # 2、配置免密登录
    ssh-copy-id master
    ssh-copy-id node1
    ssh-copy-id node2
    # 3、测试免密登录
    ssh node1
  • 配置好映射文件:/etc/hosts

    192.168.190.100 master
    192.168.190.101 node1
    192.168.190.102 node2

二、搭建Hadoop集群

NameNode:接受客户端的读/写服务,收集 DataNode 汇报的 Block 列表信息

DataNode:真实数据存储的地方(block)

SecondaryNameNode:做持久化的时候用到

进程master(主)node1(从)node2(从)
NameNode    
SecondaryNameNode    
ResourceManager    
DataNode  
NodeManager  

2.1 完全分布式搭建

1、上传安装包并解压

# 使用xftp上传压缩包至master的/usr/local/soft/packages/
cd /urs/local/soft/packages/
# 解压
tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local/soft/

2、配置环境变量

vim /etc/profile
​
JAVA_HOME=/usr/local/soft/jdk1.8.0_171
HADOOP_HOME=/usr/local/soft/hadoop-2.7.6
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
​
# 重新加载环境变量
source /etc/profile

3、修改Hadoop配置文件

  • cd /usr/local/soft/hadoop-2.7.6/etc/hadoop/

  • core-site.xml

    fs.defaultFS: 默认文件系统的名称。其方案和权限决定文件系统实现的URI。uri的方案确定命名文件系统实现类的配置属性(fs.scheme.impl)。uri的权限用于确定文件系统的主机、端口等。

    hadoop.tmp.dir:是 hadoop文件系统依赖的基本配置,很多配置路径都依赖它,它的默认位置是在 /tmp/{$user}下面,注意这是个临时目录!!!

    因此,它的持久化配置很重要的! 如果选择默认,一旦因为断电等外在因素影响,/tmp/{$user}下的所有东西都会丢失。

    fs.trash.interval:启用垃圾箱配置,dfs命令删除的文件不会立即从HDFS中删除。相反,HDFS将其移动到垃圾目录(每个用户在/user/<username>/.Trash下都有自己的垃圾目录)。只要文件保留在垃圾箱中,文件可以快速恢复。

        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://master:9000</value>
        </property>
    ​
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/soft/hadoop-2.7.6/tmp</value>
        </property>
    ​
        <property>
            <name>fs.trash.interval</name>
            <value>1440</value>
        </property>
  • hadoop-env.sh

    export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

    image.png

  • hdfs-site.xml

  • dfs.replication:每个datanode上只能存放一个副本。我这里就2个datanode

    dfs.permissions:如果为“true”,则在HDFS中启用权限检查。如果为“false”,则关闭权限检查,但所有其他行为保持不变。从一个参数值切换到另一个参数值不会更改文件或目录的模式、所有者或组。

        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
    ​
        <property>
            <name>dfs.permissions</name>
            <value>false</value>
        </property>
  • mapred-site.xml.template

  • mapreduce.framework.name:用于执行MapReduce作业的运行时框架。

    mapreduce.jobhistory.address:Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过*mr-jobhistory-daemon.sh start historyserver命令来启动Hadoop历史服务器。我们可以通过Hadoop jar的命令来实现我们的程序jar包的运行,关于运行的日志,我们一般都需要通过启动一个服务来进行查看,就是我们的JobHistoryServer,我们可以启动一个进程,专门用于查看我们的任务提交的日志。mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address默认的值分别是0.0.0.0:10020和0.0.0.0:19888

    # 1、重命名文件
    cp mapred-site.xml.template mapred-site.xml
    # 2、修改
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    ​
        <property>  
            <name>mapreduce.jobhistory.address</name>  
            <value>master:10020</value>  
        </property>  
    ​
        <property>  
            <name>mapreduce.jobhistory.webapp.address</name>  
            <value>master:19888</value>  
        </property> 
  • slaves

  • 从节点的信息

    node1
    node2
  • yarn-site.xml

  • yarn.resourcemanager.hostname:指定yarn主节点

yarn.nodemanager.aux-services:NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序。默认值:“”

yarn.log-aggregation-enable:yarn日志聚合功能开关

yarn.log-aggregation.retain-seconds:日志保留时限,默认7天

      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master</value>
      </property>
  
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
  
      <property>
          <name>yarn.log-aggregation-enable</name>
          <value>true</value>
      </property>
  
      <property>
          <name>yarn.log-aggregation.retain-seconds</name>
          <value>604800</value>
      </property>

4、分发Hadoop到node1、node2

cd /usr/local/soft/
scp -r hadoop-2.7.6/ node1:`pwd`
scp -r hadoop-2.7.6/ node2:`pwd`

5、格式化namenode(第一次启动的时候需要执行,以及每次修改核心配置文件后都需要)

hdfs namenode -format

image.png

6、启动Hadoop集群

start-all.sh

7、检查master、node1、node2上的进程

  • master:

    [root@master soft]# jps
    NameNode
    SecondaryNameNode
    ResourceManager
    Jps
  • node1:

    [root@node1 jdk1.8.0_171]# jps
    DataNode
    NodeManager
    Jps
  • node2:

    [root@node2 ~]# jps
    DataNode
    NodeManager
    Jps

8、访问HDFS的WEB界面

http://master:50070

image.png

9、访问YARN的WEB界面

http://master:8088

image.png

Hadoop中的常见的shell命令
​
1、如何将linux本地的数据上传到HDFS中呢?
hadoop fs -put 本地的文件 HDFS中的目录
hdfs dfs -put 本地的文件 HDFS中的目录
​
2、如何创建HDFS中的文件夹呢?
需求:想创建/shujia/bigdata17
hadoop fs -mkdir /shujia/bigdata17
hdfs dfs -mkdir /shujia/bigdata17
​
3、查看当前HDFS目录下的文件和文件夹
hadoop fs -ls /shujia/bigdata17
hdfs dfs -ls /shujia/bigdata17
​
4、将HDFS的文件下载到Linux本地中
hadoop fs -get HDFS中的文件目录 本地要存放文件的目录
hdfs dfs -get HDFS中的文件目录 本地要存放文件的目录
​
5、删除命令(如果垃圾回收站大小小于被删除文件的大小,直接被删除,不经过回收站)
hadoop fs -rm ....  # 仅删除文件
hadoop fs -rmr .... # 删除文件夹
​
​
6、移动文件
hadoop fs -mv 目标文件  目的地路径
​
7、HDFS内部复制文件
hadoop fs -cp [-p] ... ... # 如果想复制文件夹,加上-p参数

强制格式化集群(遇到问题的简单暴力的方法)

1、停止正在运行的集群

stop-all.sh

2、删除所有节点hadoop根目录中的tmp文件夹

3、在主节点(master)中hadoop的根目录中的bin目录下,重新格式化HDFS

./hdfs namenode -format

4、启动集群

start-all.sh

2.2 进程理解

2.1.1 HDFS相关(NN,DN,SSN)

NameNode(NN)

功能:

1、接受客户端的读/写服务

因为NameNode知道文件与DataNode的对应关系

2、保存文件的时候会保存文件的元数据信息

a. 文件的归属

b. 文件的权限

c. 文件的大小,时间

d. Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN向NN汇报。(带同学们画图讲解,引出这4个点)

3、收集Block的位置信息

3.1 系统启动

a. NN关机的时候是不会存储任意的Block与DataNode的映射信息的

b. DN启动的时候会自动将自己节点上存储的Block信息汇报给NN

c. NN接收请求之后会重新生成映射关系

File ----> Block

Block---> DN

d. 如果数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点

3.2 集群运行中

a. NN与DN保持心跳机制,三秒钟发送一次

b. 如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况

c. 可以让客户端读取存活的DN节点

d. 如果NN与DN三秒没有心跳则认为DN出现异常,此时不会让新的数据写到这个异常的DN中,客户端访问的时候不提供异常DN节点地址

e. 如果超过十分钟没有心跳,那么NN会将当前DN节点存储的数据转移到其他的节点

4、NameNode为了效率,将所有的操作都在内存中进行

a. 执行速度快

b. NameNode不会和磁盘进行任何的数据交换

但是会存在两个问题:

1)数据的持久化

2)数据保存在内存中,断电丢失

DataNode(DN)

1、存放的是文件的数据信息,以及验证文件完整性的校验信息

2、数据会存放在硬盘上

a. 1m=1条元数据

b. 1G=1条元数据

c. NameNode非常排斥存储小文件(能存,但是不推荐!!)

一般小文件在存储之前需要进行压缩

3、汇报

1)启动时

汇报之前会验证Block文件是否被损坏

向NN汇报当前DN上block的信息

2)运行中

向NN保持心跳机制

4、当客户端读写数据的时候,首先会先去NN查询file与block与DN的映射,然后直接与DN建立连接,然后读写数据

SecondaryNameNode(SNN)

1、传统的那日村持久化方案

1)日志机制

a. 做任何操作之前先记录日志

b. 在数据改变之前先记录对应的日志,当NN停止的时候

c. 当我下次启动的时候,只需要重新按照以前的日志“重做一遍”即可

缺点:

a. log日志文件的大小不可控,随着时间的发展,集群启动的时间会越来越长

b. 有可能日志中存在大量的无效日志

优点:

a. 绝对不会丢失数据

2)拍摄快照

a. 我们可以将内存中的数据写出到硬盘上(序列化)

b. 启动时还可以将硬盘上的数据写回到内存中(反序列化)

缺点:

a. 关机时间过长

b. 如果是异常关机,数据还在内存中,没法写入到硬盘

c. 如果写出的频率过高,导致内存使用效率低

优点:

启动时间较短

 

2、SNN的解决方案

1)解决思路

a. 让日志大小可控

b. 快照需要定时保存

c. 日志+快照

2)解决方案

a. 当我们启动一个集群的时候,会产生4个文件 ..../name/current/

 

b. 我们每次操作都会记录日志

 

这篇关于hadoop2.7.6(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!