MapReduce 分组
shuffle的分组
map—-shuffle—–reduceshuffle:分区—-排序—-分组
分组到底是怎么分组的:按照map的key进行分组的
默认的类型
对Reduce的结果进行打印输出。
1234567891011121314wc: 000000000000000000000000000 hadoop----------------64 hadoop----------------64 hadoop----------------64 hadoop----------------64 000000000000000000000000000 hadoophello----------------1 hadoophello----------------1 hadoophello----------------1 hadoophello----------------1 相同的key为一组 默认的是key一直随着value指针变化而变化的 只不过默认的key都是一样的
自定义的类型:按照自定义类型 ...
reducetask的并行度
reducetask的并行度
一个yarnchild 对应一个maptask
1个reucetask任务对应的就是MyReducer的计算量, 运行reduce任务的并行度
默认情况下 reducetask的个数只有1个, 一个reducetask只能运行在一个节点上。
通过wordcount的结果我们可以看出也是只有一个reducetask。
当数据量很大时候 只有一个reducetask不合理的
这个reducetask的压力很大
负载不均衡
设置reducetask个数
reducetask也应该根据我们的实际的数据 设置多个
如何设置:
代码设置12//设置reducetask的个数job.setNumReduceTasks(tasks);
参数代表就是reducetask的个数 需要几个reducetask的时候 设置为几就可以。
这个参数值的默认为,默认情况只运行一个reducetask。
job.setNumReduceTask(3);发现输出的结果3个文件 1个标志文件
part-r-00000
part-r-00001
part-r-00 ...
maptask的并行度
MapReduce task任务maptask的并行度:map阶段的分布式运行
整个map阶段的任务被分成了几个小任务,运行每一个小任务就称为一个maptask任务,一个maptask对应的是计算的任务量注意:一个maptask任务只能运行在一个节点上,一个节点上可以运行多个maptask任务的整个任务被分成几个maptask任务,取决于节点的数据量。
maptask的任务数的条件
对4个文件进行统计
大小1.42kb
3个从节点 datanode nodemanager
在进行 MapReduce任务的时候,发现在 Map阶段执行 jps 命令的时候,可以看到控制台出现4个yarnchild。yarnchild—–maptask任务—-mapper类1个yarnchild—–1个maptask任务
问题:maptask任务和数据有关的? 还是和数据的文件个数有关?
假设文件个数假设和数据的文件个数有关,那么4份1T数据:4maptask 分别处理 1T的数据,
假设有10个节点,最多运行在4个节点上,那么会剩下6个节点没有事情做 – 负债不均衡
1)负载不均衡 ...
2019的单身节
a78f0121370a7c499b98d3b76be39091a0b822662ec60ebc99dc6dd9e0190d25bdc831b2a10f648129de19e92d9c86a0a9813c608085aa041275b2f308259c763e43a909f95932229b3d325e6d631c9e29f38d3df775cefc7a6761dee6dc917400b4ebbb407a90a807b5a3ad3525cc65f81048469b4ea10c16d5b41a4b43c8d6b16eeaa03d91c7ae254b9bb9ea151717a5c65fb280643d3cb8036c7fad00b17afd5d8a9a6dbe63c625a09c2790e68fc81cfa00e4b4cc19dbfb6304501f9ee04a3be50234fde31c029096ae93cdfb9c14bfe38649c6ed0a35cce57e35a12fca5b4e5c5a2fcb161ef94a2f0f43bdc03562254e173a0e0716328 ...
Writable接口与序列化机制
Writable接口与序列化机制一、序列化概念
序列化(Serialization)是指把结构化对象转化为字节流。
反序列化(Deserialization)是序列化的逆过程。即把字节流转回结构化对象。
Java序列化(java.io.Serializable)
二、Hadoop序列化的特点
序列化格式特点:
紧凑:高效使用存储空间。
快速:读写数据的额外开销小
可扩展:可透明地读取老格式的数据
互操作:支持多语言的交互
Hadoop的序列化格式:Writable
三、Hadoop序列化的作用
序列化在分布式环境的两大作用:进程间通信,永久存储。
Hadoop节点间通信。
123节点1->节点2: 二进制流消息Note right of 节点2: 二进制流反序列化为消息Note left of 节点1: 消息序列化为二进制流
四、Writable接口Writable接口, 是根据 DataInput 和 DataOutput 实现的简单、有效的序列化对象.
MR的任意Key和Value必须实现Writable接口.
12345678910111213 ...
Mapreduce编程
mapreduce编程
跑一个mapreduce程序 需要yarn
执行命令:hadoop jar jar包文件路径(绝对的、相对的) 主函数 参数
12345678910# 上传文件到 hadoop[root@hadoop01 hadoop3.2.1]# history |grep hadoop 136 hadoop fs -mkdir /inhadoop fs -mkdir /in 137 hadoop fs -out LICENSE.txt /in/01.txt 138 hadoop fs -put LICENSE.txt /in/01.txt 139 hadoop fs -put LICENSE.txt /in/02.txt 140 hadoop fs -put LICENSE.txt /in/03.txt[root@hadoop01 mapreduce]# pwd/usr/local/hadoop3.2.1/share/hadoop/mapreduce[root@hadoop01 mapreduce]# hadoop jar hadoop-mapre ...
HDFS文件上传下载源码分析
文件上传源码分析先上文件上传的方法调用过程时序图
其主要执行过程:
1、FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信
2、调用FileSystem的create()方法,由于实现类为DistributedFileSystem,所以是调用该类中的create()方法
3、DistributedFileSystem持有DFSClient的引用,继续调用DFSClient中的create()方法
4、DFSOutputStream提供的静态newStreamForCreate()方法中调用NameNodeRpcServer服务端的create()方法并创建DFSOutputStream输出流对象返回
5、通过hadoop提供的IOUtil工具类将输出流输出到本地
下面我们来看下源码:
首先初始化文件系统,建立与服务端的RPC通信:
调用FileSystem的create()方法,由于FileSystem是一个抽象类,这里实际上是调用的该类的子类create()方法
12345678public abstract ...
HDFS的二大核心
上传
客户端向namenode发送文件上传的请求,即通过RPC与NameNode建立通讯。
namenode进行一系列的检查(权限|父目录|文件是否已经存在)
namenode检查通过,会向客户端响应
客户端会向namenode发送文件上传的真正的请求,这个请求中包含文件的长度。
namenode会根据客户端发送的请求中的文件的长度,计算数据块的个数,并获取集群中的副本的配置信息,给客户端返回当前数据每一个数据块需要存放的节点.(NameNode与各DataNode使用心跳机制来获取DataNode信息。NameNode收到Client请求后,获取DataNode信息,并将可存储文件的节点信息返回给Client。)123hadoop.wmv 204m ,3个副本blk01:[hadoop01,hadoop03,hadoop04]blk02:[hadoop01,hadoop02,hadoop04]
client收到NameNode返回的信息,与对应的DataNode节点取得联系,并向该节点写文件.
客户端开始准备文件上传.
客户端进行逻辑切块,仅仅是一个偏移量的范围划分
客户端开始 ...
HDFS的四大机制
心跳机制
机架策略
负载均衡
安全模式
心跳机制
hdfs主从架构 主namenode 从datanode
在hdfs的整个运行过程中需要datanode定时的向namenode发送心跳报告namenode可通过心跳报告确定datanode是可以正常工作的
发送心跳报告的作用
报告自己的存活状况
报告自己的块信息
心跳报告的周期:3s不能过长 不能太短
每隔3s datanode会向namenode发送一个心跳报告
12345<property> <name>dfs.heartbeat.interval</name> <value>3</value> <description>Determines datanode heartbeat interval in seconds.</description></property>
判断宕机的条件
namenode如何判断一个datanode宕机了?
连续的10次心跳报告接受不到
连续30s接受不到datanode的心 ...
Zookeeper 原理
Zookeeper 原理。