大数据之sqoop

4 大数据协作框架之sqoop

  • Hadoop 2.x
    • HDFS
    • YARN
    • MapReduce
    • Zookeeper
  • Hive

  • 对日志类型的海量数据
    • hdfs
    • mr, hive - hql

一、面临的问题

第一个问题:hdfs

  • 文件来源于哪里?

  • 数据怎样存储到hdfs ? 海量

  • 现实中的数据来源于两个方便

    • RDBMS(Oracle,MySQL,DB2....) >>>> sqoop(SQL to HADOOP)(底层都是mapreduce)
    • 文件(apache,nginx日志数据) >>>> Flume(实时抽取数据)

第二个问题:调度任务

  • 对数据分析的任务 job,至少都是上千(互联网公司)的,我们怎样去调度(调度任务)
    • 怎样执行,多长执行一次,执行频率
    • 某一些业务的分析,需要许多job任务共同完成,相互依赖关系,工作流怎样去调度 ?
  • 可用框架
    • Oozie :apache的
    • 宙斯:阿里的

第三个问题:监控

  • hadoop 2.x 生态系统中重要的框架,8个,怎样统一的监控?
  • 统一的 web ui 接面,管理框架,监控框架
  • Hue

二、回顾

  • hadoop 2.x
    • HDFS
    • yarn
    • mapreduce
  • Hive

三、Sqoop 概述

Sqoop工作机制是将导入或到处命令翻译成mapreduce程序来实现。在翻译出的mapreduce中主要是对inputformatoutputformat进行定制

3.1 Sqoop 架构

  • Hdaoop 生态系统包括:HDFS、Hive、Hbase等
  • RDBMS体系包括:Mysql、Orcale、DB2等
  • Sqoop的理解:SQL 到 Hadoop 和 Hadoop 到 SQL

image-20210410163236190

3.2 对于数据流的理解

站在Apache立场上看待数据流问题,可以分为数据的导入和导出

  • Import 数据导入:RDBMS ----> Hadoop
  • Export 数据导出:Hadoop ----> RDBMS

四、sqoop 使用要点

4.1 sqoop 依赖

  • 依赖java

  • 依赖hadoop

  • sqoop 依赖与hadoop

    • 数据的一方,存储在hdfs
    • 底层的数据传输的实现是mapreduce/yarn
    • 所以,我们需要对针对hadoop的版本对sqoop进行编译
    • 由于编译sqoop十分的麻烦,所以在企业实际情况中,Hadoop都使用Cloudera 或者 Hortonworks
  • 实际使用版本下载地址 CDH

  • CDH 5.3.x 版本,非常稳定,好用 cdh-5.3.6 各个版本之间的依赖和兼容性,我们不需要考虑

    • hadoop-2.5.0-cdh5.3.6.tar.gz
    • hive-0.13.1-cdh5.3.6.tar.gz
    • zookeeper-3.4.5-cdh5.3.6.tar.gz
    • sqoop-1.4.5-cdh5.3.6.tar.gz

4.2 部署Sqoop

  • 部署HDFS

  • 部署Yarn

  • 部署Hive

  • 安装Sqoop

    • 修改配置

      • sqoop-env-template.sh 重命名为 sqoop-env.sh

      • 修改 sqoop-env.sh 配置文件

        #Set path to where bin/hadoop is available
        export HADOOP_COMMON_HOME=/opt/models/hadoop-2.5.0
        
        #Set path to where hadoop-*-core.jar is available 
        export HADOOP_MAPRED_HOME=/opt/models/hadoop-2.5.0
          
        #Set the path to where bin/hive is available
        export HIVE_HOME=/opt/models/hive-0.13.1
        
    • 使用 sqoop

      bin/sqoop
      

      image-20210415134436343

4.3 sqoop 使用 五 要素

  1. rdbms/mysql

    1. jdbcurl \ username \ password \ tablename
  2. 转换

    1. import / export
  3. HDFS

    1. path

    image-20210415143841115

  4. RDBMS以Mysql数据库为例讲解,拷贝jdbc驱动包到 $SQOOP_HOME/lib 目录下

4.4 常用命令

  1. 查看有哪些数据库

    bin/sqoop list-database \
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306 \
    --username root \
    --password 123456
    

五、Import 将数据导入到HDFS中

5.1 Import 概览

image-20210417110727249

5.2 Import 命令 -- 仅仅使用 map

5.2.1 导入数据

  • 查看帮助命令:bin/sqoop help import

  • 准备mysql数据

    • 在mysql中创建表格

      create table `my_user` (
      	`id` tinyint(4) not null auto_increment,
          `account` varchar(255) default null,
          `password` varchar(255) default null,
          primary key (`id`)
      )
      
    • 向 mysql 中的表中插入数据

      insert into `my_user` values ('1', 'admin', 'admin');
      insert into `my_user` values ('2', 'pu', '123456');
      insert into `my_user` values ('3', 'system', 'system');
      insert into `my_user` values ('4', 'zxh', 'zxh');
      insert into `my_user` values ('5', 'test', 'test');
      insert into `my_user` values ('6', 'pudong', 'pudong');
      insert into `my_user` values ('7', 'qiqi', 'qiqi');
      
  • 导入数据到Hadoop

    # 当没有指定导入的目录的时候,系统默认会在当前用户主目录下创建一个以表名为名称的文件夹,并将数据存入
    bin/sqoop import \
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
    --username root \
    --password 123456 \
    --table my_user
    
    #  指定目录导入
    bin/sqoop import \
    --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
    --username root \
    --password 123456 \
    --table my_user
    --target-dir /user/beifeng/sqoop/import/im_my_user \
    # 设置 map 的个数 在hadoop中一个 map 一份数据
    --num-mappers 1
    
    • 日志分析

      • Beginning code generation 生成代码

        • 会以该表名(my_user)为名新建一个 my_user.java 的类,并存放在 $SQOOP_HOME 目录中
      • 生成完类之后,才开始执行sql语句

        select t.* from `my_user` as t limit 1
        select t.* from `my_user` as t limit 1
        
      • 开始执行hadoop相关的东西

        • ...../my_user.java uses or overrides a deprecated API
        • Note: Recompile with -xlint: deprecation for details
      • 开始写入

        • INFO orm.CompilationManager: Writing jar file : /tmp/sqoop-beifeng/compi......
        • 在yarn中显示为 my_user.jar
        • Beginning import of my_user
        • 执行mapreduce -- sqoop底层实现

5.2.2 导入数据的子集 where

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--table my_user
--target-dir /user/beifeng/sqoop/import/im_my_user \
--where "country = 'USA' "

5.2.3 导入格式设置 -- 存在于 import control arguments 中

image-20210419105710534

  • hive 中数据存储文件

    • textfile
    • orcfile
    • parquet
  • 导入hadoop格式设置为 parquet (常用的格式)

    bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user--target-dir /user/beifeng/sqoop/import/im_my_user_parquet \--where "country = 'USA' " \--num-mappers 1 \--as-parquetfile
    
  • 在hive中创建一张表:hive_user

    drop table if exists default.hive_user;create table default.hive_user (	id int,    username string,    password string)# 分隔符需要去读取导入的文件,才能确定row format delimited fileds terinated by ','stored as parquet;
    
  • 将数据加载到hive

    hive (default) > load data inpath '/user/beifeng/sqoop/imp_my_user_parquet' into table default.hive_user ;
    
    • 导入后,hive中hive_user中的数据全是NULL ???

5.2.4 子查询 --columns

bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user--target-dir /user/beifeng/sqoop/import/im_my_user_column \--where "country = 'USA' " \--num-mappers 1 \--as-parquetfile \# 导入某些列--columns id,username

5.2.5 过滤/查询 --query

  • 在实际的项目中,要处理的数据,需要进行初步的清洗和过滤
    • 某些字段的过滤
    • 条件
    • join
bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \# 报错# --query 'select id, username from my_user' \# 正确--query 'select id, username from my_user where $CONDITIONS ' \--table my_user--target-dir /user/beifeng/sqoop/import/im_my_user_query \--where "country = 'USA' " \--num-mappers 1 \--as-parquetfile \# 导入某些列--columns id,username

5.2.6 压缩 --compress

bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user--target-dir /user/beifeng/sqoop/import/im_my_user_snappy \--num-mappers 1 \# 开启压缩--compress \# 设置压缩方式--compression-codec org.apache.hadoop.io.compress.SnappyCodec \# 设置分隔符--fields-terminated-by '\t' 

image-20210419154020928

  • 创建一个snappy压缩的表,并导入上面的数据,然后查询

    drop table if exists default.hive_user_snappy;create table default.hive_user_snappy (	id int,    username string,    password string)# 分隔符需要去读取导入的文件,才能确定row format delimited fileds terinated by ',' ;load data inpath 'user/beifeng/sqoop/imp_my_user_snappy' into table default.hive_user_snappy ; # queryselect * from default.hive_user_sanppy ;
    

5.2.7 增量导入 increment 两种方式

5.2.7.1 query
  • 有一个唯一的标识符,在企业中,通常这个表都有一个字段,类似于插入时间 createtime

    where createtime => xxxx and createtime < xxxx
    
5.2.7.2 sqoop 参数
  • --check-colunm<colunm> Source column to check for incremental change
  • --incremental <import-type> Define an incremental import of type 'append' or 'lastmodified'
    • append : 增加
    • lastmodified
  • --last-value <value> Last imported value in the incrremental check column
bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user--target-dir /user/beifeng/sqoop/import/im_my_user_incr \--num-mappers 1 \--incremental append \--check-column id \# 上一次最后的值,这一次的开始值--last-value 4

5.2.8 --direct

走mysql直接导入的路径,不走mapreduce,速度很快

image-20210425143314125

bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user--target-dir /user/beifeng/sqoop/import/im_my_user_incr \--num-mappers 1 \--delete-target-dir \--direct

image-20210425143834838

5.2.9 custom boundary query import

bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--query 'SELECT normcities.id, ' \countries.country, \normcities.city \from normcities \join counties using(country_id) \where $CONDITIONS ' \--split-by id \--target-dir cities \--boundary-query "select min(id), max(id) from normcities"

六、Export 导出数据RDBMS

image-20210425144547078

  • hive table

    • table
      • hiveserver2 进行 jdbc 方式查询数据
    • hdfs file 保存到hdfs中
      • export ---> mysql / orcale /db2

6.1 export to mysql table

bin/sqoop export \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user \# hdfs 的路径--export-dir /user/beifeng/sqoop/exp/user/ \--num-mappers 1

七. Hive 数据导入导出

hive 的数据本身就存储在hdfs中,仅仅是将文件加上了scheam

7.1 import to hive table

  • 在 hive 中创建一张表

    use default ;drop table if exists user_hive ;create table user_hive(id int,account string,password string)row format delimited filesds terminated by '\t' ;
    
  • 导入数据

    bin/sqoop import \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user \--fields-terminated-by '\t' \# 删除缓存目录--delete-target-dir \# hdfs 的路径--target-dir /user/beifeng/sqoop/imp_my_user \--num-mappers 1 \# 指定导入到 hive 中的哪张表中--hive-database default \--hive-table user_hive \
    

7.2 export to mysql table 和之前的导出是一样的

bin/sqoop export \--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \--username root \--password 123456 \--table my_user \# hdfs 的路径--export-dir /user/beifeng/sqoop/exp/user/ \--num-mappers 1 \--hive-fields-terminated-by '\t'

注意

image-20210426134648858

八. sqoop 使用 --option-files

image-20210426143218663

  • 例子 实际企业中使用的

    • 脚本 shell scripts
    ## step 1load data ...## step 2bin/hive -f## step 3bin/sqoop --options-file file_path/file_name
    
    import--connectjdbc:mysql://hadoop-senior.ibeifeng.com:3306/test--usernameroot--password123456--tablemy_user--target-dir/user/beifeng/sqoop/imp_my_user--num-mapper1
    
    • 执行文件
    bin/sqoop --options-file file_path/file_name# 传递参数bin/sqoop --options-file file_paht/file_name --num-mapper 2
    

九. 总结

  • 数据转换工具 sqoop
    • Sqoop 功能、使用原则
    • 将RDBMS数据带入到HIve表中(全量、增量)
    • 将HDFS上文件导出到RDBMS表中
  • 在实际的开发过程中
    • import
      • oracle/db2 --> hdfs/ hive/ hbase
  • 作业
    • 将Oracle 11g中的表数据 导入到 hdfs和hive中
      • Oracle --> hdfs(textfile)
      • Oracle --> hdfs(snappy, parquet), load hive table ,select
      • Oracle --> hive table
  • export
    • hive /hdfs --> mysql/oracle
    • hiveserver2 jdbc

5 大数据协作框架之Flume

  • 实时文件收集框架
  • Cloudera 开发的框架

image-20210427104032409

  • kafka/flume + storm(实时计算)/spark 集成

一、flume概述

1.1 flume 概述

image-20210427104832675

image-20210427111732374

image-20210427111745451

  • 分布式的:每台需要收集数据的服务器上都有一个flume客户端
  • 稳定的
  • 可用的
  • 基于流式的数据
  • 在线的数据分析应用,实时性要求特别高

image-20210427134328836

1.2 flume架构设计 & 说明

  • 源端:日志在某个服务器上面(web server)
  • 中间层:Agent(client):收集
    • 其实就是Flume,Flume-ng只有一个角色节点:agent。
      • 拿到元数据source,每隔一段时间去获取数据
      • source拿到数据之后,将数据封装成event,并放到管道当中
      • Channel:管道,保证了数据的安全性
      • 管道将数据放入到sink
      • sink:慢慢的从Channel中拿数据,并写入到HDFS中
    • agent由三个角色组成
      • source
        • 用于采集数据,source是产生数据流的地方
        • source会将产生的数据流传输到channel
      • channle
        • 链接sources和sinks,这个有点像一个队列
        • 将数据存放到内存中。速度比较快
      • sink
        • 从channel收集到数据,将数据写到目标源,可以是下一个source也可以是HDFS或者HBase
        • sink是用于前端展示的
      • source --> channel:中间可以进行一些其他的操作,例如数据清洗
      • channel --> sink:中间可以进行一些其他的操作,例如数据清洗
    • Events
      • Event是flume数据传输的基本单元,从source ---> hdfs
      • Flume以事件的形式将数据从源头传送到最终的目的
      • Event由可选的header和载有有数据的一个byte array构成
        • header:里面可以有一些对于数据的操作,例如filter、参数传递
        • 载有的数据对flumet是不透明的
        • Header是容纳了key-value字符串对的无序集合,key在集合内是唯一的
        • Header可以在上下文路由中使用扩展
  • 目的地:HDFS

1.3 flume 三要素解释

image-20210427142047814

  • source -- push -- > channel
    • source 是自己将数据push给channel
  • channel -- pull --> sink
    • sink 是自己主动到 channel 中去拉取

二、flume 使用

2.1 运行环境

  • 运行在有logs的地方
  • 系统:Linux
  • JVM/JDK 1.7
    • 如何选择jdk版本:archive.cloudera.com/cm5中可以找到相关的
  • 轻量级的服务(eg:zk,jn,zkfc,sqoop),对于内存要求不高
  • Disk Space:10G左右就行了
  • Directory Permission:Read/Write

2.2 解压 & 配置

2.1.1 解压 & 安装

image-20210427144216257

2.1.2 配置

2.1.2.1 配置flume-env.sh
  • 将 flume-env.sh.template 复制并重命名为 flume-env.sh
  • 修改其中的配置
export JAVA_HOME=/opt/models/jdk1.8.0_281
2.1.2.2 放入 hdfs jar包

image-20210427145107581

2.2 具体使用

# 查看具体使用方式bin/flume-ng# 查看版本bin/flume-ng version

三、使用方式 & 命令

3.1 global options

3.1.1 --conf,-c <conf>

  • use configs in <conf> directory
  • 指定配置文件路径

3.1.2 --classpath, -C <cp>

  • append to the classpath
  • 依赖的一些包,例如hive、HBase等
  • 现在我们不用,直接放到 lib 目录中就可以了

3.1.3 -Dproperty=value

  • sets a java system property value
  • 日志是在后端的,如果我们需要在前端监控或者使用的话,就需要我们去设置这个值了

3.2 agent options

3.2.1 --name, -n <name>

  • the name of this agent(required)

3.2.2 --conf-file, -f <file>

  • specify a config file(required if -z missing)

3.3 案例

bin/flume-ng agent --conf conf --name agent-test --conf-file test.confbin/flume-ng agent -c conf -n agent-test --conf-file test.conf

四、Agent 应用编写

4.1 修改配置文件 flume-conf.properties

  • 将 flume-conf.properties.template 复制并命名为 a1.conf

  • 修改 a1.conf

    ### define agent### agent name : a1a1.sources = r1a1.channels = c1a1.sinks = k1### define sourcesa1.sources.r1.type = netcata1.sources.r1.bind = hadoop-senior.ibeifeng.coma1.sources.r1.port = 444### define channelsa1.channels.c1.type = memory# 每个channel 中存储的 event 个数a1.channels.c1.capacity = 1000# sink 每次获取多少个event = 每次提交多少个事务给 sinka1.channels.c1.transactionCapacity = 100### define sinka1.sinks.k1.type = logger a1.sinks.k1.channel = c1## 每次显示的最大的字节长度a1.sinks.k1.maxBytesToLog = 1024### bind the sources and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1
    

4.2 安装软件

  • 安装 xinetd

    # 启动 xinetd 服务/etc/rc.d/initd/xinetd restart
    
  • 安装 telnet

  • 安装 telnet-server

  • 安装 netcat

4.3 运行 Agent a1.conf

bin/flume-ng agent \-c conf \-n a1 \-f conf/a1.conf \-Dflume.root.logger=DEBUG,console

4.4 使用 telnet 向端口发送数据 测试

telnet hadoop-senior.ibeifeng.com 444flume hello 

image-20210428101906863

五、三大组件常用属性

5.1 sources

image-20210428102349779

  • Exec Source 执行文件/脚本/命令,通常用于测试

  • Spooling Directory Source 会监控这个目录

    image-20210428102914197

  • kafka Source

  • Syslog Sources 系统日志

  • HTTP Source 内网和外网之间的数据

5.2 channels

image-20210428103001989

  • memory channel

    image-20210428103050968

  • File Channle 将数据放到一个文件中,sink直接从文件中获取

    image-20210428103109833

5.3 Sinks 核心

image-20210428103159802

  • HDFS Sink

    image-20210428103408239

  • Hive Sink

  • HBase Sinks

  • MorphlineSolrSink 往Solr中抽取

  • ElasticSearchSink 检索

六、综合案例

6.1 需求

  • 收集log
    • hive运行日志 /opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6/logs/hive.log
    • tail -f 读取的方式收集
  • memory
  • hdfs
    • 存储到 /user/beifeng/flume/hive-logs/ 目录中

6.2 编写Agent程序 a2 配置文件 flume-tail.conf

### define agent### agent name : a2a2.sources = r2a2.channels = c2a2.sinks = k2### define sourcesa2.sources.r2.type = execa2.sources.r2.command = tail -f /opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6/logs/hive.loga2.sources.r2.sources.shell = /bin/bash -c### define channelsa2.channels.c2.type = memory# 每个channel 中存储的 event 个数a2.channels.c2.capacity = 2000# sink 每次获取多少个event = 每次提交多少个事务给 sinka2.channels.c2.transactionCapacity = 200### define sinka2.sinks.k2.type = hdfs ## HDFS directory path (eg hdfs://namenode/flume/webdata/)a2.sinks.k2.hdfs.path = hdfs:hadoop-senior.ibeifeng.com:8020/user/beifeng/flume/hive-logs/a2.sinks.k2.hdfs.fileType = DataStreama2.sinks.k2.hdfs.writeFormat = Text# number of events written to file before it is flushed to HDFSa2.sinks.k2.hdfs.batchSize = 10### bind the sources and sink to the channela2.sources.r2.channels = c2a2.sinks.k2.channel = c2

6.3 放入 hadoop 依赖包

image-20210428112651603

  • 将上面的 jar 包放入到 flume 的 lib 目录中

6.3 运行 Agent 程序 a2

bin/flume-ng agent \-c conf \-n a2 \-f conf/flume-tail.conf \-Dfilum.root.logger = DEBUG,console

6.4 启动 Hive 并进行一些操作

  • 操作
hive (default) > show databases;hive (default) > show tables;hive (default) > select count(1) from user;
  • 实时产生的日志

image-20210428114717771

6.5 关于 hadoop 做了 HA

配置文件中

a2.sinks.k2.hdfs.path = hdfs:hadoop-senior.ibeifeng.com:8020/user/beifeng/flume/hive-logs/

修改为

a2.sinks.k2.hdfs.path = hdfs://ns1/user/beifeng/flume/hive-logs/

其中的ns1是在hadoop配置文件配置的,flume需要去读取并解析ns1相关的东西

解决方式:将hadoop中相关的文件放到 flume 的conf 目录中就可以了

  • core-site.xml
  • hdfs-site.xml

6.5 作业

  • 在 flume抽取数据时,如何在hdfs sink 如何设置文件的大小

七、项目架构(企业中)

7.1 数据仓库架构(根据Hadoop来的)

image-20210428133802923

  • 抽取
    • RDBMS :Sqoop
    • Nginx :Flume
  • 分析
    • MapReduce
    • Hive
    • Pig
    • Impala:底层是内存
  • 对于分析任务的调度
    • OozieI
  • 结果
    • Query
    • Reporting
    • Analyze

7.2 flume 在数据仓库中的架构

7.2.1 flume

image-20210428145349780

7.2.2 企业大数据仓库之数据收集架构

  1. 所有的需要收集日志的服务器全部是Linux

    image-20210428195455472

    • 每个服务器上都运行一个hive,然后将数据收集到HDFS中
  2. 所有的服务器全部是windows

    image-20210428195937805

    • 先将数据通过FTP收集到Linux服务器上
    • 然后将Linux服务器上是数据通过flume收集到HDFS中

八、企业案例 flume收集数据存储到HDFS中

8.1 HDFS Sink

image-20210428200439135

  • 依据服务器上的时间抽取日志 server logs

    • 0926

      • /user/beifeng/flume/applogs
        • /20150926
          • xxx.log
          • yyy.log
          • zzz.log
    • 上面的所有目录都可以自动创建出来的(按照服务器的时间创建目录)

    • image-20210428200915967

      hdfs.useLocalTimestamp = truehdfs.path = hdfs://hadoop-senior.ibeifeng.com:8020/user/beifeng/flume/applogs/%Y%m%d
      

8.2 案例要求

  • 监控某个日志文件的目录:
    • /app/logs/2014-12-20
    • 。。。。
    • /app/logs/2014-12-29
      • zz.log 变化的,未完成的
      • xxx.log.comp 200MB 已经完成的
      • yy.log.comp 200MB 已经完成的
  • 要求:只收集已经完成的日志
    • 200MB太大了,实时性差了
      • 变通:将文件大小设置小一点

8.3 Spooling Directory Source

8.3.1 相关参数

image-20210428102914197

8.3.2 VS exec

  • 在使用 exec 来监听数据源虽然实时性较高,但是可靠性较差,当 source 程序运行一场或者Linux明令终端都会造成数据丢失,在恢复正常运行之前数据的完整性无法得到保障
  • Spooling Directory Paths 通过监听某个目录下的新增文件,将文件的内容读取出来,实现日志信息的收集。实际生产中会结合 log4j 来使用。被传输结束的文件会修改后缀名,添加 .completed 后缀(可修改)

8.4 监控目录 实时抽取数据

  • 监控目录

    • 日志目录,抽取完整的日志文件,正在写的日志文件不抽取
  • 使用 FIleChannel

    • 本地文件系统缓冲,比内存安全性更高
  • 数据存储在HDFS

    • 存储对应hive表的目录或者hdfs目录
  • 思考

    • 每天抽取文件到一个目录中,自动生成目录,如何做?

8.5 Agent 程序编写 a3

  • 编写 a3 的配置文件 flume-app.conf
### define agent### agent name : a3a3.sources = r3a3.channels = c3a3.sinks = k3### define sourcesa3.sources.r3.type = spooldir## 需要监控的目录a3.sources.r3.spoolDir = /opt/cdh-5.3.6/flume-1.5.0-cdh5.3.6/spoollogs## 设置抽取时忽略的文件 ## Regular expression specifying which files ignore(skip)a3.sources.r3.ignorePattern = ^(.)*\\.log$## 设置抽取已完成的文件的后缀a3.channels.c3.fileSuffix = .delete### define channelsa3.channels.c3.type = filea3.channels.c3.checkpointDir = /opt/cdh-5.3.6/flume-1.5.0-cdh5.3.6/filechannel/checkpointa3.channels.c3.dataDirs = /opt/cdh-5.3.6/flume-1.5.0-cdh5.3.6/filechannel/data## 每个channel 中存储的 event 个数a3.channels.c3.capacity = 3000## sink 每次获取多少个event = 每次提交多少个事务给 sinka3.channels.c3.transactionCapacity = 300### define sinka3.sinks.k3.type = hdfs ## 自动按照server时间创建对应的目录# a3.sinks.k3.hdfs.hdfs.useLocalTimestamp = true# a3.sinks.k3.hdfs.hdfs.path = hdfs://hadoop-senior.ibeifeng.com:8020/user/beifeng/flume/applogs/%Y%m%da3.sinks.k3.hdfs.path = /user/beifeng/flume/spoollogs/a3.sinks.k3.hdfs.fileType = DataStreama3.sinks.k3.hdfs.writeFormat = Text# number of events written to file before it is flushed to HDFSa3.sinks.k3.hdfs.batchSize = 10### bind the sources and sink to the channela3.sources.r3.channels = c3a3.sinks.k3.channel = c3

8.6 运行 a3

bin/flume-ng agent \-conf conf \-name a3 \-conf-file conf/flume-app.conf \-Dflume.root.logger=DEBUG,console
posted @ 2021-09-22 18:18  Theniceboy  阅读(583)  评论(0)    收藏  举报