大数据概况及Hadoop生态系统

一、初识大数据

了解大数据是什么。
了解大数据的特性。
了解大数据带给企业哪些方面的挑战。

1.大数据的基本概念
大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

2.大数据的特性

(1)4V特征:
a. Volume(大数据量):90% 的数据是过去两年产生
b.Velocity(速度快):数据增长速度快,时效性高
c.Variety(多样化):数据种类和来源多样化
结构化数据、半结构化数据、非结构化数据
d.Value(价值密度低):需挖掘获取数据价值

(2)固有特征
a.时效性
b.不可变性

3.大数据带来的挑战

(1)对现有数据库的挑战
随着互联网时代的到来,现在产生的数据如果想存储在传统数据库里是不太现实的,即便传统的数据库有集群的概念,仍然不能处理TB量级的数据。而且现阶段产生的数据类型很多,有些类型的数据是没办法使用结构化数据查询语言(SQL)来处理。

(2)实时性的技术挑战
我们知道数据产生的价值会随着时间的流逝而大大降低,所有当数据产生后我们要尽可能快地进行处理,传统的离线批处理时间的要求并不高。而实时处理的要求是区别大数据应用和传统数据库技术或离线技术的关键差别之一。

(3)对数据中心、运维团队的挑战
如今每天产生的数据量正呈爆炸式增长,那么如此多的数据该怎样进行高效的收集、存储、计算都是数据中心要面临的棘手的问题。而处理快速增长的数据量所需要的机器也日益增多,那么对于运维团队来说压力也会增大。

二、初识Hadoop

了解Hadoop是什么。
了解Hadoop的发展及版本。
了解Hadoop的核心组件及功能。
了解Hadoop生态圈。
了解Hadoop使用的优点。
了解Hadoop与关系型数据库对比。

1.什么是Hadoop

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

2.Hadoop发展及版本

(1)Hadoop起源于搜索引擎Apache Nutch
创始人:Doug Cutting
2004年 - 最初版本实施
2008年 - 成为Apache顶级项目

(2)Hadoop发行版本
社区版:Apache Hadoop
Cloudera发行版:CDH
Hortonworks发行版:HDP

3.Hadoop的核心组件及功能

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

3.2 HDFS(分布式文件系统)

(1)Hadoop 生态圈的基本组成部分是Hadoop 分布式文件系统(HDFS)。大数据处理框架如MapReduce 或者Spark 等要处理的数据源大部分都是存储在HDFS之上,Hive或者HBase 等框架的数据通常情况下也是存储在HDFS之上。简而言之,HDFS为大数据的存储提供了保障。

(2)HDFS使用的优缺点
HDFS优点
a.支持处理超大文件
b.可运行在廉价机器上
c.高容错性
d.流式文件写入

HDFS缺点
a.不适合低延时数据访问场景
b.不适合小文件存取场景
c.不适合并发写入,文件随机修改场景

(3)HDFS角色
Client:客户端

NameNode (NN):元数据节点
管理文件系统的Namespace/元数据
一个HDFS集群只有一个Active的NN

DataNode (DN):数据节点
数据存储节点,保存和检索Block
一个集群可以有多个数据节点

Secondary NameNode (SNN):从元数据节点
合并NameNode的edit logs到fsimage文件中
辅助NN将内存中元数据信息持久化

(4)HDFS副本机制

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

(5)HDFS高可用(High Availability)

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

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

3.3 MapReduce(分布式计算框架)
MapReduce 是一个分布式、并行处理的编程模型。开发人员只需要编写Hadoop的MapReduce作业就能使用存储在HDFS中的数据来按成相应的数据处理功能。
在这里插入图片描述
3.4 YARN(分布式资源管理系统)
YARN是Hadoop2.x 之后对Hadoop1.x之前JobTracker 和 TaskTracker 模型进行优化而诞生的,主要负责整个系统的资源管理和调度,而且在YARN之上能运行各种不同类型(MapReduce、Tez、Spark)的执行框架。

4.Hadoop生态圈
在这里插入图片描述
Hadoop核心
HDFS、MapReduce、YARN
数据查询分析
Hive、Pig、Impala、Presto
协调管理
HCatalog、Zookeeper、Ambari
数据迁移
Sqoop、Flume
Spark、NoSQL、机器学习、任务调度等

5.Hadoop使用的优点

a.高扩展性,可伸缩
b.高可靠性
多副本机制,容错高
c.低成本
d.无共享架构
e.灵活,可存储任意类型数据
f.开源,社区活跃

6.Hadoop与关系型数据库对比
在这里插入图片描述

三、HDFS CLI (命令行)

1.基本格式
(1)hdfs dfs -cmd
(2)hadoop fs -cmd(已过时)

2.命令和Linux相似
(1)-ls
(2)-mkdir
(3)-put
(4)-rm
(5)-help

3.dfsadmin命令用于管理HDFS集群
在这里插入图片描述

四、使用Java实现HDFS与Hadoop系统之间的操作

1.对文件的读和写案例
(1)先创建一个maven项目(流程如下)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:这里找到maven下的settings.xml 文件
在这里插入图片描述
(2)在pom.xml文件的依赖包标签下添加如下内容,等几分钟下载相关的依赖包:

 <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.6.0</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>2.6.0</version>
  </dependency>
  <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
  </dependency>

(3)创建TestHDFS、TestHDFS1类如下:
在这里插入图片描述
TestHDFS

package cn.kgc.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;

public class TestHDFS {
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);
    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]);
}
}

TestHDFS1

package cn.kgc.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestHDFS1 {
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);
    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]);
}
}

(4)打jar包,并拖到hadoop安装目录下的share目录下(可打一个包或者分开)
在这里插入图片描述
(5)启动hadoop的hdfs服务,执行hdfs dfs -touchz /b.txt,在hdfs文件系统中创建一个空文件

(6)在hadoop环境执行如下命令,向hdfs文件系统中写入文件(从本地读一个文件):hadoop jar hdfsTest.jar cn.kgc.hdfs.TestHDFS /b.txt hdfs://hadoop101:9000 /etc/profile

(7)查看内容: hdfs dfs -cat /b.txt,效果如下:
在这里插入图片描述
(8)在Hadoop环境执行如下命令,向本地写入文件(从hdfs读一个文件)::hadoop jar hdfsTest1.jar cn.kgc.hdfs.TestHDFS1 /b.txt hdfs://hadoop101:9000 /c.txt

(9)若执行无错误,查看内容: cat /c.txt,效果如下:
在这里插入图片描述
2.对文件进行上传、下载、删除操作案例
(1)新建一个Java 项目,重复上面1(2)步骤,等待下载好依赖包

(2)创建resource配置文件目录(步骤如下)
在这里插入图片描述
在这里插入图片描述
(3)新建一个resource,之后点一下上方的Resources
在这里插入图片描述
(4)在resource目录下新建log4j.proerties配置文件,内容如下:
在这里插入图片描述

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

(5)创建HDFSClient类,代码内容如下:
在这里插入图片描述

package cn.kgc.hadoop;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.testng.annotations.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

 public class HDFSClient {
//创建一个文件夹
@Test
public void testMkdirs() throws URISyntaxException, IOException, InterruptedException {
    //1.创建配置文件
    Configuration conf = new Configuration();
    //2.获取文件系统
    FileSystem fs = FileSystem.get(new URI("hdfs://192.168.133.101:9000"), conf, "root");
    //3.调试API操作
   fs.mkdirs(new Path("/HEHE"));
    //4.关闭资源
    fs.close();
}

//上传一个文件夹
  @Test
public void shangChuan() throws URISyntaxException, IOException, InterruptedException {
    //1.创建配置文件
    Configuration conf = new Configuration();
    //2.获取文件系统
    FileSystem fs = FileSystem.get(new URI("hdfs://192.168.133.101:9000"), conf, "root");
    //3.调试API操作
    fs.copyFromLocalFile(new Path("C:\\Users\\PC\\haha\\resource"), new Path("/HEHE"));
    //4.关闭资源
    fs.close();
}

//下载一个文件夹
@Test
public void xiaZai() throws URISyntaxException, IOException, InterruptedException {
    //1.创建配置文件
    Configuration conf = new Configuration();
    //2.获取文件系统
    FileSystem fs = FileSystem.get(new URI("hdfs://192.168.133.101:9000"), conf, "root");
    //3.调试API操作
    fs.copyToLocalFile(new Path("/HEHE/log4j.properties"), new Path("D://gao.txt"));
    //4.关闭资源
    fs.close();
}

//删除一个文件夹
@Test
public void shanChu() throws URISyntaxException, IOException, InterruptedException {
    //1.创建配置文件
    Configuration conf = new Configuration();
    //2.获取文件系统
    FileSystem fs = FileSystem.get(new URI("hdfs://192.168.133.101:9000"), conf, "root");
    //3.调试API操作
    fs.delete(new Path("/a.txt"), true);
    //4.关闭资源
    fs.close();
}
}

(6)分别执行上传、下载、删除操作
打开网页查看:192.168.133.101:50070
在这里插入图片描述
a.上传(从本地读一个文件到hdfs系统文件中),结果如下:
在这里插入图片描述
在这里插入图片描述
b.下载(从hdfs系统把文件读到本地目录下),结果如下:
在这里插入图片描述
c.删除(从hdfs系统中删除一个文件),结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值