Hadoop完整解析

文章目录

1:首先了解一下Hadoop是什么以及能为我们做些什么

https://blog.csdn.net/zhang123456456/article/details/77657807

2:Hadoop的安装方式

!!!注意点:
为了保证远程云主机的内网地址本地可见 需要配置VPN访问
这也是为什么无法实现本地配置eclipse远程访问阿里云云主机HDFS存储系统的原因

在这里插入图片描述

<1>伪分布式安装(熟悉)

在这里插入图片描述
JPS命令下
查看共有
以下Hadoop相关的5个进程
1.namenode(HDFS)
2.secondaryNamenode(HDFS)
3.datanode(HDFS)
4.ResourceManager(M/R)
5.NodeManager(M/R)

<2>集群方式安装 (了解)

在这里插入图片描述

3:Hadoop中的基本模块

在这里插入图片描述

4:HDFS

<1>HDFS是什么

为上层提供高效的非结构化存储服务

1:DFS(分布式文件系统)
跨多台计算机或服务器的文件或文件夹
允许我们将数据存储在群集中的多个节点或机器上,并允许多个用户访问数据
2.HDFS
HDFS是基于Java的分布式文件系统
Hadoop是以HDFS作为底层存储系统来存储分布式环境的数据

<2>HDFS的组成

1:namenode 管理数据的节点
:元数据存储在内存(快速查询)与磁盘(崩溃恢复)中 
内容有:文件存储位置,切块数,文件块存储的datanode地址
:由fsimage与edits与fstime文件 内存与磁盘中的数据组成
:fsimage 存储元数据
:edits 存储HDFS的操作
:fstime 记录上一次的更新时间
2:secondaryNamenode 进行fsimage和edits的合并 起到一定的备份作用 但并不是namnode的热备份 namenode的备份需要借助journalnode
3.datanode 一个大的数据分块存储的节点

namenode管理流程
在这里插入图片描述
在这里插入图片描述
SecondaryNamenode合并过程
在这里插入图片描述

<3>HDFS基本原理

1.HDFS存储数据时 先切块 分配一个递增的编号
2.数据备份 伪分布式为1 全分布式下默认3
3.复本放在不同的datanode中 
复本放置策略:机架感知策略
4.datanode宕机时 namenode管理 将这个datanode上存放的复本复制 保证复本符合设置个数
5.datanode向那么namenode放松心跳 从而使namnode保持对datanode的管理
心跳信息有:1.节点状态2.节点存储的数据
6.默认10分钟 心跳信息超时 执行4的策略

<4>HDFS的操作流程

读写删除流程

在这里插入图片描述

启动流程

<5>HDFS操作指令

在这里插入图片描述

<6>HDFS通过本地eclipse远程操控存取数据

在这里插入图片描述

<7> API操作

1.上传
2.下载

<8>HDFS的优缺点

1.优点
在这里插入图片描述
2.缺点

在这里插入图片描述

5:Map/Reduce

<1>用来做什么?

大规模数据集(大于1TB)的并行运算
MapReduce是将一个大作业拆分为多个小作业的框架

<2>处理计算流程

在这里插入图片描述
总体流程:
在这里插入图片描述

<3>流程细节

1)Map(必须有)
Map任务:首先获取切片(FileSplit )信息,一个切片对应一个MapTask,由逻辑块转到数据块读取,对输入文件解析成key value键值对,每一行数据调用一次map方法
map方法:自己编写逻辑,使用context的write方法输出(对应reduce的输入)
2)Shuffle
Shuffle流程:
map任务完成后产生的数据(k-v)存在缓冲区中,进行分区,排序,合并,缓冲区默认100m,阈值80%(达到80%就人物已经满了,如果满了,会将数据写到本地磁盘,这个过程称为溢写,写出到磁盘的称为溢写文件,每一个溢写文件都是分区切且排序完成的),交给recude任务前对所有溢写文件合并(merge)(意义是做到整体的分区与排序)
reduce任务通过http请求访问map任务中分区的数据(fetch过程,默认线程5),然后进行mergr,数据合并(相同键的值放在同一个地方留给迭代器访问)且排序(根据键排序)
3)Reduce(可以没有)

在这里插入图片描述

Reduce任务:对于多个map的输出按照不同分区得到的数据进行处理,再次输出到HDFS中
reduce方法:一个键对应一个reduce方法
省略reduce1的情况:
1)什么时候省略?
比如对原始数据进行排序,Format等
2)省略,也会默认生成一个但什么都不做,map的输出结果就作为最终的结果

<4>M/R 分析细节

1)分区 partitioner
默认是按照键的哈希码进行分区,可以自定义分区
2)排序 sort
如果需要自己制定排序规则那么需要实现Comparable接口并重写CompareTo方法
注意需要键中包含排序对象,可以指定二次排序,注意需要键中包含排序对象,且一般做排序时,不需要reduce
3)合并combiner

在这里插入图片描述

4)自定义类的序列化与反序列化
自定义的对象想要传输,这个对象对应的类必须实现Hadoop提供的序列化接口Writable

<5>M/R JAVA代码分析

1)Map任务
自定义Map处理逻辑要实现Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 接口	
实现map(KEYIN, VALUEIN,Context context)方法
其中KEYIN 输入数据这一行的偏移量
       VALUEIN 这一行的输入数据
       KEYOUT 输出的键的类型
       VALUEOUT 输出的值的类型
2)Reduce任务
自定义Reduce处理逻辑要实现Reduce<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 接口	
实现reduce(KEYIN, Iterator<VALUEIN>,Context context)方法
其中
KEYIN Map任务输入的键的类型         
Iterator<VALUEIN> 根据键分区获得所有value的迭代器 
 KEYOUT 最后输出的键的类型
VALUEOUT 最后输出的值的类型
3)Dirver驱动
Configuration conf = new Configuration();
		Job job = Job.getInstance(conf);
		
		// 需要给当前的job指定执行的入口类
		job.setJarByClass(WorldCountDriver.class);
		
		// 指定要执行的mapper
		job.setMapperClass(WordCountMapper.class);
		
		// 指定mapper执行完成之后的结果类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);
		
		// 指定要执行的reducer
		job.setReducerClass(WordCountReducer.class);
		
		// 指定reducer执行完成之后的结果类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		
		// 指定读取的文件
		FileInputFormat.setInputPaths(job, new Path("hdfs://路径:9000/mr/words.txt"));
		// 指定写出的路径
		FileOutputFormat.setOutputPath(job, new Path("hdfs://路径:9000/result"));
		
		job.waitForCompletion(true);
4)自定义的bean
要实现WritableComparable<K>接口
既满足了对象可反序列化与序列化的要求
还可以自定义排序(一次或者二次排序)规则,其中排序时必须将排序对象作为键(键为排序对象或者包含排序对象即可)
参数-this(从大到小)
this-参数(从小到大)
5)分区(默认从0号分区开始)

在这里插入图片描述
指定分区要实现Partitioner<K,V>接口
并且再Dirver驱动类中加入
在这里插入图片描述

<6>自定义输入与输出格式

1)自定义输出格式

在这里插入图片描述

2)自定义输入格式
需要继承自FileInputFormat类并写一个自定义类继承自RecordReader类重写initialize方法与nextKeyValue方法

应用场景:
在这里插入图片描述

<7>Slide缓存(主要是为了防止数据倾斜)

map slide join
将文件进行缓存并解析(Mapper中重写setup方法,此方法在MapReduce启动阶段会执行一次)
Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。
map端连接实例:

https://www.cnblogs.com/fengdashen/p/6610953.html

扩展:
reduce side join是一种最简单的join方式,其主要思想如下:
在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。即:map阶段的主要任务是对不同文件中的数据打标签。
在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。
Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输
为什么需要标记?
因为来自不同的文件 可能数据格式不统一,reduce端的处理根据文件的不同 处理方式也不同。
reduce端连接实例:

https://blog.csdn.net/xyilu/article/details/8996204

<8>Yarn(分布式资源管理器)

1)Hadoop1.0与Hadoop2.0中MapReduce的区别

1.0中资源调度与任务管理融合在了M/R中,2.0单独抽离出了Yarn来处理

2)Yarn核心
 将JobTracker和TaskTacker进行分离,它由下面几大构成组件:
 1. 一个全局的资源管理器 ResourceManager
 2.  ResourceManager的每个节点代理 NodeManager
 3. 表示每一个应用的ApplicationMaster
 4. 每一个ApplicationMaster拥有多个Container在NodeManager上运行,Container记录着核数与需要的内存等信息

3)分析

在这里插入图片描述
资源调度方器类型
1.容器调度器(默认)
2.FIFO调度器
3.Fair调度器

<9>一些M/R相关练习的思路

1)ip去重(ip.txt)(基本)
略.
2)统计每一个人在每一个城市产生的总流量(flow.txt)(分区应用)
若指定手机号(规则是一个人对应一个手机号,一个手机号只对应一个人),那么分区时必须指定城市,若不指定,则按照键(手机号)分区那么结果错误
3)利润求和后排序(profit.txt)(排序应用)
第一次M/R输出总利润
第二次M/R排序
1.先自定义类实现WritableComparable<K>
2.重写CompareTo方法
4)寻找隐藏好友(friend.txt)

定义:A认识B B认识C A不认识C 那么就说A和C互为对方的隐藏好友
性质:1.隐藏好友是相互的
性质:2.只存3种关系 直接好友 隐藏好友 陌生人

思路:
假设A认识B就记为 B-A 1
假设A的好友中都互相认识(可能是直接好友也可能是隐藏好友):记为C-A 2
最终如果是 Y-X 只有2 那么Y和X互为隐藏好友
                   Y-X 有1那么Y和X互为直接好友
                   Y-X 没有数字 那么Y和X互为陌生人

5)学生每个月的总成绩(score1目录下三个文件)(slide应用或者分区)
english.txt与math.txt放入缓存
chinese.txt使用map来处理

6.Hadoop生态系统

在这里插入图片描述

1.HDFS Hadoop分布式文件系统

1:流式数据访问
2:提供高吞吐量应用的程序数据访问功能,适合大型数据集
3.提供一次写入多次读取的机制,数据以块分布在集群中不同物理机器上

2.MapReduce 分布式计算框架(离线分析)

1.适合大量计算机组成的分布式并行环境里进行数据处理

3.HBASE 分布式列存数据库

在这里插入代码片

4.Zookeeper 分布式协作服务

解决分布式环境下的数据管理:
统一命名,状态同步,集群管理,配置同步

5.HIVE 数据仓库(离线分析)

HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这
些语句被翻译为Hadoop上面的MapReduce任务

6.Pig ad-hoc脚本(离线分析)


7.Sqoop 数据ETL/同步工具

用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是
Mapreduce程序,充分利用了MR的并行化和容错性

8.Flume 日志收集工具

个可扩展、适合复杂环境的海量日志收集系统

9.Mahout 数据挖掘算法库

经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等广泛使用的数据挖掘方法

10.Yarn 分布式资源管理器


11.Phoenix hbase sql驱动


12.Ambari 安装部署管理工具


  • 55
    点赞
  • 521
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值