MapReduce
组件
InputFormat - 输入格式
- InputFormat发生在Mapper之前,需要先读取数据,然后将读取出来的数据交给Mapper处理,所以InputFormat读取出来的数据是什么样子,那么Mapper就是什么样子
- 如果不指定,那么MapReduce默认使用的是TextInputFormat,TextInputFormat在读取数据的时候,默认是按行读取数据,读取出来的数据的键是数据的字节偏移量,值是读取的这一行数据
- 在MapReduce中,只有BZip2对应的压缩文件可以切片,其他的压缩文件都是不可切片的
- 自定义输入格式:需要定义一个类继承FileInputFormat,覆盖
createRecordReader
方法 - 多源输入:在MapReduce中允许指定多个不同的输入路径,同时处理多个文件。而这多个文件的格式可以不一样,可以利用Mapper来统一格式,最终交给Reducer来进行处理
OuputFormat - 输出格式
- OutputFormat发生在Reducer之后,将Reducer产生的数据写出到指定位置上。因此Reducer计算出来的数据是什么格式,那么OutputFormat获取到的数据就是什么格式
- 如果不指定,那么MapReduce默认使用的是TextOutputFormat。TextOutputFormat在写出数据的时候,默认键值之间使用制表符
\t
来间隔 - 自定义输出格式:需要定义一个类继承FileOutputFormat,覆盖
getRecordWriter
方法
其他
join
- 如果需要同时处理多个文件,并且多个文件之间相互关联,那么可以确定一个主处理文件,然后将其他文件放到缓存中,等需要使用的时候,再从缓存中来出来文件来处理 - 这个过程称之为MapReduce的join操作
- 案例:获取每一天卖了多少钱(文件:order.txt和product.txt)
了解:MapReduce的Shuffle
Flume
简介
概述
- Flume是Cloudera公司开发后来贡献给了Apache的一套用于进行日志的收集(collecting)、汇聚(aggregating)和传输(moving)的机制 - 在实际开发中,有超过70%的数据来源于日志 - 日志构成了大数据的基石
- 版本
- Flume-og:Flume0.9及以前的版本,配置结构复杂,对分布式支持不好
- Flume-ng:Flume1.X版本,简化了配置结构,增加了线程安全的特性
基本概念
-
Event
-
在Flume中,将收集到的每一条日志封装成了一个Event对象 - 一个Event对应的就是一条日志
-
Event本质上是一个json串,固定的包含了两个部分:headers和body。也就意味着Flume会将收集到的日志封装成json格式:
{"headers":{},"body":""}
-
-
Agent:是Flume流动模型的基本组成结构,固定的包含了3部分:
- Source:从数据源来采集数据 - collecting
- Channel:临时存储数据 - aggregating
- Sink:将数据写到目的地 - moving
流动模型
-
单级流动
-
多级流动
-
扇入流动/汇聚
-
扇出流动
-
将上述流动模型根据需求来进行组合,组合出来就是复杂流动
安装
步骤
-
进入opt目录
cd /opt
-
上传Flume的安装包
rz # 之后选择Flume的安装包上传
-
解压
tar -xvf apache-flume-1.9.0-bin.tar.gz
-
重命名
mv apache-flume-1.9.0-bin flume-1.9.0
-
配置环境变量
vim /etc/profile.d/flumehome.sh # 在文件中添加 export FLUME_HOME=/opt/flume-1.9.0 export PATH=$PATH:$FLUME_HOME/bin # 保存退出,重新生效 source /etc/profile.d/flumehome.sh
-
查看版本
flume-ng version
-
进入Flume安装目录的子目录lib下
cd flume-1.9.0/lib
-
删除冲突的jar包
rm -rf guava-11.0.2.jar
-
回到Flume安装目录下,创建数据目录
cd .. mkdir data cd data
案例
-
编辑文件
vim basic.conf
-
添加数据
# 给Agent起名 # 给Source起名 a1.sources = s1 # 给Channel起名 a1.channels = c1 # 给Sink起名 a1.sinks = k1 # 配置Source a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 # 配置Channel a1.channels.c1.type = memory a1.channels.c1.capacity = 10000 a1.channels.c1.transactionCapacity = 1000 # 配置Sink a1.sinks.k1.type = logger # 将Source和Channel绑定 a1.sources.s1.channels = c1 # 将Sink和Channel绑定 a1.sinks.k1.channel = c1
-
启动Flume
flume-ng agent -n a1 -c $FLUME_HOME/conf -f basic.conf -Dflume.root.logger=INFO,console