08_Flume之HDFS Sink 的参数解析及异常处理

一、配置详解

序号 参数名 默认值 描述
1 type Sink类型为hdfs -
2 hdfs.path - HDFS存储路径,支持按照时间分区。集群的NameNode名字:单节点:hdfs://主机名(ip):9000/%Y/%m/%d/%H;HA集群:hdfs://nameservice(高可用NameNode服务名称)/%Y/%m/%d/%H
3 hdfs.filePrefix FlumeData Event输出到HDFS的文件名前缀
4 hdfs.fileSuffix - Event输出到HDFS的文件名后缀
5 hdfs.inUsePrefix - 临时文件的文件名前缀。Flume首先将Event输出到HDFS指定目录的临时文件中,再根据相关规则重命名为目标文件
6 hdfs.inUseSuffix .tmp 临时文件名后缀。
7 hdfs.rollInterval 30 间隔多久将临时文件滚动成最终目标文件,单位:秒。如果设置为0,则表示不根据时间滚动文件。注:滚动(roll)指的是,HDFS Sink将临时文件重命名成最终目标文件,并新打开一个临时文件来写数据
8 hdfs.rollSize 1024 当临时文件达到该大小时,滚动成目标文件,单位:byte。该值设置为0,则表示文件不根据文件大小滚动生成
9 hdfs.rollCount 10 当Event数据达到该数量时,将临时文件滚动生成目标文件。该值设置为0,则表示文件不根据Event数滚动生成
10 hdfs.idleTimeout 0 当目前被打开的临时文件在该参数指定的时间内,没有任何数据写入,则将该临时文件关闭并重命名成目标文件,单位:秒。该值设置为0,则表示禁用此功能,不自动关闭临时文件
11 hdfs.round false 用于HDFS文件按照时间分区,时间戳向下取整
12 hdfs.roundValue 1 当round设置为true,配合roundUnit时间单位一起使用,例如roundUnit值为minute。该值设置为1则表示一分钟之内的数据写到一个文件中,相当于每一分钟生成一个文件
13 hdfs.roundUnit second 按时间分区使用的时间单位,可以选择second(秒)、minute(分钟)、hour(小时)三种粒度的时间单位。示例:a1.sinks.k1.hdfs.path = hdfs://nameservice/flume/events/%y/%m/%d/%H/%M;a1.sinks.k1.hdfs.round = true;a1.sinks.k1.hdfs.roundValue = 10;a1.sinks.k1.hdfs.roundUnit = minute;当时间为2022-04-05 17:38:59时候,hdfs.path依然会被解析为:/flume/events/2022/04/05/17/30;因为设置的是舍弃10分钟内的时间,因此,该目录每10分钟新生成一个
14 hdfs.batchSize 100 每个批次刷写到HDFS的Event数量
15 hdfs.codeC 不采用压缩 文件压缩格式,目前支持的压缩格式有gzip、bzip2、lzo、lzop、snappy
16 hdfs.fileType SequenceFile 文件类型,包括:SequenceFile、DataStream、CompressedStream。该值设置为DataStream,则输出的文件不会进行压缩,不需要设置hdfs.codeC指定压缩格式。该值设置为CompressedStream,则对输出的文件进行压缩,需要设置hdfs.codeC指定压缩格式
17 hdfs.maxOpenFiles 5000 最大允许打开的HDFS文件数,当打开的文件数达到该值,则最早打开的文件将会被关闭
18 hdfs.minBlockReplicas HDFS副本数 写入HDFS文件块的最小副本数。该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件
19 hdfs.writeFormat Writable 文件的格式,目前可以选择Text或者Writable两种格式
20 hdfs.callTimeout 10000 操作HDFS文件的超时时间,如果需要写入HDFS文件的Event数比较大或者发生了打开、写入、刷新、关闭文件超时的问题,可以根据实际情况适当增大超时时间,单位:毫秒
21 hdfs.threadsPoolSize 10 每个HDFS Sink执行HDFS IO操作打开的线程数
22 hdfs.rollTimerPoolSize 1 HDFS Sink根据时间滚动生成文件时启动的线程数
23 hdfs.timeZone Local Time本地时间 写入HDFS文件使用的时区
24 hdfs.useLocalTimeStamp false 是否使用本地时间替换Event头信息中的时间戳
25 hdfs.closeTries 0 在发起关闭尝试后,尝试重命名临时文件的次数。如果设置为1,表示重命名一次失败后不再继续尝试重命名操作,此时待处理的文件将处于打开状态,扩展名为.tmp。如果设置为0,表示尝试重命名操作次数不受限制,直到文件最终被重命名成功。如果close调用失败,文件可能仍然会处于打开状态,但是文件中的数据将保持完整,文件会在Flume重启后关闭
26 hdfs.retryInterval 180 秒 连续尝试关闭文件的时间间隔。如果设置为0或小于0的数,第一次尝试关闭文件失败后将不会继续尝试关闭文件,文件将保持打开状态或者以“.tmp”扩展名结尾的临时文件。如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1
27 serializer TEXT 序列化方式,可选值有TEXT、avro_event或者实现EventSerializer.Builder接口的类
28 kerberosPrincipal - HDFS安全认证kerberos配置
29 kerberosKeytab - HDFS安全认证kerberos配置
30 proxyUser - 代理用户

round 与 rollInterval 理解有误

round、roundValue、roundUnit是基于路径path去滚动生成文件夹的,针对文件夹而言

rollInterval、rollSize、rollCount是基于文件的条件限制滚动生成文件的,基于文件而言的

二、简单模板

agent_name.sources = source_name
agent_name.channels = channel_name
agent_name.sinks = sink_name

# source
agent_name.sources.source_name.type = avro
XXX
XXX

# channel
agent_name.channels.channel_name.type = file
XXX
XXX

# sink
agent_name.sinks.sink_name.type = hdfs
agent_name.sinks.sink_name.hdfs.path = hdfs://${HA_NameNode_Name}/flume_data/yr=%Y/mon=%m/day=%d/hr=%H
agent_name.sinks.sink_name.hdfs.writeFormat = Text
agent_name.sinks.sink_name.hdfs.fileSuffix = _${hdfsFileSuffix}.log
agent_name.sinks.sink_name.hdfs.fileType = DataStream
agent_name.sinks.sink_name.hdfs.filePrefix = %Y%m%d%H%M
agent_name.sinks.sink_name.hdfs.useLocalTimeStamp = true
agent_name.sinks.sink_name.hdfs.rollInterval = 0
agent_name.sinks.sink_name.hdfs.rollSize = 125829120
agent_name.sinks.sink_name.hdfs.rollCount = 0
agent_name.sinks.sink_name.hdfs.minBlockReplicas = 1
agent_name.sinks.sink_name.hdfs.round = true
agent_name.sinks.sink_name.hdfs.roundValue = 1
agent_name.sinks.sink_name.hdfs.roundUnit = hour
agent_name.sinks.sink_name.hdfs.idleTimeout = 600

# source | channel | sink 关联
agent_name.sources.source_name.channels = channel_name
agent_name.sinks.sink_name.channel = channel_name

三、注意事项及异常

  1. idleTimeout 的设置

    • 设置为0,如果flume程序突然宕机,就会导致 hdfs上的 .tmp后缀的文件无法会更改为完成的文件,造成一种假象,以为该文件正在写入。当程序重启时,就会有两个 .tmp文件。

    • 如果idle Timeout有设置值m,当在m秒内没有数据写入,就会把tmp文件改为已完成。后面再有数据过来的时候重新生成.tmp文件。

    • 建议:最好设置一个比较大的值,防止小文件产生,若不设置,宕机的话会有tmp文件

    • 为了能快速查看到数据,可以设置该值较小,没数据进行就滚动,因为临时文件是不能被Hive查询到,但是这样会产生小文件

  1. round 与 rollInterval 理解有误

    • round、roundValue、roundUnit是基于路径path去滚动生成文件夹的,针对文件夹而言

    • rollInterval、rollSize、rollCount是基于文件的条件限制滚动生成文件的,基于文件而言的

  1. 异常:Error while trying to hflushOrSync
    • 问题排查:通过查看不同Flume的Agent日志发现,同名的文件被不同的Flume Agent打开,在文件第二次打开后,先前打开的Agent拥有的token就失效了,因此无法关闭它,就会不断的报错:Error while trying to hflushOrSync!
    • 查看之前的flume配置文件发现,每一个Flume-Agent配置的hdfsSink是完全一样的,每个Flume-Agent读取的source相同,有很大概率会出现多个Fume-Agent同时写同名文件,导致部分Flume-Agent无法继续。
    • 解决方案:不同Flume设置不同的文件后缀名

其它重要点:

  1. Flume部署的机器上没有Hadoop环境依赖:

    为了让Flume能够正常地和HDFS进行交互,需要手动添加Hadoop相关的jar包到Flume的classpath中。常见的Hadoop相关的jar包如下:

    • hadoop-common.jar
    • hadoop-hdfs.jar
    • hadoop-auth.jar
    • hadoop-mapreduce-client-core.jar
    • commons-configuration.jar
    • commons-lang.jar
    • commons-collections.jar

    具体来说,如果你使用的是Hadoop2.x版本,那么在HADOOP_HOME目录下应该有以下目录:

    • $HADOOP_HOME/share/hadoop/common
    • $HADOOP_HOME/share/hadoop/hdfs
    • $HADOOP_HOME/share/hadoop/mapreduce

    你可以将上述目录中的对应jar包复制到Flume的lib目录下,即$FLUME_HOME/lib目录下。

    需要注意的是,这些jar包的版本要和你的Hadoop集群的版本保持一致,否则可能会出现不兼容等问题。建议在添加前先确认好版本信息。

  1. Hadoop的NameNode是高可用:
  • 将Hadoop集群的core-site.xml和hdfs-site.xml文件复制到Flume服务器上的某个目录(/path/to/hadoop/conf)中

    • bin/flume-ng agent --conf-file conf/flume.conf --name a1 -Dhadoop.conf.dir=/path/to/hadoop/conf
      
  • 在启动Flume时,也可以使用"-conf"参数指定core-site.xml和hdfs-site.xml文件的路径,如下所示:

    • bin/flume-ng agent --conf-file conf/flume.conf --name a1 -conf /path/to/hadoop/conf/core-site.xml -conf /path/to/hadoop/conf/hdfs-site.xml
      
  • 直接两个两个文件放到 Flume_HOME/conf 目录下

  1. 没有权限写入HDFS目录:
  • 可以在启动命令中设置"-Duser.name=kevin"参数

  • 需要注意的是,kevin用户需要在HDFS上拥有写入目标目录的权限,否则会出现写入失败等问题。因此,在实际使用中,需要对该用户进行独立管理,并按照实际需求进行授权

./bin/flume-ng agent -n ${agentName} -c ${flumeClient}/conf/ -f ${jobLocation} -Duser.name=kevin
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容