Flume-接入Hive数仓搭建流程

大数据
实时流接入数仓,基本在大公司都会有,在Flume1.8以后支持taildir source, 其有许多特点,而被广泛使用。本文以开源Flume流为例,介绍流接入HDFS ,后面在其上面建立ods层外表。

实时流接入数仓,基本在大公司都会有,在Flume1.8以后支持taildir source, 其有以下几个特点,而被广泛使用:

  1. 使用正则表达式匹配目录中的文件名
  2. 监控的文件中,一旦有数据写入,Flume就会将信息写入到指定的Sink
  3. 高可靠,不会丢失数据
  4. 不会对跟踪文件有任何处理,不会重命名也不会删除
  5. 不支持Windows,不能读二进制文件。支持按行读取文本文件

本文以开源Flume流为例,介绍流接入HDFS ,后面在其上面建立ods层外表。

1.1 taildir source配置

  1. a1.sources.r1.type = TAILDIR 
  2. a1.sources.r1.positionFile = /opt/hoult/servers/conf/startlog_position.json 
  3. a1.sources.r1.filegroups = f1 
  4. a1.sources.r1.filegroups.f1 =/opt/hoult/servers/logs/start/.*log 

1.2 hdfs sink 配置

  1. a1.sinks.k1.type = hdfs 
  2. a1.sinks.k1.hdfs.path = /user/data/logs/start/logs/start/%Y-%m-%d/ 
  3. a1.sinks.k1.hdfs.filePrefix = startlog. 
  4. # 配置文件滚动方式(文件大小32M) 
  5. a1.sinks.k1.hdfs.rollSize = 33554432 
  6. a1.sinks.k1.hdfs.rollCount = 0 
  7. a1.sinks.k1.hdfs.rollInterval = 0 
  8. a1.sinks.k1.hdfs.idleTimeout = 0 
  9. a1.sinks.k1.hdfs.minBlockReplicas = 1 
  10. # 向hdfs上刷新的event的个数 
  11. a1.sinks.k1.hdfs.batchSize = 100 
  12. # 使用本地时间 
  13. a1.sinks.k1.hdfs.useLocalTimeStamp = true  

1.3 Agent的配置

 

  1. a1.sources = r1 
  2. a1.sinks = k1 
  3. a1.channels = c1 
  4. # taildir source 
  5. a1.sources.r1.type = TAILDIR 
  6. a1.sources.r1.positionFile = /opt/hoult/servers/conf/startlog_position.json 
  7. a1.sources.r1.filegroups = f1 
  8. a1.sources.r1.filegroups.f1 = /user/data/logs/start/.*log 
  9. # memorychannel 
  10. a1.channels.c1.type = memory 
  11. a1.channels.c1.capacity = 100000 
  12. a1.channels.c1.transactionCapacity = 2000 
  13. # hdfs sink 
  14. a1.sinks.k1.type = hdfs 
  15. a1.sinks.k1.hdfs.path = /opt/hoult/servers/logs/start/%Y-%m-%d/ 
  16. a1.sinks.k1.hdfs.filePrefix = startlog. 
  17. # 配置文件滚动方式(文件大小32M) 
  18. a1.sinks.k1.hdfs.rollSize = 33554432 
  19. a1.sinks.k1.hdfs.rollCount = 0 
  20. a1.sinks.k1.hdfs.rollInterval = 0 
  21. a1.sinks.k1.hdfs.idleTimeout = 0 
  22. a1.sinks.k1.hdfs.minBlockReplicas = 1 
  23. # 向hdfs上刷新的event的个数 
  24. a1.sinks.k1.hdfs.batchSize = 1000 
  25. # 使用本地时间 
  26. a1.sinks.k1.hdfs.useLocalTimeStamp = true 
  27. # Bind the source and sink to the channel 
  28. a1.sources.r1.channels = c1 
  29. a1.sinks.k1.channel = c1  

/opt/hoult/servers/conf/flume-log2hdfs.conf

1.4 启动

 

  1. flume-ng agent --conf-file /opt/hoult/servers/conf/flume-log2hdfs.conf -name a1 -Dflume.roog.logger=INFO,console 
  2.  
  3. export JAVA_OPTS="-Xms4000m -Xmx4000m -Dcom.sun.management.jmxremote" 
  4. # 要想使配置文件生效,还要在命令行中指定配置文件目录 
  5. flume-ng agent --conf /opt/hoult/servers/flume-1.9.0/conf --conf-file /opt/hoult/servers/conf/flume-log2hdfs.conf -name a1 -Dflume.roog.logger=INFO,console 

要$FLUME_HOME/conf/flume-env.sh加下面的参数,否则会报错误如下:

1.5 使用自定义拦截器解决Flume Agent替换本地时间为日志里面的时间戳

使用netcat source → logger sink来测试

 

  1. # a1是agent的名称。source、channel、sink的名称分别为:r1 c1 k1 
  2. a1.sources = r1 
  3. a1.channels = c1 
  4. a1.sinks = k1 
  5. # source 
  6. a1.sources.r1.type = netcat 
  7. a1.sources.r1.bind = linux121 
  8. a1.sources.r1.port = 9999 
  9. a1.sources.r1.interceptors = i1 
  10. a1.sources.r1.interceptors.i1.type = com.hoult.flume.CustomerInterceptor$Builder 
  11. # channel 
  12. a1.channels.c1.type = memory 
  13. a1.channels.c1.capacity = 10000 
  14. a1.channels.c1.transactionCapacity = 100 
  15. # sink 
  16. a1.sinks.k1.type = logger 
  17. # source、channel、sink之间的关系 
  18. a1.sources.r1.channels = c1 
  19. a1.sinks.k1.channel = c1  

拦截器主要代码如下:

 

  1. public class CustomerInterceptor implements Interceptor { 
  2.     private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); 
  3.  
  4.     @Override 
  5.     public void initialize() { 
  6.  
  7.     } 
  8.  
  9.     @Override 
  10.     public Event intercept(Event event) { 
  11.         // 获得body的内容 
  12.         String eventBody = new String(event.getBody(), Charsets.UTF_8); 
  13.         // 获取header的内容 
  14.         Map<String, String> headerMap = event.getHeaders(); 
  15.         final String[] bodyArr = eventBody.split("\\s+"); 
  16.         try { 
  17.             String jsonStr = bodyArr[6]; 
  18.             if (Strings.isNullOrEmpty(jsonStr)) { 
  19.                 return null
  20.             } 
  21.             // 将 string 转成 json 对象 
  22.             JSONObject jsonObject = JSON.parseObject(jsonStr); 
  23.             String timestampStr = jsonObject.getString("time"); 
  24.             //将timestamp 转为时间日期类型(格式 :yyyyMMdd) 
  25.             long timeStamp = Long.valueOf(timestampStr); 
  26.             String date = formatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(timeStamp), ZoneId.systemDefault())); 
  27.             headerMap.put("logtime"date); 
  28.             event.setHeaders(headerMap); 
  29.         } catch (Exception e) { 
  30.             headerMap.put("logtime""unknown"); 
  31.             event.setHeaders(headerMap); 
  32.         } 
  33.         return event; 
  34.  
  35.     } 
  36.  
  37.     @Override 
  38.     public List<Event> intercept(List<Event> events) { 
  39.         List<Event> out = new ArrayList<>(); 
  40.         for (Event event : events) { 
  41.             Event outEvent = intercept(event); 
  42.             if (outEvent != null) { 
  43.                 out.add(outEvent); 
  44.             } 
  45.         } 
  46.         return out
  47.     } 
  48.  
  49.     @Override 
  50.     public void close() { 
  51.  
  52.     } 
  53.  
  54.     public static class Builder implements Interceptor.Builder { 
  55.         @Override 
  56.         public Interceptor build() { 
  57.             return new CustomerInterceptor(); 
  58.         } 
  59.  
  60.         @Override 
  61.         public void configure(Context context) { 
  62.         } 
  63.     } 

启动

 

  1. flume-ng agent --conf /opt/hoult/servers/flume-1.9.0/conf --conf-file /opt/hoult/servers/conf/flume-test.conf -name a1 -Dflume.roog.logger=INFO,console 
  2. ## 测试 
  3. telnet linux121 9999  

吴邪,小三爷,混迹于后台,大数据,人工智能领域的小菜鸟。

责任编辑:未丽燕 来源: segmentfault.com
相关推荐

2023-08-07 01:25:39

2022-01-02 23:02:16

数据中台选型

2022-08-22 17:46:56

虚拟数仓Impala

2021-01-31 23:54:23

数仓模型

2022-07-26 15:38:58

数据仓数据治理数据团队

2021-01-04 05:42:48

数仓模型设计

2023-01-03 17:43:39

网易邮箱数仓

2022-11-25 10:07:12

数仓数据流开发

2021-08-02 17:24:37

数字化

2022-03-01 17:16:16

数仓建模ID Mapping

2021-12-02 08:41:30

数仓建模设计

2022-02-18 09:02:04

数据仓库治理

2022-01-13 10:45:48

数仓对象主题域

2023-11-23 16:53:56

数据仓库大数据

2022-08-01 15:58:48

数据仓库架构数据

2022-12-08 10:16:58

数据模型

2021-08-11 07:53:22

数仓维度建模

2021-01-05 05:30:30

数仓维度SCD

2023-02-20 07:33:47

Teradata数据仓库

2022-12-06 17:52:57

离线数仓治理
点赞
收藏

51CTO技术栈公众号