zoukankan      html  css  js  c++  java
  • Flume基础(十四):基础面试题

    1、组成source channel sink 事务(put/take)

         1)taildir source 

      (1)断点续传、多目录
      (2)哪个flume版本产生的?Apache1.7 cdh1.6
      (3)没有断点续传功能时怎么做的?
          自定义
      (4)taildir挂了怎么办?
        不会丢数:断点续传 ,但可能重复数据:
      (5)怎么处理重复数据?
        不处理:生产环境通常不处理
        处理
           自身:在taildirsource里面增加自定义事务
           找兄弟:下一级处理(hive dwd sparkstreaming flink布隆)
               去重手段(groupby、开窗取窗口第一条、redis)
      (6)taildir source 是否支持递归遍历文件夹读取文件?
        不支持。 自定义 递归遍历文件夹 +读取文件

     2)file channel /memory channel/kafka channel
      (1)file channel
        数据存储于磁盘,优势:可靠性高;劣势:传输速度低
        默认容量:100万event
      (2)memory channel
        数据存储于内存,优势:传输速度快;劣势:可靠性差
        默认容量:100个event
      (3)kafka channel
        数据存储于Kafka,基于磁盘;
        优势:可靠性高;
        传输速度快  kafka channel 》memory channel+kafka sink 原因省去了sink阶段
      (4)kafka channel哪个版本产生的?
        flume1.6 版本产生=》并没有火;因为有bug
        topic-start 数据内容
        topic-event 数据内容 ture 和false 很遗憾,都不起作用。
        增加了额外清洗的工作量。
        flume1.7解决了这个问题,开始火了。
      (5)生产环境如何选择
        如果下一级是kafka,优先选择kafka channel
        如果下一级不是:

                如果是金融、对钱要求准确的公司,选择file channel
              如果就是普通的日志,通常可以选择memory channel
        每天丢几百万数据 pb级 亿万富翁,掉1块钱会捡?

     3)HDFS sink(优化配置)

                 小文件:

                      文件大小 128m

                      文件时间(1小时-2小时)

                      event个数(0禁止)

    2、三个器(拦截器、选择器、监控器)

      1)拦截器
        (1)ETL  拦截器  判断json的完整性 { }

          数据清洗:轻度清洗{} =》保证传输效率
          服务器时间:13位 必须全部是数字

                   (2)时间处理:

            由于 Flume 默认会用 Linux 系统时间,作为输出到 HDFS 路径的时间。如果数据是 23:59分产生的。Flume 消费 Kafka 里面的数据时,有可能已经是第二天了,那么这部门数                    据会被发往第二天的 HDFS 路径。我们希望的是根据日志里面的实际时间,发往 HDFS 的路径,所以下面拦截器作用是获取日志中的实际时间。
            解决的思路:拦截 json 日志,通过 fastjson 框架解析 json,获取实际时间 ts。将获取的ts 时间写入拦截器 header 头,header 的 key 必须是 timestamp,因为 Flume 框架会根                  据这个key 的值识别为时间,写入到 HDFS。

                   (3) 事件拦截器 event start

              start 启动

                             event (商品点击、商品列表、商品详情、、
            广告;

                                 故障
            点赞、评论、收藏

                                 后台活跃、通知

            )
            一个表一个topic,一定能满足下一级所有消费者;
            可以做适当的轻度聚合
        (4)自定义拦截器的步骤
            定义一类,实现interceptor接口,重写里面4个方法
                (初始化、关闭、单event、多event,创建一个静态内部类Builder)
            打包=》上传到flume的lib包下=》在配置文件中管理拦截器
        (5)拦截器可以不用吗?
            可以不用;需要在下一级hive的dwd层和sparksteaming里面处理
            优势:只处理一次,轻度处理,
            劣势:影响性能,不适合做实时推荐这种对实时要求比较高的场景

      2)选择器

        rep(默认,发往下一级所有通道)
        m(选择性发往对应通道)
        ReplicatingChannelSelector
        MultiPlexingChannelSelector
        本次项目用m,根据flume头发往对应的topic
        start-topic event-topic

      3)监控器
        Ganglia
        尝试提交的次数远远大于最终成功的次数。
        自身:增加内存flume-env.sh 4-6g
        找朋友:先增加服务器台数,后增加flume服务器,通道打通

        搞活动 618 =》增加服务器=》用完在退出
        日志服务器配置(阿里云):8-16g内存、磁盘8T

    3、优化

      1)file channel  能够多配置磁盘就多配置磁盘,  提高吞吐量
      2)HDFS sink 小文件
        (1)时间(1小时-2小时) or 大小128m、event个数(0禁止)
      3)监控器
        调整内存
        自身 提高自己内存
        找朋友 增加flume台数

    4、flume挂了怎么办?

         1) 如果是memorychannel 有可能丢数据 

         2) 如果是taildirsource 不会丢数据,但是有可能重复数据

    注:要懂flume运行流程

    5  Flume的事务机制和可靠性

         1) Flume的事务机制

         所以这就不得不提Flume的事务机制(类似数据库的事务机制):Flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。比如以上面一篇博客中的事例为例:spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到channel且提交成功,那么source就将该文件标记为完成。同理,事务以类似的方式处理从channel到sink的传递过程,如果因为某种 原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到channel中,等待重新传递。

        2) Flume的At-least-once提交方式

         Flume的事务机制,总的来说,保证了source产生的每个事件都会传送到sink中。但是值得一说的是,实际上Flume作为高容量并行采集系统采用的是At-least-once(传统的企业系统采用的是exactly-once机制)提交方式,这样就造成每个source产生的事件至少到达sink一次,换句话说就是同一事件有可能重复到达。这样虽然看上去是一个缺陷,但是相比为了保证Flume能够可靠地将事件从source,channel传递到sink,这也是一个可以接受的权衡。如上博客中spooldir的使用,Flume会对已经处理完的数据进行标记。

        3) Flume的批处理机制

         为了提高效率,Flume尽可能的以事务为单位来处理事件,而不是逐一基于事件进行处理。比如上篇博客提到的spooling directory source以100行文本作为一个批次来读取(BatchSize属性来配置,类似数据库的批处理模式)。批处理的设置尤其有利于提高file channle的效率,这样整个事务只需要写入一次本地磁盘,或者调用一次fsync,速度回快很多。

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/13771544.html

  • 相关阅读:
    pet shop 案例(转)
    用我账号的哥们 别随意留言 谢谢 这个账号有特殊意义
    关于if else 和 switch 的区别 究竟哪个更快
    sql server 2008 保存表的设置
    shell编程
    敏捷项目管理
    日常起居六忌是什么?
    质量管理的几个陌生词汇
    阿里巴巴一名员工的辞职信
    什么是SaaS?
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13771544.html
Copyright © 2011-2022 走看看