大数据之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中主要是对inputformat和outputformat进行定制
3.1 Sqoop 架构
- Hdaoop 生态系统包括:HDFS、Hive、Hbase等
- RDBMS体系包括:Mysql、Orcale、DB2等
- Sqoop的理解:SQL 到 Hadoop 和 Hadoop 到 SQL
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
-
4.3 sqoop 使用 五 要素
-
rdbms/mysql
- jdbcurl \ username \ password \ tablename
-
转换
- import / export
-
HDFS
- path
-
RDBMS以Mysql数据库为例讲解,拷贝jdbc驱动包到 $SQOOP_HOME/lib 目录下
4.4 常用命令
-
查看有哪些数据库
bin/sqoop list-database \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306 \ --username root \ --password 123456
五、Import 将数据导入到HDFS中
5.1 Import 概览
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 中
-
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'
-
创建一个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,速度很快
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
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

-
hive table
- table
- hiveserver2 进行 jdbc 方式查询数据
- hdfs file 保存到hdfs中
- export ---> mysql / orcale /db2
- table
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'
注意
八. sqoop 使用 --option-files
-
例子 实际企业中使用的
- 脚本 shell scripts
## step 1load data ...## step 2bin/hive -f## step 3bin/sqoop --options-file file_path/file_nameimport--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
- import
- 作业
- 将Oracle 11g中的表数据 导入到 hdfs和hive中
- Oracle --> hdfs(textfile)
- Oracle --> hdfs(snappy, parquet), load hive table ,select
- Oracle --> hive table
- 将Oracle 11g中的表数据 导入到 hdfs和hive中
- export
- hive /hdfs --> mysql/oracle
- hiveserver2 jdbc
5 大数据协作框架之Flume
- 实时文件收集框架
- Cloudera 开发的框架
- kafka/flume + storm(实时计算)/spark 集成
一、flume概述
1.1 flume 概述
- 分布式的:每台需要收集数据的服务器上都有一个flume客户端
- 稳定的
- 可用的
- 基于流式的数据
- 在线的数据分析应用,实时性要求特别高
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:中间可以进行一些其他的操作,例如数据清洗
- source
- Events
- Event是flume数据传输的基本单元,从source ---> hdfs
- Flume以事件的形式将数据从源头传送到最终的目的
- Event由可选的header和载有有数据的一个byte array构成
- header:里面可以有一些对于数据的操作,例如filter、参数传递
- 载有的数据对flumet是不透明的
- Header是容纳了key-value字符串对的无序集合,key在集合内是唯一的
- Header可以在上下文路由中使用扩展
- 其实就是Flume,Flume-ng只有一个角色节点:agent。
- 目的地:HDFS
1.3 flume 三要素解释
- 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 解压 & 安装
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包
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

五、三大组件常用属性
5.1 sources
-
Exec Source 执行文件/脚本/命令,通常用于测试
-
Spooling Directory Source 会监控这个目录
-
kafka Source
-
Syslog Sources 系统日志
-
HTTP Source 内网和外网之间的数据
5.2 channels
-
memory channel
-
File Channle 将数据放到一个文件中,sink直接从文件中获取
5.3 Sinks 核心
-
HDFS Sink
-
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 依赖包
- 将上面的 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;
- 实时产生的日志
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来的)
- 抽取
- RDBMS :Sqoop
- Nginx :Flume
- 分析
- MapReduce
- Hive
- Pig
- Impala:底层是内存
- 对于分析任务的调度
- OozieI
- 结果
- Query
- Reporting
- Analyze
7.2 flume 在数据仓库中的架构
7.2.1 flume
7.2.2 企业大数据仓库之数据收集架构
-
所有的需要收集日志的服务器全部是Linux
- 每个服务器上都运行一个hive,然后将数据收集到HDFS中
-
所有的服务器全部是windows
- 先将数据通过FTP收集到Linux服务器上
- 然后将Linux服务器上是数据通过flume收集到HDFS中
八、企业案例 flume收集数据存储到HDFS中
8.1 HDFS Sink
-
依据服务器上的时间抽取日志 server logs
-
0926
- /user/beifeng/flume/applogs
- /20150926
- xxx.log
- yyy.log
- zzz.log
- /20150926
- /user/beifeng/flume/applogs
-
上面的所有目录都可以自动创建出来的(按照服务器的时间创建目录)
-
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太大了,实时性差了
- 变通:将文件大小设置小一点
- 200MB太大了,实时性差了
8.3 Spooling Directory Source
8.3.1 相关参数
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

浙公网安备 33010602011771号