大数据Hadoop

大数据

大数据简介

1.什么是大数据
# 大数据:
	Big Data,数据体量非常大,TB级,日增长在GB级。
	B-KB-MB-GB-TB-PB-EB-ZB 彼此之间差1024倍
# 大数据技术:
	数据体量大道一定程度,导致传统Web技术无法处理(存储、计算),需要使用新的分布式技术处理,叫做大数据技术。
	这套技术可以使计算突破单体计算机的硬件配置的限制。
	解决海量数据存储(硬盘,内存)、计算问题(CPU)。
2.大数据特点
# 1.体量大 Volume
	MySQL  20G 上限
	数据体量达到TB和PB级别,或日增长数据量在GB级别。
		例如大型电商网站、金融行业的日志数据、订单数据。
# 2. 多样性 Variety
	结构化:二维表
	半结构化:JSON XML
	非结构化:文本文件、图片、音频、视频、地理位置
# 3. 快速 Velocity
	处理数据速度快,时效性要求高。
	1小时	1天
# 4. 价值密度低 Value
	数据中存在大量无关紧要的数据,不同的业务需求,需要的业务数据又不一样,需要从海量数据中清洗除需要的关键性指标。
3.应用业务方向
应用场景:规律分析、系统预警、定向广告推送、猜你喜欢。。
行业:互联网、工业预警、智慧农业、大数据医疗、金融风控
本质: `海量数据===>有价值数据==>价值`
工作方向
	​	大数据运维工程师
	​	大数据开发工程师(实时计算、数据仓库、ETL、基本挖掘)
	​	大数据分析(算法)
4.大数据起源
1. Google(爬虫+搜索),最早面临大数据的公司。2005年,Google公开了大数据的3个技术论文(公开),并作出了相应的软件产品(不开源)
   ​	① GFS Google file system 文件存储系统 (突破单机硬盘限制即存储)
   ​	② MapReduce 数据计算 分布式计算 (突破单体计算机内存和CPU限制)
   ​	③ BigTable (No SQL数据库) (突破单体计算机DB存储和读取能力)
5.大数据数据来源 (大数据项目开发前置准备)
① 自身公司系统运行产生的日志数据。[用户多、数据量大]
② 爬虫采集互联网免费数据。(谨慎)
③ 行业大数据:
	​	电信移动联通通话记录	  ----电信
	​	医疗用户病例、处方	   ---智慧医疗
	​	银行交易流水、账户信息	 ---金融大数据
	​	政府大数据
④ 大数据交易(贵州),交易过了时效性或者脱敏数据。(或者黑色产业链)
6.大数据核心问题
# 1. 海量数据存储 (突破单机存储限制)
# 2. 海量数据计算 统计 分析 处理(突破单机计算能力)

Hadoop简介

Hadoop是一个由Apache基金会所开发的[分布式系统](https://baike.baidu.com/item/分布式系统)基础架构。

	Hadoop实现了一个[分布式文件系统](https://baike.baidu.com/item/分布式文件系统)(Hadoop Distributed File System),简称HDFS。

	HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算

总结
	HDFS--解决大数据存储问题
	MapReduce--解决大数据计算问题
1.起始
Doug Cutting使用Java编程语言开发了Hadoop1.x体系产品。
Hadoop体系Google体系含义
HDFSGFS Google File System大数据存储系统
MapReduceMapReduce大数据处理计算
HBaseBigTableno sql数据库
2.Hadoop发行版
名称收费使用难度
apache的Hadoop免费
Cloudera(CDH)$4000/节点/年中(图形化界面)
Hortonworks$12000/10节点/年
FusionInSight(华为)
飞天(阿里)
3.Hadoop生态圈

解决:大数据问题(存储 计算)

Hadoop Core (HDFS 存 ,MR计算(YARN分布式资源管理系统),MapReduce(离线计算),spark(内存计算),Flink(实时计算))

Hadoop生态工具 (Hive(数据仓库),HBase(分布式数据库),Zookeeper(分布式协调服务保证集群稳定性、可靠性))

Hadoop辅助工具 (Flume (日志采集)Sqoop(数据转换工具导入导出) Azkaban/Oozie (作业调度系统)Hue) mahout(算法库)、Kafka(消息队列)

HDP/CDH(安装部署工具,图形化运维服务器管理)

4.学习核心
1. HDFS
	存数据 取数据
2. MR
	如何编码、数据计算、与原有Java开发的区别
3. Hive
	HQL 与SQL95%一样。
4. HBase
	类比Redis, 存 取 数据结构
	编码--思路--应用场景--原理--源码
5. Flume 日志采集工具
6. Sqoop 数据导入工具,将日志数据导入到hadoop中。
7. zookeeper 服务管理协调工具。(保证集群的稳定性和可靠性)
8. Mahout 算法库[分类、聚类、推荐、关联规则挖掘、回归、降维、进化、向量相似] 30多种。

HDFS

简介

HDFS 全称 Hadoop Distributed File System 中文 Hadoop分布式文件系统。

总结:解决海量数据存储问题。
如何存储的?

思路

1.文件切分成块(按照文件的字节数组下标)

2.按副本备份的把数据块保存在多台数据节点(DataNode)—从slave

3.要有一台主节点(NameNode)管理所有的数据节点—主master

知识点总结
# 核心概念1

1.DataNode:Slave节点,专门用来存储数据块(Block)的廉价服务器。
		a.保存切分后的数据,保存副本。
		b.定时心跳---->namenode,汇报datanode自己本身的状态信息。
		c.定期发送block的checksum。
2.NameNode:Master节点,管理从节点,并接受客户端访问
		主节点  master
    	 1. 管理hdfs集群中所有的datanode信息
               dn1 192.168.199.11 硬盘空间(数据存储负载均衡)
                     [文件名1-blk1 路径 大小  时间]
               dn2 192.168.199.12 硬盘空间
               dn3 192.168.199.13 硬盘空间
    	 2. 管理hdfs中文件的元数据(文件描述信息)---保存内存中
               (文件名 路径 大小 时间 权限 用户 组 )
         3. 管理dn中block的checksum。
         4. 接受客户端的访问。
3.Block:数据块,完整数据的最小组成部分,大小为128MB。
	a.过大:单个block数据传输时间过长,更容易出现数据重传情况。(降低传输效率)
	b.过小:导致block数量过多,导致namenode元数据过多,导致内空间过早用完,导致
	注意:拆分太少,导致单体文件过大,无法并行io操作文件,效率低。
	     拆分太多,导致io次数过多,降低效率。
4.Client:
	java或者命令行工具,用来访问HDFS中的数据的。
	a.访问操作hdfs集群中的文件。
	b.首先连接namenode,再连接datanode。
# 重要概念2
1.replication:数据块block的副本,备份block,防止单体datanode宕机损坏导致数据丢失。
2.checksum:校验和类似指纹数字签名,dataname中保存数据的数字指纹。(一串字符串)
	作用:唯一标记文件的内容。
	确保数据的可靠性,hadoop内部在判断文件是否一致或者变化,就对比文件的签名即可。
搭建HDFS单体架构(伪分布式)
架构模型

​ Client—>访问NameNode (hdfs://ip:50070)

​ NameNode:hadoop10 (master)-----保存元数据等

​ DataNode:hadoop10 (slave)-----保存block数据

安装步骤

软件准备

Hadoop: http://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz

官网:http://hadoop.apache.org/docs/r2.9.2/

1.准备虚拟机
  1. 设置hostname
  	hostnamectl set-hostname hadoop10
  2. 设置IP  
    vim /etc/sysconfig/network-scripts/ifcfg-ens33	
    ----------------网卡对应的文件内容---------------------
    TYPE="Ethernet"
    PROXY_METHOD="none"
    BROWSER_ONLY="no"
    BOOTPROTO="none"
    DEFROUTE="yes"
    IPV4_FAILURE_FATAL="no"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    IPV6_DEFROUTE="yes"
    IPV6_FAILURE_FATAL="no"
    IPV6_ADDR_GEN_MODE="stable-privacy"
    NAME="ens33"
    UUID="0bd5d8a5-fe1b-42de-82bd-bfa7d2984b95"
    DEVICE="ens33"
    ONBOOT="yes"
    IPADDR="192.168.153.10" # 修改这里的ip地址即可。
    PREFIX="24"
    GATEWAY="192.168.153.2"
    DNS1="192.168.153.2"
    DNS2="8.8.8.8"
    IPV6_PRIVACY="no"
   systemctl restart network   (修改后重启生效)
  
  3. 配置hosts(linux+windows)
    vim /etc/hosts   
    ----------以下是文件信息------------
    192.168.153.10 hadoop10
    
    
  4. 关闭防火墙
  	systemctl stop firewalld
  	systemctl disable firewalld
  5. 安装jdk1.8。
     (略)
  6. 配置jdk环境变量。
	a.安装jdk
		tar -zxvf jdk1.8xxx.gar.gz
	b.配置环境变量 
		vim /etc/profile
		## 内容如下
		#java_home
		export JAVA_HOME=/opt/installs/jdk1.8
		#path
		export PATH=$JAVA_HOME/bin:$PATH
		#classpath
		export classpath=.    (可以不写)
	c.执行命令使环境变量立刻生效
		source /etc/profile
  7. 必要软件
  		vim   --非必须
  		tree  --非必须
  		wget  --非必须
  			psmisc  --必须
2.安装hadoop
# 解压
[root@hadoop10 module]# tar zxvf hadoop-2.9.2.tar.gz -C /opt/install/
# 配置环境变量
vim /etc/profile
	-------------以下是环境变量-------------
	# 配置HADOOP_HOME
	export HADOOP_HOME=/opt/installs/hadoop2.9.2
	# 配置PATH
	export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 生效配置信息(重新执行profile中的指令,加载配置信息)
	source /etc/profile
	
bin(客户端命令,hdfs yarn)、etc(hadoop配置文件)、logs(hadoop运行日志)、sbin(hadoop服务端命令)、share(hadoop依赖的jar和参考文档)

3.初始化配置文件(6个)
   hadoop-env.sh--(关联JDK)
   core-site.xml--(hadoop的NameNode访问路径,数据存放位置)
   hdfs-site.xml--(配置副本数)
   mapred-site.xml--(Mapreduce的服务 shuffle)
   yarn-site.xml--(配置资源调度器--cpu、内存、硬盘)
   slaves--(配置从节点)
# hadoop-env.sh   (关联JDK)
    JAVA_HOME=/opt/installs/jdk1.8
# core-site.xml    (hadoop的NameNode访问路径,数据存放位置)
	# 配置hdfs入口
	  <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop10:9000</value>
      </property>
	# 配置 数据保存位置
	# 新建 data文件夹
	  <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/install/hadoop2.9.2/data</value>
      </property>
# hdfs-site.xml    (配置副本数)
	# 配置副本个数
	  <property>
        <name>dfs.replication</name>
        <value>1</value>
      </property>
# mapred-site.xml    (Mapreduce的服务 shuffle)
# 拷贝一份mapred-site.xml.template并且重命名mapred-site.xml
	cp mapred-site.xml.template mapred-site.xml
  	# 配置资源调度器yarn
  	  <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
      </property>
# yarn-site.xml    (配置资源调度器--cpu、内存、硬盘)
  	# 配置yarn的服务
  	  <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
# slaves    (配置从节点)
  	# 配置从机datanode的ip
  	  hadoop10
4.格式化HDFS数据库
# 一旦hadoop配置启动失败,删除data下的文件,再重新格式化。
    #初始化namenode和datanode存放数据的目录
    hdfs namenode -format
5.启动HDFS
# 启动hdfs
start-dfs.sh
# 关闭hdfs
stop-dfs.sh

6.测试验证
# 查看hdfs进程---命令行查看java进程
[root@hadoop10 install]# jps
2225 NameNode  # master namenode主机
4245 Jps
2509 SecondaryNameNode 
2350 DataNode	# slave datanode从机
# 查看hdfsWeb服务
1. 查看namenode的web服务
	http://hadoop10:50070
2. 查看datanode的Web服务
	http://hadoop10:50075
7.日志监控
namenode启动日志
	路径:/hadoop2.9.2/logs/hadoop-用户名-namenode-主机名.log
	hadoop-root-namenode-主机名字.log
datanode启动日志
	路径:/hadoop2.9.2/logs/hadoop-用户名-datanode-主机名.log
	hadoop-root-datanode-主机名.log
知识补充
# 启动失败如何处理
  场景: 格式化或者启动hadoop失败。
  说明:
  		hadoop/data文件夹
  		作用: 保存datanode和namenode持久化的数据。
  		时机:
  			1. 格式化hdfs namenode -format 会初始化该目录下的文件。
  			2. hdfs运行期间产生的数据,会操作该目录中的数据。
  必要操作:删除格式化或者启动数据保存的文件目录。
  
# namenode 的 web界面讲解
   http://ip:50070
   1. 查看namenode中管理的datanode的信息.
   2. 管理文件block的元数据。
  	 文件名  用户  用户组  类型  权限 时间 ....
   3. 启动过程日志监控(查看错误)
   		# 监控namenode启动日志     
			/hadoop2.9.2/logs/hadoop-用户名-namenode-主机名.log
		# 监控datanode启动日志
    		/hadoop2.9.2/logs/hadoop-用户名-datanode-主机名.log

Hadoop

目录结构介绍

1.bin  ----二进制脚本,客户端工具命令
2.etc  ----配置文件(6个常用的配置文件)
3.include  ----
4.logs  ----日志
4.lib  ----依赖库
5.libexec  ----
6.sbin  ----hadoop集群服务管理命令(启动、关闭)
7.share  
		----doc 文档
		----hadoop的web服务
	8.data  ----存放hadoop的数据文件即保存数据(需要手动创建)

HDFS客户端

命令客户端

1.命令所在目录

​ ${hadoop}/bin之下/hdfs的命令

2.HDFS的文件系统结构

Linux管理的文件系统
  /
     root  etc  ...
HDFS管理的文件系统
  / 
     user  用户  ...  

3.常用命令

HDFS类比linux命令
	hdfs dfs -命令 参数

语法:***hdfs dfs -参数 值***

命令语法含义示例代码
hdfs dfs -ls [-R] hdfs文件路径查看文件元数据信息hdfs dfs -ls /
hdfs dfs -mkdir -p /目录a/目录b新建文件夹,如果父目录不存在则添加-p参数hdfs dfs -mkdir -p /baizhi/file
hdfs dfs -put linux文件路径 hdfs文件路径从linux向hdfs上传文件hdfs dfs -put /opt/models/jdk /baizhi
hdfs dfs -text hdfs文档路径查看文件内容,可以查看压缩文件内的文档信息hdfs dfs -text /baizhi/Test.java
hdfs dfs -cat hdfs文档路径查看文件内容hdfs dfs -cat /baizhi/Test.java
hdfs dfs -rm hdfs文件路径删除文件hdfs dfs -rm /baizhi/Test.java
hdfs dfs -rm -r hdfs文件夹删除文件夹,非空使用-rmrhdfs dfs -rm -r /baizhi
hdfs dfs -get hdfs文件 linux路径从hdfs下载文件到linuxhdfs dfs -get /baizhi/jdk1.8 /opt
hdfs dfs -chmod [-R] 权限运算值 hdfs文件修改hdfs文件权限hdfs dfs -chmod o+w /baizhi
hdfs dfs -cp hdfs文件路径 hdfs文件路径文件拷贝hdfs dfs -cp /demo1 /demo2
hdfs dfs -find hdfs文件夹 -name “关键词”文件查找hdfs dfs -find / -name “a.txt”
hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2文件移动hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2
hdfs dfs -checksum hdfs文件获取文件的checksumhdfs dfs -checksum /hdfs/demo2/wordcount1.log
hdfs dfs -du [-s] hdfs目录查看文件大小,-s是统计该目录总空间大小hdfs dfs -du [-s] /hdfs
hdfs dfs -df /查看文件系统的磁盘占用情况hdfs dfs -df /

java客户端

入门 (HDFS下载)
  1. 核心API

    API含义和作用
    Configuration配置信息,封装hdfs操作的相关配置文件信息
    FileSystemHDFS的分布式文件系统工具,操作HDFS文件。
    IOUtilsIO操作的工具类
    Path封装表示HDFS文件路径
  2. 准备工作

    配置windows的hadoop执行环境

    1. 将hadoop2.9.2解压到window中,路径不能有中文,不能有空格。
    2. 拷贝hadoop的windows执行环境工具到bin路径下,替换客户端工具。
    3. 配置环境变量
    	HADOOP_HOME=hadoop安装路径
    	PATH=hadoop安装路径/bin
    4. 重启IDEA或者eclipse
    
  3. 配置文件

    • 加入hadoop依赖

      <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.9.2</version>
      </dependency>
      <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-hdfs</artifactId>
          <version>2.9.2</version>
      </dependency>
      
    • 导入log4j.properties(从linux的hadoop的etc中拷贝)到IDEA中的resource

  4. 编程步骤(文件下载)

    1. 创建配置信息,关联HDFS信息:Configuration
    	Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
    2. 获得操作HDFS文件的工具:FileSystem
    	FileSystem fileSystem = FileSystem.get(conf);
    3. 通过命令获得java的输入流。
    	 FSDataInputStream fsis = fs.open(new Path("/log4j.properties"));
    4. IO操作数据。
    	FileOutputStream fos = new FileOutputStream("D:/log4j.properties");
    	IOUtils.copyBytes(fsis, os, 1024, true);
    // 参数3:使用缓存1024字节   参数4:是否关闭filesystem。
    

5.程序代码(下载)

public class HDFSClientTest {
    @Test
    public void test1() throws Exception{
        //1.初始化配置文件
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //2.获得HDFS客户端工具  FileSystem
        FileSystem fs = FileSystem.get(conf);
        //3.写入java代码(hdfs-->java输入流)
        //从HDFS下载到本地
        // 4.输出下载到本地(java-->window输出流)
        //5.IOUtils对接 in out 完成数据传输
        FSDataInputStream fsis = fs.open(new Path("/log4j.properties"));
        FileOutputStream fos = new FileOutputStream("D:/log4j.properties");
        IOUtils.copyBytes(fsis,fos,2014,true);
        //6.关流
    }
}

6.上传(同理)

public void test2() throws Exception{
        //1.初始化配置文件
        Configuration conf = new Configuration();
        //指定入口
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //指定文件上传的副本数量
        conf.set("dfs.replication","1");
        //2.获得hdfs文件系统的客户端  FileSystem
        FileSystem fs = FileSystem.get(conf);
        //3.创建  本地Windows-->java输入流
        FileInputStream fis = new FileInputStream("D:/分析.mp4");
        //4.创建java-->hdfs 文件上传的输出流
        FSDataOutputStream fos = fs.create(new Path("/test/hdfs.mp4"));
        //5.使用Hadoop的IOUtils,完成数据搬运
        IOUtils.copyBytes(fis,fos,4096,true);
    }

7.文件操作

创建文件
    public void test3() throws Exception{
        //新建文件夹   可以把前两个步骤封装为Utils类
        //1.初始化配置文件
        Configuration conf = new Configuration();
        //指定入口
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //指定文件上传的副本数量
        conf.set("dfs.replication","1");
        //2.获得hdfs文件系统的客户端  FileSystem
        FileSystem fs = FileSystem.get(conf);
		boolean b = fs.mkdirs(new Path("/hdfs/demo"));
        System.out.println(b);
    }
判断文件是否存在
    public void test4() throws Exception{
        //判断某个文件是否存在
        //1.初始化配置文件
        Configuration conf = new Configuration();
        //指定入口
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //指定文件上传的副本数量
        conf.set("dfs.replication","1");
        //2.获得hdfs文件系统的客户端  FileSystem
        FileSystem fs = FileSystem.get(conf);
        boolean b = fs.exists(new Path("/demo"));
        System.out.println(b);
    }
删除文件
    public void test5() throws Exception{
        //删除文件    注意给windows的用户开启hdfs文件创建权限。  -rm -r
        //1.初始化配置文件
        Configuration conf = new Configuration();
        //指定入口
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //指定文件上传的副本数量
        conf.set("dfs.replication","1");
        //2.获得hdfs文件系统的客户端  FileSystem
        FileSystem fs = FileSystem.get(conf);
        boolean b = fs.delete(new Path("/hdfs/demo"));
        System.out.println(b);
	}
遍历hdfs文件信息(描述信息)
    public void test6() throws Exception{
        //查看hdfs文件列表信息
        //1.初始化配置文件
        Configuration conf = new Configuration();
        //指定入口
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //指定文件上传的副本数量
        conf.set("dfs.replication","1");
        //2.获得hdfs文件系统的客户端  FileSystem
        FileSystem fs = FileSystem.get(conf);
        FileStatus[] files = fs.listStatus(new Path("/test"));
        for (FileStatus file : files) {
            System.out.println(file);
            //获得路径包含文件名
            Path path = file.getPath();
            //获取长度
            long len = file.getLen();
            //获取副本数
            short replication = file.getReplication();
        }
    }
递归遍历文件,并且可以获取文件块所在的位置
    public void test7() throws Exception{
        /**
         * 功能:递归获得目录下的所有文件的元数据信息,
         * 并且可以获取文件块所在的位置  获取文件的block信息(大小  所在服务器地址)
         * 相当于hdfs的ls命令
         * listFiles参数1:要查看的目录
         * listFiles参数2:是否递归 -R
         */
        //1.初始化配置文件
        Configuration conf = new Configuration();
        //指定入口
        conf.set("fs.defaultFS","hdfs://192.168.153.10:9000");
        //指定文件上传的副本数量
        conf.set("dfs.replication","1");
        //2.获得hdfs文件系统的客户端  FileSystem
        FileSystem fs = FileSystem.get(conf);
        RemoteIterator<LocatedFileStatus> it = fs.listFiles(new Path("/test"), true);
        //LocatedFileStatus  (文件元数据信息+block相关信息)
        while(it.hasNext()){
            LocatedFileStatus next = it.next();
            System.out.println(next);
            //BlockLocation  block在DN中分布信息(block大小,所在的DN的地址)
            BlockLocation[] blocks = next.getBlockLocations();
            for (BlockLocation block : blocks) {
                System.out.println(Arrays.toString(block.getNames())); //块名字
                System.out.println(block.getOffset());  //偏移量
                System.out.println(block.getLength());  //长度
                System.out.println(Arrays.toString(block.getHosts()));   //所在主机   因为副本  所以是数组
                System.out.println("----------------");
                System.out.println("***************");
            }
        }

其他常见方法(了解)

方法含义
fs.getDefaultBlockSize(hdfs的path);获得默认block大小
fs.getFileChecksum(hdfs的path);获得checksum(指纹 数字签名)
fs.getDefaultReplication(hdfs的path);获得默认副本集
封装FileSystem

配置信息转移文件

  1. 讲配置文件core-site.xml拷贝到java项目的resources文件夹中。
  2. 导入log4j配置文件
  3. 使用classpath类加载输入流指向core-site.xml

InputStream is = Test1.class.getResourceAsStream("/core-site.xml")

  1. 讲配置文件加入封装到Configuration

conf.addResource(is)

Client读写数据原理(面试)

文件下载流程

在这里插入图片描述

文件上传流程

在这里插入图片描述

HDFS分布式搭建(Hadoop1.0)

免密登录

# start-x启动的原理。
start-dfs.sh和stop-dfs.sh
  会`远程登录`到NN和DN对应的节点执行hadoop-deamon.sh start namenode或者hadoop-deamon.sh start datanode命令启动对应节点的服务。
# 免密登录
	1. 生成一对秘钥(私钥+公钥)
ssh-keygen
	2. 将公钥拷贝到被免密登录的机器上。
ssh-copy-id 目标主机的ip
# *****注意:
    免密登录的设置一定要在hosts hostname ip设置完毕后,在设置免密登录。

集群规划

在这里插入图片描述

IP设置:NameNode–DataNode (hadoop11):192.168.153.11

​ DataNode----(hadoop12):192.168.153.12

​ DataNode----(hadoop13):192.168.153.13

HDFS集群搭建

# 1. 准备虚拟机
1. hostname
	hostnamectl set-hostname 名字
	hostname查看
2. ip
	vim /etc/sysconfig/network-scripts/ifcfg-ens33
	修改IP
	systemctl restart network
3. hosts(三个机器)
	192.168.153.11 hadoop11
	192.168.153.12 hadoop12
	192.168.153.13 hadoop13
4. 防火墙
	systemctl status firewalld
5. jdk和环境变量配置
	javac查看一下

# 2. 安装hadoop
	1. 解压
	2. 配置环境变量
	3. 重新加载配置文件。
# 3. 初始化配置文件
	1. hadoop-env.sh
	2. core-site.xml
	3. hdfs-site.xml
	4. mapred-site.xml
	5. yarn-site.xml
	6. slaves (配置多个DN节点,最好使用vi编辑器) 
	*****此次安装遇到文件环境污染问题
	*****将文件删除重新建立一个新的并编写
	
	
	# 将hadoop11的配置文件scp远程拷贝到hadoop12 和hadoop13
	scp -r ./etc root@hadoop12:/opt/install/hadoop2.9.2
	scp -r ./etc root@hadoop13:/opt/install/hadoop2.9.2
# 注意事项
	一个hadoop集群中,所有hadoop配置文件要完全一致。
# 4. 免密登录
	1. 生成秘钥
ssh-keygen
	2. 同步公钥到集群所有节点,包括自己。
ssh-copy-id 机器名字
# 5. 初始化HDFS
	1. 删除hadoop的data文件夹
 cd /opt/install/hadoop2.9.2/data/
 rm -rf *
	2. 格式化集群
	   在namenode节点执行格式化。
	hdfs namenode -format
# 6. 启动hadoop集群
	1. 在namenode节点,执行start-dfs.sh

NameNode持久化(持久化即把数据从内存转到硬盘存储)

NameNode的数据保存位置

元数据(NameNode)需要存放在内存中
原因:
	1.元数据信息数据量比较少(64-128G足够了)
	2.客户端对NameNode的元数据访问(读写),操作频率非常高(内存读写速度块)。

NameNode的持久化

​ NameNode数据存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。但是,如果一旦长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。

SencodaryNameNode(面试)(Hadoop1.0)

1.现存的NameNode面临的问题

问题

① 单点故障数据丢失?

② 日志持久化,容量大,回复慢

③ 快照持久化,短期内数据丢失问题依然存在。

④ 快照从哪儿来,合并的操作由谁做?
在这里插入图片描述

现有的持久化机制的特点
持久化机制Redis(类比)Hadoop-NameNode优点缺点
日志增量AOFEditsLog数据**安全性高**冗余度高、数据恢复慢
快照RDBFSImage数据**恢复快**、占用空间小只保留数据的最终状态,快照间隔期见,数据可能丢失,安全性低
2.NameNode持久化原理

简介:

​ ① NameNode持久化的时候使用的是EditsLog文件,保障数据安全。

​ ② SencodaryNameNode负责定期将EditsLog中的数据,合并成FSImage的数据状态。(NameNode的助理,负责持久化文件的合并checkpoint)

​ ③ NameNode恢复持久化到内存时,从FSImage恢复,外加从最近合并后产生EdisLog恢复,保障数据加载速度快。

SecondaryNameNode工作原理

CheckPoint原理过程

checkpoint:editslog和FSImage的合并过程

1. SecondaryNameNodeNameNode发起合并请求
2. NameNode将当前的Editslog文件保存改名edits,并新建EditsLog继续持久化工作。
3. 将改名后的edits文件和本地的FSImage()发送给sencondaryNameNode
4. SecondaryNameNode负责将FSImage()+edits文件合并成FSImage()
5. 将新的FSImage()发送给NameNode保存。

在这里插入图片描述

Checkpoin时机
1. 每隔1小时触发一次checkPoint
2. 每100w次操作,触发一次checkpoint
	每1分钟检查一次,操作次数

设置时机:hdfs-site.xml

namevalue默认含义
dfs.namenode.checkpoint.period36003600秒触发一次
dfs.namenode.checkpoint.txns1000000100w次操作触发一次
dfs.namenode.checkpoint.check.period601分钟检查一次操作次数
检查点工作原理

在这里插入图片描述

secondary定制(了解)
  1. 默认secondary在namenode所在的机器

  2. 位置查看 hdfs-site.xml

dfs.namenode.secondary.http-address=0.0.0.0:50090

dfs.namenode.secondary.https-address=0.0.0.0:50091

  1. 单独启动secondaryNameNode命令

hadoop-deamon start secondarynamenode

  1. 指定192.168.153.10为secondarynamenode的机器
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.153.10:50090</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>192.168.153.10:50091</value>
</property>

DataNode工作机制

序号步骤事情
0启动NameNode启动时,会启动slaves中所有的datanode
1注册DataNode向NameNode注册信息:block数据状态、元数据、校验和、心跳。告诉NameNode自己工作正常,数据完整。
2周期上报每隔1小时,会上报所有的block的元数据,校验和。
3心跳每3向namenode发送一次心跳,namenode返回心跳结果并包含一些数据操作的命令,如果发现datanode10分钟内没有心跳,则认为该datanode节点不可用

HDFS分布式集群搭建回顾

免密登录

1.Hadoop目前集群的问题

每个datanode的启动,都需要输入密码,如果有1w台,会是一件繁琐且低效的工作。

2.免密登录实现原理

3.免密登录命令

0 测试ssh免密登录前的效果

ssh 目标主机的ip

① 生成公钥和私钥

ssh-keygen -t rsa

ssh-keygen

存放位置:~/.ssh文件夹下

② 给主机颁发公钥

ssh-copy-id root@远程ip地址

③ 测试ssh免密登录之后的效果

ssh 目标主机的ip

退出远程ssh

exit

4.补充远程拷贝命令

scp -r 本地linux文件 root@远程linuxhostname:远程文件路径

安装Hadoop注意事项

​ 注意:如果该设备里面之前安装过且不用的hadoop需要删除hadoop/data/tmp目录下的持久化文件。

​ 如果该设备里面之前安装过且不用的hadoop需要删除hadoop/logs/目录下的日志文件。

启动hadoop集群命令补充

start-all.sh

stop-all.sh

HAHadoop高可用集群搭建(Hadoop2.0,Zookeeper选主机制)

目前hadoop集群的问题
  1. namenode单节点,一旦宕机,则hadoop文件服务就停止?
    在这里插入图片描述
  2. 如果2台namenod,一个主,一个备,如果主机宕机,自动切换到备机,但是客户端的ip访问地址不可变,怎么办?
    在这里插入图片描述
ZK工作机制
  1. zk职责
1. 选主:选举出真正的NameNode主机。
2. 管理editslog,一旦切换到备机,会将editslog同步给新主机。
  1. 原理
① zk主节点不固定,投票算法选主,可靠。
② 投票过半,则被认定为主机。
 3. 工作机制图

在这里插入图片描述

psmisc安装

zk使用psmisc做服务器进程的访问和管理

安装:yum install -y psmisc

ZK安装配置
  1. 下载

https://downloads.apache.org/zookeeper/zookeeper-3.4.14/

  1. 安装

tar -zxvf zookeeper-3.4.14.tar.gz -C /opt/install/

  1. 创建数据文件夹(如果启动有误,删除当前目前文件夹内自动生成的文件)

mkdir $ZK_HOME/data

  1. 初始化配置文件
配置文件位置:$ZK_HOME/conf/zoo.cfg

① 改名
操作:
	修改zoo_sample.cfg改为zoo.cfg
命令:
	mv zoo_sample.cfg zoo.cfg
② 配置
	数据保存位置:
		dataDir=/opt/installs/zookeeper3.4.14/data
	集群管理的服务(投票、选举时使用):
		server.0=hadoop20.baizhi.com:2888:3888
		server.1=hadoop21.baizhi.com:2888:3888
		server.2=hadoop22.baizhi.com:2888:3888
	说明:下图

在这里插入图片描述

  1. 在zk的data文件夹下创建一个文件(给主机设置编号

myid:0

myid:1

myid:2

  1. 同步zookeeper的安装和配置信息发送到所有需要zk管理的主机上。

scp -r zkhome root@hadoop.baizhi.com:/opt/installs

  1. 并修改主机myid.

  2. 启动zk服务:在bin目录下

在所有的zk节点上执行:./zkServer.sh start

投票机制,按照启动顺序
hadoop20启动,本机给自己投票。(自己得1票。)follower
hadoop21启动,本机给自己投票,并和集群内的其他成员交换票(自己得2),过半,则选为主机。 master
hadoop21启动,作为 follower
  1. 查看zk运行状态和主机

./zkServer.sh status

  1. 进入zk的客户端(在leader主机上执行

./zkCli.sh

1. 可以使用zookeeper的命令管理zk中的文件
2. zk中可以管理文件,同时文件结构也是树状。(这里未来是要存储zk集群中namenode的editslog文件)  
  1. zk启动问题查看日志

$ZK_HOME/bin/zookeeper.out

高可用hadoop集群搭建
  1. 删除所有hadoop下的date/tmp下面的文件

① 删除文件

② 执行namenode format

  1. core-site.xml
name含义value
fs.defaultFS配置namenode入口:使用zk后变成虚拟hdfs://ns
hadoop.tmp.dirhadoop的namenode保存元数据和
datanode保存block数据的位置
/opt/installs/hadoop-2.8.3/data/tmp
ha.zookeeper.quorumzk服务器的ip列表,端口号是zk的客户端端口hadoop2.baizhiedu.com:2181,
hadoop3.baizhiedu.com:2181,
hadoop4.baizhiedu.com:2181
  1. hdfs-site.xml
name含义value
dfs.replicationblock副本数量3
dfs.nameservices虚拟入口ip
定义namenode的入口名字-虚拟ip
ns
dfs.ha.namenodes.ns虚拟NN ip
定义zk虚拟的ip下两个namenode的名字
nn1,nn2
dfs.namenode.rpc-address.ns.nn1实际NN入口
定义client rpc访问zk内的NN的实际 host:port
所有虚拟NN节点都要配置 nn1 nn2
hadoop20.baizhiedu.com:8020
dfs.namenode.http-address.ns.nn1实际NN web入口
定义client webhttp访问zk内NN的实际 host:port
所有虚拟NN节点都要配置 nn1 nn2
hadoop20.baizhiedu.com:50070
dfs.namenode.shared.edits.direditslog-rpc同步url
NN的editslog被共享在zk的QJN中,
这是定义位置QJN的RPC地址
最后要以/虚拟入口ip结尾
qjournal://hadoop20.baizhi.com:8485;
hadoop21.baizhi.com:8485;
hadoop22.baizhi.com:8485/ns
dfs.journalnode.edits.direditslog位置
定义journal保存editslog的路径位置,任意。
/opt/installs/zookeeper3.4.14/journal/data
dfs.ha.automatic-failover.enabled开启自动故障切换true
dfs.client.failover.proxy.provider.ns故障切换使用的工具类org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods故障切换使用的方案:远程杀死sshfence
dfs.ha.fencing.ssh.private-key-files免密远程连接节点/root/.ssh/id_rsa

思路图:

在这里插入图片描述

  1. 设置所有slaves(不变)

  2. 讲配置文件同步到所有hadoop节点

scp -r /opt/installs/hadoop2.8.3/etc/hadoop root@hadoop21.baizhi.com:/opt/installs/hadoop2.8.3/etc

启动HAHadoop
  1. 启动各个节点的zkServer.sh (出现QuorumPeerMain进程)

zkServer.sh start

  1. 创建命名空间,在主namenode节点下执行(主机

./hdfs zkfc -formatZK

  1. 启动QJN的节点服务(所有jn节点都启动)出现Journalnode的java进程

./hadoop-deamon.sh start journalnode

  1. 在zk主机格式化namenode和所有的QJN。(主机)

./hdfs namenode -format ns

说明:ns就是虚拟ip,为了便于该命令找到所有的QJN

  1. 在zk主机启动namenode服务(主机)

./hadoop-deamon.sh start namenode

  1. 在zk的备机,启动standby(备机

./hdfs namenode -boostrapStandby

  1. zk备机,启动namenode(备机

./hadoop-deamon.sh start namenode

  1. 两个zk节点,启动自动切换机制

./hadoop-deamon.sh start zkfc

  1. 启动所有datanode

hadoop-deamon.sh start datanode

  1. web访问namenode的节点验证自动切换的问题。
① kill掉active的namenode,查看standby 从机的切换效果。
		测试故障切换
② 在active的namenode上传一个文件,然后kill掉,查看新切换的active的namenode的文件信息,发现也有数据。
		测试 standby充当了secondaryNameNode和备份数据的作用。
HA启动顺序总结

初始化ZK
在这里插入图片描述

总结

核心服务

  1. Namenode
① 作为HDFS分布式文件系统的master主机,统领所有datanode;
② 接收client的访问:hdfs协议和http协议;
③ 保存了元数据:文件名 路径 大小 所有者 所属组 权限 修改时间 副本数 块与datanode映射关系(通过这个才能到对应dn获得真正的数据);
④ 数据保存在内存中。
⑤ 保存元数据的持久化信息:FsImage和editslog数据。
  1. DateNode
① 存储真正的数据的Block 单个最大128M
② block的元数据、checksum和编号。
③ 心跳,向NameNode汇报当前节点的健康状态。(没心跳,则标记宕机)
④ 周期汇报datanode的所有block的校验和等数据,确保数据的正确性。
  1. Client
① 可以是命令行可以使java程序。
② client访问namenode确定数据相关信息以及是否存在(如果存在就返回已经存在)。
③ client真正操作数据会与所有的datanode直接通信。
	上传,会与最近的datanode通信。
	下载,会与所有存储了block的datanode通信。
  1. SecondaryNameNode
NameNode持久化助理,代替NameNode完成FSImageEditslog的合并过程。(checkpoin)

关键数据

  1. FSImage
① 完整的集群下的所有block数据的元数据。
  1. Editslog
① 保存了每一次HDFS的文件操作的日志信息。

HA模式

  1. Zookeeper
① 集群管理器,自动故障切换,解决单点问题。
② 管理journalnode,保存hdfs的日志信息,保障editslog和hdfs合并,以及故障切换的快速。
③ 操作投票,保证
  1. journalNode
① 管理editslog文件信息。
  1. leader+follower
① zk集群领导者,负责接收总请求。
② 协调zk集群所有成员对写请求进行投票,超过半数节点返回成功,该操作即可成功。(确保操作的可靠性,效率几乎不降低)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值