Hadoop完整解析

文章目录

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

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

2:Hadoop的安装方式

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

   
   
  • 1
  • 2
  • 3

在这里插入图片描述

<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作为底层存储系统来存储分布式环境的数据

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

<2>HDFS的组成

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

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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的策略

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

<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的输入)

   
   
  • 1
  • 2
2)Shuffle
Shuffle流程:
map任务完成后产生的数据(k-v)存在缓冲区中,进行分区,排序,合并,缓冲区默认100m,阈值80%(达到80%就人物已经满了,如果满了,会将数据写到本地磁盘,这个过程称为溢写,写出到磁盘的称为溢写文件,每一个溢写文件都是分区切且排序完成的),交给recude任务前对所有溢写文件合并(merge)(意义是做到整体的分区与排序)
reduce任务通过http请求访问map任务中分区的数据(fetch过程,默认线程5),然后进行mergr,数据合并(相同键的值放在同一个地方留给迭代器访问)且排序(根据键排序)

   
   
  • 1
  • 2
  • 3
3)Reduce(可以没有)

在这里插入图片描述

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

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

<4>M/R 分析细节

1)分区 partitioner
默认是按照键的哈希码进行分区,可以自定义分区

   
   
  • 1
2)排序 sort
如果需要自己制定排序规则那么需要实现Comparable接口并重写CompareTo方法
注意需要键中包含排序对象,可以指定二次排序,注意需要键中包含排序对象,且一般做排序时,不需要reduce

   
   
  • 1
  • 2
3)合并combiner

在这里插入图片描述

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

   
   
  • 1

<5>M/R JAVA代码分析

1)Map任务
自定义Map处理逻辑要实现Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 接口	
实现map(KEYIN, VALUEIN,Context context)方法
其中KEYIN 输入数据这一行的偏移量
       VALUEIN 这一行的输入数据
       KEYOUT 输出的键的类型
       VALUEOUT 输出的值的类型

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2)Reduce任务
自定义Reduce处理逻辑要实现Reduce<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 接口	
实现reduce(KEYIN, Iterator<VALUEIN>,Context context)方法
其中
KEYIN Map任务输入的键的类型         
Iterator<VALUEIN> 根据键分区获得所有value的迭代器 
 KEYOUT 最后输出的键的类型
VALUEOUT 最后输出的值的类型

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
4)自定义的bean
要实现WritableComparable<K>接口
既满足了对象可反序列化与序列化的要求
还可以自定义排序(一次或者二次排序)规则,其中排序时必须将排序对象作为键(键为排序对象或者包含排序对象即可)
参数-this(从大到小)
this-参数(从小到大)

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
5)分区(默认从0号分区开始)

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

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

1)自定义输出格式

在这里插入图片描述

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

 
 
  • 1

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

<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记录着核数与需要的内存等信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
3)分析

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

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

1)ip去重(ip.txt)(基本)
略.

 
 
  • 1
2)统计每一个人在每一个城市产生的总流量(flow.txt)(分区应用)
若指定手机号(规则是一个人对应一个手机号,一个手机号只对应一个人),那么分区时必须指定城市,若不指定,则按照键(手机号)分区那么结果错误

 
 
  • 1
3)利润求和后排序(profit.txt)(排序应用)
第一次M/R输出总利润
第二次M/R排序
1.先自定义类实现WritableComparable<K>
2.重写CompareTo方法

 
 
  • 1
  • 2
  • 3
  • 4
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互为陌生人
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
5)学生每个月的总成绩(score1目录下三个文件)(slide应用或者分区)
english.txt与math.txt放入缓存
chinese.txt使用map来处理

 
 
  • 1
  • 2

6.Hadoop生态系统

在这里插入图片描述

1.HDFS Hadoop分布式文件系统

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

 
 
  • 1
  • 2
  • 3

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

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

 
 
  • 1

3.HBASE 分布式列存数据库

在这里插入代码片

 
 
  • 1

4.Zookeeper 分布式协作服务

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

 
 
  • 1
  • 2

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

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

 
 
  • 1
  • 2

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



 
 
  • 1

7.Sqoop 数据ETL/同步工具

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

 
 
  • 1
  • 2

8.Flume 日志收集工具

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

 
 
  • 1

9.Mahout 数据挖掘算法库

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

 
 
  • 1

10.Yarn 分布式资源管理器



 
 
  • 1

11.Phoenix hbase sql驱动



 
 
  • 1

12.Ambari 安装部署管理工具



 
 
  • 1
                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                                            <div class="more-toolbox">
            <div class="left-toolbox">
                <ul class="toolbox-list">
                    
                    <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#csdnc-thumbsup"></use>
                    </svg><span class="name">点赞</span>
                    <span class="count">14</span>
                    </a></li>
                    <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-Collection-G"></use>
                    </svg><span class="name">收藏</span></a></li>
                    <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-fenxiang"></use>
                    </svg>分享</a></li>
                    <!--打赏开始-->
                                            <!--打赏结束-->
                                            <li class="tool-item tool-more">
                        <a>
                        <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                        </a>
                        <ul class="more-box">
                            <li class="item"><a class="article-report">文章举报</a></li>
                        </ul>
                    </li>
                                        </ul>
            </div>
                        </div>
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/qq_38061534">
                <img src="https://profile.csdnimg.cn/B/F/9/3_qq_38061534" class="avatar_pic" username="qq_38061534">
                                        <img src="https://g.csdnimg.cn/static/user-reg-year/1x/3.png" class="user-years">
                                </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_38061534" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">Sunny_god</a></span>
                                        </div>
                <div class="text"><span>发布了16 篇原创文章</span> · <span>获赞 18</span> · <span>访问量 3万+</span></div>
            </div>
                            <div class="right-message">
                                        <a href="https://im.csdn.net/im/main.html?userName=qq_38061534" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                    </a>
                                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                </div>
                        </div>
                </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值