大数据基础之Hadoop,初学必看

大数据概念:

大数据是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。

大数据特征:

分布式结构:
由于分布在不同的主机上的进程,协同工作,一起才能构成整个应用。
4V特征:
Volumn:体量大,单个数据体量大,数据条数也是海量。
Velocity:数据快,数据时效性高,由于数据基数大的原因,数据的操作必须要高速。
Variaty:样式多,可以存储多种类型的数据,包括结构化数据,例如表格,半结构化数据,例如日志、网址,和非结构化数据,例如图片、视频等。
Value:价值密度低,即单个数据并无意义,但是大量数据后才有一定价值

固有特性:时效性、不可变性

Hadoop应用:

Hadoop(相当于一个存储数据的大硬盘)
可靠的、可伸缩的、分布式计算的开源软件。
是一个框架、允许跨越计算机集群的大数据集处理,使用简单的编程模型(MapReduce)。
可从单个服务器扩展到几千台主机,每个节点提供了计算和存储的功能。而不是依赖高可用性的机器
而是依赖于应用层面上的实现。
Hadoop的三大核心:
1.HDFS:分布式文件系统,解决大数据的存储。(包含NameNode、DataNode、SecondaryNode)
2.MapReduce:基于yarn系统的大数据并行处理技术,解决大数据的计算。(包括ResourceManger、NodeManager)
3.yarn:作业调度和资源管理框架,一种资源协调者。
Hadoop生态圈:
在这里插入图片描述

HDFS

HDFS特点:
优点:
支持处理超大文件
高容错性
文件流写入
缺点:
不适合低延时数据访问场景,不能立刻对新数据做出反应。
不适合小文件频繁存储场景,因为每次读取文件,都要判断其属性(例如容量)。
不适合并发写入,文件随机修改场景
HDFS角色:
一、Client:客户端
二、NameNode(NN):元数据节点
1.管理文件系统的NameNode/元数据
 (元数据:是描述数据的数据。针对文件系统而言,一般将数据分为数据文件和元数据,元数据俗称inode,存储这文件属性、大小、权限、时间戳、链接等信息。维护HDFS文件系统中文件和目录的信息,分为内存元数据和元数据文件两种。NameNode维护整个元数据。)
2.一个HDFS集群只有一个Active的NN
三、DataNode(DN):数据节点
1.数据存储节点,保存和检索block
2.一个集群可以有多个数据节点
四、Secondary NameNode(SNN):从元数据节点
1.合并NameNode的edit logs到fsimage文件中
2.辅助NN将内存中的元数据信息持久化。
在这里插入图片描述
HDFS的副本机制(其安全性高的原因)
一、block:数据块
1.HDFS最基本的存储单元
2.默认块大小:128M(2.x)
为什么默认块大小为128M?
HDFS中平均寻址时间大概为10ms;
经过前人大量测试发现,寻址时间为传输时间的1%;
所以最佳的传输时间为:10/1%=1000ms=1s
目前磁盘的传输速率普遍为100MB/S
所以计算出最佳的block大小为100*1=100
所以设定block大小为128M
二、副本机制
1.作用:避免数据丢失
2.副本数默认为3
3.存放机制:
一个在本地机架节点
一个在同一个机架不同节点
一个在不同机架的节点
在这里插入图片描述
HDFS读文件原理:
在这里插入图片描述
1、客户端生成命令由Distributed FileSystem解析发送给NameNode节点,NameNode节点通过查询fsimage得到用户需要文件的DataNode节点位置(可能不止一个节点位置,因为在HDFS中文件都是被分块的,所以NameNode可能返回很多的块位置信息)。
2、客户端根据NameNode提供的多个块位置信息用字节输入流的方式去挑选一台DataNode(就近原则,随机选择)服务器,请求读取数据。
3、DataNode开始向客户端传输数据,文件读取完毕后关闭文件流。
HDFS写文件原理:
在这里插入图片描述
1、HDFS客户端首先将需要存储的数据分成若干块,然后通过Distributed FileSystem向NameNode发送存储请求。
2、NameNode通过ResourceManger得知当前处于空闲状态的数据节点的地址并返回给HDFS客户端。
3、HDFS根据NameNode提供的节点位置打开文件输出流向第一个节点写入数据并作为主副本,主副本会在本机架上再寻找一个数据节点作为第二个副本,第二个节点会在相邻或其他机架上再寻找一个节点作为第三个副本。当第三个节点写完数据后会通知第二个节点,当第二个节点完成后会通知第一个节点,第一个节点会将这三个节点的位置通过文件流的方式返回给HDFS客户端,然后关闭文件流。
4、HDFS客户端会将文件写入的三个节点位置返回给NameNode作为记录。

MapReduce

分布式计算框架
功能:将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务。(分而治之)
Map(映射)Reduce(归约)
1.MapReduce的特点
优点:
易于编程
可扩展性
高容错性
高吞吐量
不适合领域:
难以实时计算
不适合流式计算
2.MapReduce实现wordCount
在这里插入图片描述
1.基础原理:
Splitting:将一个完整的大容量Documents切分成一小段一小段(每段容量都为128MB),分配给各数据节点处理。
Map:各节点在内存中将一段数据分割成单词集生成键值对(单词为键,数量1为值),先不考虑重复,每个单词的数量都为1,最后将数据落盘。
Combine:各节点将单词的键值对汇总,凡是单词相同的(键相同),键值对的值就+1;从而将各单词的数量初步汇总。
Shuffle/Sort:各节点计算单词哈希值,将哈希值%节点数=>应存入的节点,(这里会出现重复单词的键值对)不考虑重复,节点容量超出,则将单词存入另外的新节点。
Reduce:将所有单词汇总,单词重复的键值对将值相加;最终得出各单词的键与值,从而实现单词的计数;

代码实现:
MapperReduce拥有两个接口:Mapper和Reduce
执行过程:
在这里插入图片描述
Mapper => Combiner => Partitioner => Shuffle and Sort => Reducer

程序执行过程中数据格式的定义:
map: (K1,V1) → list (K2,V2)
map函数接受的是一个键值对,键(K1)是文件名,值(V1)是文件的内容,map逐个遍历单词,每遇到一个单词(K2),就产生一个中间键值对<K2, 1>;汇总得到一串(值V2应该都为1)键值对,
reduce: (K2,list(V2)) → list (K3,V3)
reduce函数接收的多个键值对(map的结果的聚合),键(K2)为单词,值是一串"1"(最基本的实现是这样,但可以优化),然后将这些“1”累加就得到单词K2的出现次数。最终将所有单词的键值对汇总成List。

jar包:
在这里插入图片描述
Mapper类:

package com.kb.services.wc;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class MyMapper extends Mapper<LongWritable,Text,Text,LongWritable> {
    private LongWritable one = new LongWritable(1);
    private Text word = new Text();


    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] wds = value.toString().split(" ");
        for (String word : wds) {
            Text wd = new Text(word);
            context.write(wd,one);
        }
    }
}

MyMapper继承Mapper类并重写map方法
Mapper函数里的四个参数分别表示:
1.每一段的行号(偏移量)
2.每一行的内容
3.每一行被分割的每个单词
4.每个单词出现的次数,固定常量为1

Redece类:

package com.kb.services.wc;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class MyCombine extends Reducer<Text,LongWritable,Text,LongWritable> {
    private LongWritable res = new LongWritable();

    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        long ressum = 0;
        for (LongWritable one : values) {
            ressum+=one.get();
        }
        res.set(ressum);
        context.write(key,res);
    }
}

MyRedece继承Reducer类,并重写reduce方法
Reducer类里的四个参数分别表示:
1.表示前面统计的每个单词
2.表示经过shuffle处理后每个单词出现的次数
3.表示经过reduce处理后的单词
4.表示综合每个单词出现的次数
Driver类:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
 * Created by  HX  on 2020/6/4
 *
 * @Description:配置各类的数据类型
 */
public class MyDriver {
    public static void main(String[] args) throws Exception {
        Configuration cfg = new Configuration();
        //准备一个空任务
        Job job = Job.getInstance(cfg, "wc");
        //设置job任务的主启动类
        job.setJarByClass(MyDriver.class);
        //指定该任务的输入数据源
        FileInputFormat.addInputPath(job,new Path("e://abc.txt"));
        //设置你的Mapper任务类
        job.setMapperClass(MyMapper.class);
        //设置Mapper任务类的输出数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        //设置reduce任务类
        job.setReducerClass(MyReduce.class);
        //设置reducer任务类的输出数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        //设置任务的输出数据目录路径
        FileOutputFormat.setOutputPath(job,new Path("e://eee"));
        job.waitForCompletion(true);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值