大数据概况和Hadoop生态系统

一.大数据概况

  • 1.什么是大数据?
  • 大数据是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。
  • 2.大数据的特征
  • 1)4V特征
  • Volume(大数据量):90% 的数据是过去两年产生
  • Velocity(速度快):数据增长速度快,时效性高
  • Variety(多样化):数据种类和来源多样化结构化数据、半结构化数据、非结构化数据
  • Value(价值密度低):需挖掘获取数据价值
  • 2)固有特征
  • 时效性
  • 不可变性
  • 3.分布式计算
  • 分布式计算将较大的数据分成小的部分进行处理。
  • 传统分布式计算和Hadoop分布式计算比较如下:
传统分布式计算 新的分布式计算 - Hadoop
计算方式 将数据复制到计算节点 在不同数据节点并行计算
可处理数据量 小数据量 大数据量
CPU性能限制 受CPU限制较大 受单台设备限制小
提升计算能力 提升单台机器计算能力 扩展低成本服务器集群

二.Hadoop介绍

1.Hadoop概念

  • Hadoop是一个开源分布式系统架构
  • 分布式文件系统HDFS——解决大数据存储
  • 分布式计算框架MapReduce——解决大数据计算
  • 分布式资源管理系统YARN
  • 处理海量数据的架构首选
  • 非常快得完成大数据计算任务
  • 已发展成为一个Hadoop生态圈

2.使用Hadoop原因

  • 高扩展性,可伸缩
  • 高可靠性 -->多副本机制,容错高
  • 低成本
  • 无共享架构
  • 灵活,可存储任意类型数据
  • 开源,社区活跃

3.Hadoop与关系型数据库对比

RDBMS Hadoop
格式 写数据时要求 读数据时要求
速度 读数据速度快 写数据速度快
数据监管 标准结构化 任意结构数据
数据处理 有限的处理能力 强大的处理能力
数据类型 结构化数据 结构化,半结构化,非结构化
应用场景 交互式OLAP分析,ACID事务处理,企业业务系统 处理非结构化数据,海量数据存储计算

4.Hadoop生态圈

生态

  • Hadoop核心
  • HDFS、MapReduce、YARN
  • 数据查询分析
  • Hive、Pig、Impala、Presto
  • 协调管理
  • HCatalog、Zookeeper、Ambari
  • 数据迁移
  • Sqoop、Flume
  • Spark、NoSQL、机器学习、任务调度等

5.Zookeeper

  • 是一个分布式应用程序协调服务
  • 解决分布式集群中应用系统的一致性问题
  • 提供的功能
  • 配置管理、命名服务、分布式同步、队列管理、集群管理等
  • 特性
  • 全局数据一致
  • 可靠性、顺序性、实时性
  • 数据更新原子性
  • Zookeeper集群
  • 角色:Leader、Follower、Observer

6.Hadoop架构

  • HDFS(Hadoop Distributed File System)
  • 分布式文件系统,解决分布式存储
  • MapReduce
  • 分布式计算框架
  • YARN
  • 分布式资源管理系统
  • 在Hadoop 2.x中引入
  • Common
  • 支持所有其他模块的公共工具程序

7.HDFS特点

  • HDFS优点
  • 支持处理超大文件
  • 可运行在廉价机器上
  • 高容错性
  • 流式文件写入
  • HDFS缺点
  • 不适合低延时数据访问场景
  • 不适合小文件存取场景
  • 不适合并发写入,文件随机修改场景

8.HDFS CLI (command line)

  • 基本格式
  • hdfs dfs -cmd
  • hadoop fs -cmd(已过时)
  • 命令和Linux相似
  • -ls 查看
  • -mkdir 创建目录
  • -put 将本地文件传输到hdfs目录下
  • -rm 删除
  • -du 统计目录下文件大小
  • -get 将hdfs文件copy到本地文件
  • -help 帮助
  • hdfs dfsadmin 命令用于管理HDFS集群,说明如下:
命令 说明
hdfs dfsadmin -report 返回集群的状态信息
hdfs dfsadmin -safemode enter/leave 进入和离开安全模式
hdfs dfsadmin -saveNamespace 保存集群的名字空间
hdfs dfsadmin -rollEdits 回滚编辑日志
hdfs dfsadmin -refreshNodes 刷新节点
hdfs dfsadmin -getDatanodeInfo node1:8010 获取数据节点信息
hdfs dfsadmin -setQuota 10 /hdfs 设置文件目录配额

三.详解HDFS分布式存储文件系统

1.HDFS角色

  • Client:客户端
  • NameNode (NN):元数据节点
  • 管理文件系统的Namespace/元数据
  • 一个HDFS集群只有一个Active的NN
  • DataNode (DN):数据节点
  • 数据存储节点,保存和检索Block
  • 一个集群可以有多个数据节点
  • Secondary NameNode (SNN):从元数据节点
  • 合并NameNode的edit logs到fsimage文件中
  • 辅助NN将内存中元数据信息持久化

2.HDFS副本机制

  • Block:数据块
  • HDFS最基本的存储单元
  • 默认块大小:128M(2.x)
  • 副本机制
  • 作用:避免数据丢失
  • 副本数默认为3
  • 存放机制:
  • 一个在本地机架节点
  • 一个在同一个机架不同节点HDFS高可用(High Availability)
  • 一个在不同机架的节点

3.HDFS高可用(High Availability)

  • 在1.x版本中
  • 存在Namenode单点问题
  • 在2.x版本中
  • 解决:HDFS Federation方式,共享DN资源
  • Active Namenode -->对外提供服务
  • Standby Namenode 是NameNode的备用节点
  • Active故障时可切换为Active

4.HDFS文件格式

  • HDFS支持以不同格式存储所有类型的文件
  • 文本、二进制
  • 未压缩、压缩
  • 为了最佳的Map-Reduce处理,文件需可分割
  • SequenceFile
  • Avro File
  • RCFile&ORCFile
  • Parquet File

四.使用java实现HDFS文件读写(实质是hadoop所在系统和hdfs文件系统之间读写操作)

  • 1.先建一个maven项目
  • 2.在pom.xml文件的依赖包标签<dependencies>下添加如下内容,等几分钟下载相关的依赖包:
<dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
  • 3新建两个类如下:
package HDFS.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author sunyong
 * @date 2020/06/29
 * @description
 * 向本地写入hdfs文件系统的文件
 */
public class WriteToLocal {
    public static void writeToHdfs(String hdfsFile,String hdfsUrl,String fileName) throws IOException {
        Configuration cfg=new Configuration();
        cfg.set("fs.defaultFS",hdfsUrl);
        FileSystem fs = FileSystem.get(cfg);
        //hdfs存在才可以写入
        if (fs.exists(new Path(hdfsFile))) {
            FileOutputStream fos = new FileOutputStream(fileName);
            FSDataInputStream fsdis = fs.open(new Path(hdfsFile));
            byte[] bytes=new byte[2048];
            //首次读
            int count=fsdis.read(bytes,0,2048);
            while (count>0){
                fos.write(bytes,0,count);
                count=fsdis.read(bytes,0,2048);
            }
            fsdis.close();
            fos.close();
            fs.close();
        }
    }
    public static void main(String[] args) throws IOException {
        writeToHdfs(args[0],args[1],args[2]);
    }
}

package HDFS.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author sunyong
 * @date 2020/06/29
 * @description
 * 向hdfs写入linux系统本地文件
 */
public class WriteToHdfs {
    public static void writeToHdfs(String hdfsFile,String hdfsUrl,String fileName) throws IOException {
        Configuration cfg=new Configuration();
        cfg.set("fs.defaultFS",hdfsUrl);
        FileSystem fs = FileSystem.get(cfg);
        //hdfs存在才可以写入
        if (fs.exists(new Path(hdfsFile))) {
            FSDataOutputStream fsdos = fs.create(new Path(hdfsFile));
            FileInputStream fis = new FileInputStream(fileName);
            byte[] bytes=new byte[2048];
            //首次读
            int count=fis.read(bytes,0,2048);
            while (count>0){
                fsdos.write(bytes,0,count);
                count=fis.read(bytes,0,2048);
            }
            fis.close();
            fsdos.close();
            fs.close();
        }
    }

    public static void main(String[] args) throws IOException {
        writeToHdfs(args[0],args[1],args[2]);
    }
}

  • 4.打jar包,将jar包传输到hadoop安装目录的share目录下,如下图:
    在这里插入图片描述
  • 5.启动hadoop的hdfs服务,执行hdfs dfs -touchz /c.txt,在hdfs文件系统中创建一个空文件
  • 6.在hadoop环境执行如下命令,向hdfs文件系统中写入文件(从本地读一个文件):hadoop jar /opt/install/hadoop/share/HDFS_Practice.jar HDFS.hdfs.WriteToHdfs /c.txt hdfs://hadoop110:9000 /etc/profile
  • 7.若执行无错误,查看内容: hdfs dfs -cat /c.txt,效果如下:
    在这里插入图片描述
  • 8.在Hadoop环境执行如下命令,向本地写入文件(从hdfs读一个文件): hadoop jar /opt/install/hadoop/share/HDFS_Practice.jar HDFS.hdfs.WriteToLocal /c.txt hdfs://hadoop110:9000 a.txt
  • 9.若执行无错误,查看内容: cat a.txt,效果如下:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/107013514