1.flume模型
1.1 Event
flume 事件,被定义为一个具有有效荷载的字节数据流和可选的字符串属性集。
1.2 Agent
flume 代理,是一个进程承载从外部源事件流到下一个目的地的过程。包含source channel 和 sink。
1.3 Source
数据源,消耗外部传递给他的事件,外部源将数据按照flume Source 能识别的格式将Flume 事件发送给flume Source。
1.4 Channel
数据通道,是一个被动的存储,用来保持事件,直到由一个flume Sink消耗。
1.5 Sink
数据汇聚点,代表外部数据存放位置。发送flume event到指定的外部目标。
2.flume 配置文件
2.1 配置文件例子如下
# example.conf 单节点flume配置
# 命名Agent a1的组件 (这是一个给组件起名的过程)
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 描述/配置source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = 文件路径和数据源名称
a1.sources.r1.fileHeader = true
#描述sink 设置kafka接收器 也就是接受到哪里去
a1.sinks.s1.type=hive
a1.sinks.s1.hive.metastore=thrift://服务器ip:端口
a1.sinks.s1.hive.database=hive数据库名称
a1.sinks.s1.hive.table=hive表名
a1.sinks.s1.batchSize=3000
a1.sinks.s1.serializer=JSON
a1.sinks.s1.serializer.fieldnames=business_id,type,create_time
#描述channels 设置接收器 用什么传递,这里可以默认用内存,也可以配合用kafka 还很多方式,可以多选一
#kafka
a1.channels.c1.type=org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers=地址ip:kafka端口
a1.channels.c1.kafka.topic=设置topic
a1.channels.c1.kafka.consumer.group.id=1
#内存
#a1.channels.c1.type=memory
#a1.channels.c1.capacity=10000
#a1.channels.c1.transactionCapacity=10000
说明:
1.source主要有四种: NetCat 、Avro 、Exec 、 Spooling Directory
1.1.NetCat Source : 绑定端口(Tcp、Udp),将流经端口的每个文本行数据作为Event输入
- type:类型,必须是netcat
- bind:要监听的(本机的)主机名或者ip。此监听不是过滤发送方。一台电脑不是说只有一个IP。有多网卡的电脑,对应多个IP
- port:绑定的本地端口
#####1.2.Avro Source:监听一个Avro服务端口。采集Avro数据序列化后的数据 - type:类型,必须是avro。
- bind:要监听的(本机的)主机名或者ip。此监听不是过滤发送方。一台电脑不是说只有一个IP。有多网卡的电脑,对应多个IP。
- port:绑定的本地的端口。
#####1.3.Exec Source: 于Unix的command在标准输出上采集数据 - type:source的类型:必须是exec。
- command:要执行命令。
#####1.4.Spooling Directory Source :监听一个文件夹里的文件新增,如果有则采集作为source - type:类型:必须是spooldir
- spoolDir:监听的文件夹 【提前创建目录】
- fileSuffix:上传完毕后文件的重命名后缀,默认为.COMPLETED
- deletePolicy:上传后的文件的删除策略never和immediate,默认为never。
- fileHeader:是否要加上该文件的绝对路径在header里,默认是false。
- basenameHeader:是否要加上该文件的名称在header里,默认是false。
2.sink主要记录两个 HDFS 和 Hive
2.1 HDFS Sink : 将数据传输到hdfs集群
- type : sink的类型。必须写hdfs
- hdfs.path : hdfs的上传路径
- hdfs.filePrefix:hdfs文件的前缀。默认是:FlumeData
- hdfs.rollInterval:间隔多久产生新文件,默认是:30(秒) 0表示不以时间间隔为准。
- hdfs.rollSize:文件到达多大再产生一个新文件,默认是:1024(bytes)0表示不以文件大小为准。
- hdfs.rollCount:event达到多大再产生一个新文件,默认是:10(个)0表示不以event数目为准。
- hdfs.batchSize:每次往hdfs里提交多少个event,默认为100
- hdfs.fileType:hdfs文件的格式主要包括:SequenceFile, DataStream ,CompressedStream,如果使用了CompressedStream就要设置压缩方式。
- hdfs.codeC:压缩方式:gzip, bzip2, lzo, lzop, snappy
注:%{host}可以使用header的key。以及%Y%m%d来表示时间,但关于时间的表示需要在header里有timestamp这个key。
2.2 Hive Sink : 将数据直接整hive里去
- type : 类型,必须写hive
- hive.metastore:元数据存储位置
- hive.database:数据库名称
- hive.table:表名
- batchSize:再将文件刷新到HDFS之前写入文件的事件数
- serializer :序列化格式
- mserializer.fieldnames:可以理解为列名,以逗号隔开即可
3.channel :通道 主要写三种Memory、File、KafkaChannel
3.1 Memory Channel
- type :类型 必须是memory
- capacity : channel中最大event的数
- transactionCapacity:channel中允许事务的最大event数目
3.2 File Channel
- Type channel的类型:必须为 file
- checkpointDir:检查点的数据存储目录【提前创建目录】
- dataDirs:数据的存储目录【提前创建目录】
- transactionCapacity:channel中允许事务的最大event数目
3.3 Kafka Channel
- type:org.apache.flume.channel.kafka.KafkaChannel
- 组件名.channels.c1.kafka.bootstrap.servers=服务器ip:kafka端口(默认9092)
- 组件名.channels.c1.kafka.topic=定义主题
- 组件名.channels.c1.kafka.consumer.group.id=id号
文件配置好之后就要准备使用flume传日志内容到hive去了
3.执行启动
bin目录下执行
./flume-ng agent 指令 这里简单说一下参数和选项
命令:
参数 | 描述 |
---|---|
help | 打印帮助信息 |
agent | 运行一个Flume Agent |
avro-client | 运行一个Avro Flume 客户端 |
version | 显示Flume版本 |
全局选项:
参数 | 描述 |
---|---|
–conf-file,-f | 指定配置文件,这个配置文件必须在全局选项的–conf参数定义的目录下。(必填) |
–name,-n | Agent的名称(必填) |
–help,-h | 帮助 |
Avro客户端选项:
参数 | 描述 |
---|---|
–rpcProps,-P | 连接参数的配置文件 |
–host,-H | Event所要发送到的Hostname |
–port,-p | Avro Source的端口 |
–dirname
| Avro Source流到达的目录 |
–filename,-F | Avro Source流到达的文件名 |
–headerFile,-R | 设置一个JAVA -X的选项 |
启动Avro客户端要么指定–rpcProps,要么指定–host和–port。
举个栗子:
./flume-ng agent --conf …/conf/ --conf-file …/conf/xcx_dir_hive.conf --name xcx -Dflume.root.logger=INFO,console &
首先是客户端,启动一个agent, 然后–conf选择配置文件的路径, --conf-file选择具体的配置文件。 --name是必要的!要给Agent起名! 最后在控制台输出~
#已经踩过的坑!!!注意事项
- 1.首先,flume是一直执行的,如果想要执行启动同名的Agent,请先kill掉之前的flume进程,同时,Spooling Directory Source源的情况下,源文件会被修改后缀,一定要在关闭flume之后去修改名字。否则会报错。
- 2.如果hive中没有数据库,同时没有表,那么执行Agent将会帮我们创建数据库和表,但是!如果我们已经有数据库了,flume是不会帮我们创建表的,还会持续不断的报错!!!非常烦人!有的同学们表示,删除数据库之后再次执行还是会报错,是因为我们要通过dfs去删除相关hive库的信息。
- 3.手动建表的话,需要明确一点!可以采用直接建表法,但是一定要加上事务!否则会报错
例如: create table 表名(user_id int,user_name string) clustered by (user_id) into 2 buckets stored as orc tblproperties(‘transactional’=‘true’);