第七周 第2章 极速上手Flume使用
Flume的Hello World!
1 | 下面我们就想上手操作Flume,具体该怎么做呢? |


flume配置
1 | 下面有一个Agent配置的例子: |
1 | 这个例子中首先定义了source的名字、sink的名字还有channel的名字 |
source
NetCat Tcp
1 | 咱们刚才看的案例中使用的是source类型是netcat,其实就是NetCat TCP Source,看一下详细内容 |
1 | 这里面的粗体字体是必选的参数 |
1 | a1.sources = r1 |
channel
memory channel
1 | 这里面只有type是必填项,其他都是可选的 |
sink
logger sink
1 | 最后看一下sink,在案例中sink使用的是logger,对应的就是Logger Sink |
1 | 后期我们如果想要使用其他的内置组件,直接到官网文档这里查找即可,这里面的配置有很多,没有必要去记,肯定记不住,只要知道到哪里去找就可以,工作的时候又不是闭卷考试,官网是可以随便使用的, |
Flume配置文件
1 | # example.conf: A single-node Flume configuration |
1 | 注意了,这个配置文件中的a1表示是agent的名称,还有就是port指定的端口必须是未被使用的,可以先查询一下当前机器使用了哪些端口,端口的可用范围是1-65535,如果懒得去查的话,就尽量使用偏大一些的端口,这样被占用的概率就非常低了 |
启动Agent
1 | Agent配置好了以后就可以启动了,下面来看一下启动Agent的命令 |
1 | bin/flume-ng agent --name a1 --conf conf --conf-file example.conf -Dflume.root.logger=INFO,console |
1 | 注意了,其实agent的启动命令还可以这样写 |
1 | 启动Agent |
1 | 启动之后会看到如下信息,表示启动成功,启动成功之后,这个窗口会被一直占用,因为Agent服务一直在运行,现在属于一个前台进程 |

1 | 如果看到提示的有ERROR级别的日志信息,就需要具体问题具体分析了,一般都是配置文件配置错误了。 |
开启的socket服务端
1 | 接下来我们需要连接到source中通过netcat开启的socket服务端 |

1 | 回到Agent所在的窗口,可以看到下面多了一行日志,就是我们在telnet中输入的内容 |

使其它机器也可以telnet连接
1 | 按 ctrl+c 断开telnet连接 |
1 | 所以此时Agent中source的配置在使用的时候就受限制了,在开启telnet客户端的时候就只能在本地开启了,无法在其他机器上使用,因为source中绑定的ip是localhost。 |
1 | 按ctrl+c停止刚才启动的agent |

1 | 此时可以在其他机器上使用telnet连接也可以,在bigdata01机器上 |

Flume Agent后台运行
1 | 但是注意了,此时Flume中Agent服务是在前台运行,这个服务实际工作中需要一直运行,所以需要放到后台运行。 |
1 | [root@bigdata04 apache-flume-1.9.0-bin]# nohup bin/flume-ng agent --name a1 --conf conf --conf-file xxx & |

1 | 这样看起来不清晰,如果后期启动了多个Agent,都分不出来哪个是哪个了 |

1 | 或者使用ps命令也可以 |

1 | 哪个都可以,条条道路通罗马,具体就看你个人喜好了,ps命令显示的内容更为详细。 |
日志
1 | 这个Agent中的sink组件把数据以日志的方式写出去了,所以这个数据默认就会进入到flume的日志文件中,那我们来看一下flume的日志文件在flume的logs目录中有一个flume.log |

1 | 再使用telnet向里面输入一些数据 |

1 | 再回agent看 |

1 | 此时需要想要停止这个Agent的话就需要使用kill命令了 |

案例:采集文件内容上传至HDFS
1 | 接下来我们来看一个工作中的典型案例: |
Source


1 | channels和type肯定是必填的,还有一个是spoolDir,就是指定一个监控的目录 |
1 | # Name the components on this agent |
Channel
1 | 接下来是channel了 |


1 | 根据这里的例子可知,主要配置checkpointDir和dataDir,因为这两个目录默认会在用户家目录下生成,建议修改到其他地方 |

Sink
1 | 最后是sink |




1 | hdfs.path是必填项,指定hdfs上的存储目录 |
1 | hdfs.rollInterval默认值是30,单位是秒,表示hdfs多长时间切分一个文件,因为这个采集程序是一直运行的,只要有新数据,就会被采集到hdfs上面,hdfs默认30秒钟切分出来一个文件,如果设置为0表示不按时间切文件 |

1 | 把Agent的配置保存到flume的conf目录下的 file-to-hdfs.conf 文件中: |
1 | [root@bigdata04 conf]# vi file-to-hdfs.conf |
启动Agent
1 | 下面就可以启动agent了,在启动agent之前,先初始化一下测试数据 |
1 | 启动Hadoop集群 |



1 | 启动Agent,使用在前台启动的方式,方便观察现象 |
让flume所在节点成为hadoop的客户端节点
1 | 但是发现在启动的时候报错,提示找不到SequenceFile,但是我们已经把fileType改为了DataStream, |

1 | 由于bigdata01和bigdata04没有做免密码登录,也不认识它的主机名,所以就使用ip,并且输入密码了。 |

1 | 注意:还需要修改环境变量,配置HADOOP_HOME,否则启动Agent的时候还是会提示找不到SequenceFile |


1 | 这里报错的原因是:直接使用/,不使用hdfs://xxxx.xxxx.xxxx.xxxx:9000/ |
1 | 再重新启动Agent |

1 | 此时可以看到Agent正常启动 |


1 | 此时发现文件已经生成了,只不过默认情况下现在的文件是 .tmp 结尾的,表示它在被使用,因为Flume只要采集到数据就会向里面写,这个后缀默认是由 hdfs.inUseSuffix 参数来控制的。 |


1 | 所以此时Flume就会监控linux中的/data/log/studentDir目录,当发现里面有新文件的时候就会把数据采集过来。 |

1 | 接着我们再看一下channel中的数据,因为数据是存在本地磁盘文件中的,所以是可以去看一下的,进入dataDir指定的目录 |


1 | 发现里面有一个 log-1 的文件,这个文件中存储的其实就是读取到的内容,只不过在这无法直接查看。 |

1 | 那我再重启Agent之后,会不会再给加上.tmp呢,不会了,每次停止之前都会把所有的文件解除占用状态,下次启动的时候如果有新数据,则会产生新的文件,这其实就模拟了一下自动切文件之后的效果。 |


1 | 答案:其实就是使用hdfs sink中的hdfs.fileSuffix参数 |






