赵壮-大数据方向-离线方向 扫二维码继续学习 二维码时效为半小时

(0评价)
价格: 免费

倒排索引:求取哪些单词在哪些文章里面出现过多少次

 

创建cn.itcast.demo2包

在包下创建IndexMain、IndexMapper、IndexReducer三个类

 

在IndexMapper类中,k1,v1类型为LongWritable,Text,k2,v2类型为Text,IntWritable

重写map方法

首先利用context.getInputSpilt();获取切片,在用FileSplit做一个强转,获取数据从哪个文档中来,定义为fileSplit

之后再用fileSplit.getPath().getName();获取文档的名字,定义为name字符串

利用value.toString().split(" ");对文档中的数据,也就是k1进行分割,并收集到split数组中去

循环遍历输出new Text(s+"-"+name),new InputWritable

 

在IndexReducer类中,k1,v1类型为Text,IntWritablet,k2,v2类型为Text,IntWritable

重写reduce方法

定义一个Int参数i,并初始化为0

将v2循环遍历 利用i += value.get();

输出k3,v3

 

IndexMain 不规矩

[展开全文]
CodeRookie · 2020-02-24 · 解锁式学习 0

创建包 cn.itcast.demo1.step2,在包下创建三个类 Step2Main、Step2Mapper、Step2Reducer

 

在Step2Mapper类中,导入的k1,v1类型为 LongWritable,Text,导出的k2,v2类型为Text,Text

重写map方法

先用value.toString().split("\t")对接收到的v1进行分割,得到用户列表和好友

split[0]为用户列表,split[1]为好友

再用split[0].split("-")对用户列表进行分割,并定义为userList

先对userList进行一个Array.sort()的操作,防止出现A-E E-A实际相同但reduce识别不相同的情况

进行双层循环,外层循环无法循环到数组中最后一个索引对应的值,内层循环则无法循环到数组中首个索引对应的值

首先先将循环遍历得到的值进行两两拼接userList[i] + "-" +userList[j],并定义为字符串userTwo

输出k2,v2

 

在Step2Reducer类中,导入的k2,v2类型为 Text,Text,导出的k3,v3类型为Text,Text

重写reduce方法

先用StringBuffer对v2进行一个字符串的拼接

循环遍历v2,对v2进行拼接

输出k3,v3  key不用动

 

Step2Main 老规矩

[展开全文]
CodeRookie · 2020-02-24 · 解锁式学习 0

在Main的java文件夹下创建 package cn.itcast.demo1.step1,并在该包下分别创建三个类Step1Main、Step1Mapper、Step1Reducer

 

Step1Mapper类中,导入k1,v1的类型为LongWritable,Text,导出k2,v2的类型为Text,Text

重写map方法

//输出数据如下格式  A:B,C,D,E,O

先用value.toString().split(":") 以冒号分开用户和好友列表   (split[0]就是用户名,split[1]就是好友列表)

再用split[1].split(",") 再以逗号将好友列表中的好友分开,放到friendList数组中去

再循环遍历输出 用户名和好友列表 为k2,v2

 

Step1Reducer类中,导入k2,v2的类型为Text,Text,导出k3,v3的类型为Text,Text

重写reduce方法

//reduce接收到数据是 B [A,E]

//B是好友,集合里面装的是多个用户

//将数据最终转换成这样的形式进行输出 A-B-E-F-G-H-K-  C

要进行的就是循环遍历接收到的v2数组,再降这些拼接成字符串

所以要用到StringBuffer();

之后再循环遍历中,在StringBuffer中进行字符串的追加,拼成A-B-E-F-G-H-K-

输出k3,v3

 

Step1Main  老规矩

[展开全文]
CodeRookie · 2020-02-24 · 解锁式学习 0

maptask的运行机制以及maptask的并行度

maptask的并行度,其实就是指指代有多少个maptask

 

FileInputFormat里面有一个方法:getSplits,这个方法返回的就是一个文件有多少个切片,一个切片对应一个maptask的任务

 

切片大小如何决定的

如果一个切片256M,那么一个512M的文件会产生两个切片,两个maptask

如果一个切片是128M,那么一个512M的文件产生四个切片,产生四个maptaks

 

获取文件切片的几个参数控制

mapred.min.split.size  没有配置的话默认值是1

mapred.max.split.size  没有配置的话默认值是Long.MAX_VALUE

如果没有配置参数,文件的切片大小就是128M,和block块大小相同

1kb的一个文件 一个block块 一个切片 1个maptask

300M的一个文件 三个Block块 三个切片 3个maptask

 

环形缓冲区的大小,涉及到maptask的调优过程。如果内存充足,可以将环形缓冲区的大小调大

[展开全文]
CodeRookie · 2020-02-23 · 解锁式学习 0

reduce端join算法的弊端

大量订单数据 少量商品数据

大量数据发送到reduce处理,reduce处理速度会变慢

reduce数量设置太少,处理速度会很慢

reduce数量设置太多,集群资源浪费严重

[展开全文]
CodeRookie · 2020-02-23 · 解锁式学习 0

mapreduce当中的规约

 

combine可以先对相同k2进行合并,减少发送到reduce阶段的k2的数量

数量减少能节约网络带宽

combiner就是一个reducer类,但是这个reducer类的输入和输出比较特殊

输入是k2,v2

输出还是k2,v2

只不过在map阶段进行了一次数据的聚合,减少了发送到reduce阶段的数据量

求平均值不能用combiner

combiner不能改变数据结果值,只是用于调用减少发送到reduce端的数据量

[展开全文]
CodeRookie · 2020-02-22 · 解锁式学习 0

MapReduce当中的排序:

模式是由排序功能的,按照字典顺序进行排序,对key2进行排序

Hadoop没有沿用java序列化serialize方式,实现了writable接口可以序列化

如果既需要序列化,也需要排序,可以实现writable和comparable或者WritableComparable

 

Writable序列化 Comparable排序

 

排序规则作用在key2上

 

如果以一行文本内容作为k2,不能够实现二次排序的功能

能不能把这两个字段封装成一个JavaBean当做我们的k2

[展开全文]
CodeRookie · 2020-02-22 · 解锁式学习 0

MapReduce当中的分区:物以类聚人以群分。相同key的数据,去往同一个reduce

 

ReduceTask的数量默认为一个,可以自己设定数量       job.setNumRudeceTasks(3)

 

分区决定了我们的数据该去往哪一个ReduceTask里面去

 

 

[展开全文]
CodeRookie · 2020-02-22 · 解锁式学习 0

除了javaweb的程序打成一个war包进行运行,其他程序都是打成一个jar包进行运行

[展开全文]
CodeRookie · 2020-02-21 · 解锁式学习 0

一个文件切片(block)块对应一个mapTask

mapreduce没有block的概念,默认一个切点对应一个block块的大小

MapReduce处理的数据类型是<key,value>键值对

 

MapReduce编程可控的八个步骤:

  1. 第一步:读取文件,解析成<key,value>对    这里是<k1,v1>
  2. 第二步:接受我们的<k1,v1>,自定义我们的map逻辑,然后转换成新的<k2,v2>进行输出,往下发送    这里发送出去的是<k2,v2>
  3. 第三步:分区    相同key的value发送到同一个reduce里面去,key合并,value形成一个集合
  4. 第四步:排序    默认按照字典顺序进行排序
  5. 第五步:规约
  6. 第六步:分组
  7. 第七步:接受<k2,v2>,自定义reduce逻辑,转换成新的<k3,v3>进行输出
  8. 第八步:将<k3,v3>进行输出

 

[展开全文]
CodeRookie · 2020-02-21 · 解锁式学习 0

分布式计算系统:主要用于计算一些数据

 

mapreduce的核心思想:分治,分而治之。最主要的一个特点就是把一个大的问题,划分成很多小的子问题,并且每个小的子问题的求取思路与我们大问题的求取思路一样

 

最主要有两个阶段:一个map阶段,负责拆分;一个是reduce阶段,负责聚合

[展开全文]
CodeRookie · 2020-02-21 · 解锁式学习 0

熟练掌握

 

创建包day03_hdfs

加repositories(指定去哪个网址下载jar包)

 

导包:

hadoop-client

hadoop-hdfs

hadoop-common

 

 

hdfs的javaAPI操作

会抛出一个异常 winutils异常

因为我们需要在windows上面装一个Hadoop的客户端环境,需要在windows下面重新编译Hadoop

如何解决

 

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

数据全部上传完成后,客户端通知NameNode

 

第一步:客户端发起请求,读取文件

第二步:服务端校验客户端是否有权限读取文件,如果有,那么NameNode就会查找元数据信息,找到这个文件对应的block块存储的位置

第三步:客户端与DataNode通信建立socket通信,读取第一个block块。直到所有的block块都读取完成后,在客户端进行block块的拼接,组成一个最完整的文件

 

如果block块读取到一半的时候抛错了怎么办?

客户端会重新请求NameNode找出出错block的副本,找副本重新读,没有断点续传的功能

 

写入是串行,一个一个(因为ack机制)

读取是并行,多个同时进行

 

寻找block策略:

第一个找离客户端最近的block块找最近一次“心跳”的DataNode进行读取

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

第一步:客户端向NameNode请求上传一个文件

第二步:NameNode反馈给客户端是否有权限上传

第三步:客户端被通知拥有权限上传文件后,开始将文件切分成block块,并向NameNode询问第一个block块存储的位置

第四步:通过机架感知原理,NameNode要找到离客户端最近(跨交换机最少的)的一台机器,并反馈给客户端

第五步:客户端找到对应的DataNode以及对应block的id,然后开始建立RPC连接,并通过RPC连接建立一个pipeline

 

 

block块的复制策略:

第一个block块保存在本机

第二个block块保存在同一个交换机下的另一台机器

第三个block块保存在不同的交换机下的机器

 

block块存满之后,反向的校验机制会给客户端一个相应,告诉客户端第一个block已经保存,可以上传第二个block块……「block块ack机制」

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

fsimage: 保存的是一份最完整的元数据信息

一份比较完整的元数据信息,存放在两个地方,一个是磁盘,一个是内存

HDFS文件可以保存多少数据,取决于NameNode的内存大小,所以HDFS推荐存储大量的大文件,不擅长存储小文件

edits:保存的是最近一段时间操作的元数据信息

如何确定edits和fsimage合并了

如果efits文件达到1G大小,合并一下

如果一直没有达到1G大小,达到一个小时就合并一下

 

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

NameNode负责更新保存元数据信息

DataNode负责处理用户的读写数据

客户端通过NameNode查找某个数据的所有block块在那些DataNode上,然后去DataNode上面读取数据

数据副本的存放机制:NameNode会首先找离客户端最近(跨交换机最少的)的一台机器上传block块,然后再去做备份

NameNode负责数据block块的复制(定期检测block的副本数,如果不够3个,就进行复制)

NameNode的元数据保存在两个地方,一个是内存,一个是磁盘(磁盘存的是元数据的快照,如果快照非常大,停机再启动代价会非常大)

bolck块的大小,可以根据实际工作当中的文件特性来调整,如果都是一些大文件,可以稍微调block块的大小

好处eg.

128M的bolck块:300M的文件会分成3个block块,要占用3个元数据

256M的block块,300M的文件只会分成2个block块,只需要占用2个元数据

 

块缓存:distributedCache 可以用来实现我们的文件的缓存

hdfs的权限验证:采用了与linux类似的权限验证机制,权限验证比较弱(防止好人做错事,不能阻止坏人做坏事)(HDFS相信你告诉我你是谁,你就是谁)

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

hdfs文件系统的设计目标:

  1. 硬件错误,特别是硬盘的损坏是常态(副本机制解决)
  2. 数据流访问,所有的访问都是访问大量的数据,使用IO流一直操作,追求的是稳定,不是效率
  3. 大数据集,假设所有存储到hdfs的数据都是海量的数据,不擅长处理小文件(因为一个小文件会占用一个元数据,元数据都存储在内存当中,大量的小文件会产生大量的元数据,导致占用NameNode大量内存)
  4. 简单的相关模型,假设文件是一次写入,多次读取,不会有频繁的更新(比较擅长存储一些历史数据)
  5. 移动计算比移动数据便宜
  6. 多种软硬件的可移植性
[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

只有一台机器时的文件查找

hello.txt /export/servers/hello.txt

如果有多台机器时的文件查找

hello.txt node02 /export/servers/hello.txt

 

为了解决数据丢失的问题,引入副本机制,保证数据不会丢失

 

如果对文件进行切块存储,那么元数据信息又要继续变化

blk元数据信息的记录

blk_00001 node01 node03 /export/servers/blk_00001

blk_00002 node02 node01 /export/servers/blk_00002

blk_00003 node03 node02 /export/servers/blk_00003

 

ftp:// ftp文件系统 可以做文件的上传下载

webHdfs: 浏览器操作文件系统,可以允许我们通过浏览器上传、下载、修改HDFS上面的文件

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0

fsimage: 存储的是一份比较完整的元数据信息

edits: 最近一段时间的操作日志

 

SecondaryNameNode将edits合并到fsimage

[展开全文]
CodeRookie · 2020-02-19 · 解锁式学习 0