在线教育项目中的需求和模块是什么?
整个项目架构中使用到了哪些技术?
常用的数据源有哪些?
目标:掌握Flume的功能与应用场景
路径
实施
小结
目标:掌握Flume的基本组成
路径
实施
- http://flume.apache.org/releases/content/1.7.0/FlumeUserGuide.html
Agent:每个Agent就是一个Flume的程序,每个Agent由三个部分组成:source、channel、sink
Source:负责读取数据,Source会动态的监听数据源,将数据源新增的数据实时采集变成Event数据流,将每个Event发送到Channel中
Channel:临时缓存数据,将source发送过来的event的数据缓存起来,供Sink取数据
Sink:负责发送数据,从Channel中读取采集到的数据,将数据写入目标地
Event:用于构建每一条数据的对象,每一条数据就会变成一个Event,进行传递,最终写入目标
组成
理解
Event{
Map head;
byte[] body;--每一条数据的字节流
}
小结
目标:掌握Flume的基本开发规则
实施
step1:开发一个Flume的参数配置文件
properties格式的文件
#step1:定义一个agent:agent的名称、定义source、channel、sink
#step2:定义source:读什么、读哪
#step3:定义channel:缓存在什么地方
#step4:定义sink:写入什么地方
step2:运行flume的agent程序
flume-ng
Usage: bin/flume-ng [options]...
flume-ng agent --conf,-c --conf-file,-f --name,-n
小结
如何开发一个Flume程序?
step1:先开发一个配置文件:properties
step2:运行这个文件
flume-ng agent -c -f -n
目标:实现Flume程序的开发测试
实施
需求:采集Hive的日志、临时缓存在内存中、将日志写入Flume的日志中并打印在命令行
- Exec Source
- 功能:执行一条Linux的命令来实现采集
- 命令:搭配tail -f
- channel:Flume提供了各种channel用于缓存数据
- memory channel:将数据缓存在内存中
- sink:Flume提供了很多种sink
开发
创建测试目录
cd /export/server/flume-1.6.0-cdh5.14.0-bin
mkdir usercase
复制官方示例
cp conf/flume-conf.properties.template usercase/hive-mem-log.properties
开发配置文件
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per a1,
# in this case called 'a1'
#define the agent
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#define the source
a1.sources.s1.type = exec
a1.sources.s1.command = tail -f /export/server/hive-1.1.0-cdh5.14.0/logs/hiveserver2.log
#define the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
#define the sink
a1.sinks.k1.type = logger
#bond
a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1
运行
flume-ng agent -c conf/ -f usercase/hive-mem-log.properties -n a1 -Dflume.root.logger=INFO,console
结果
小结
目标:掌握Exec Source的功能与应用场景
路径
实施
功能与应用场景
应用场景:实现动态监听采集单个文件的数据
测试实现
小结
目标:掌握Taildir Source的功能与应用场景
路径
实施
功能与应用场景
应用场景
需求:当前日志文件是一天一个,需要每天将数据实时采集到HDFS上
数据:Linux
/tomcat/logs/2020-01-01.log
2020-01-02.log
……
2020-11-10.log
问题:能不能exec source进行采集?
解决:Taildir Source
功能:从Apache Flume1.7版本开始支持,动态监听采集多个文件
测试实现
需求:让Flume动态监听一个文件和一个目录下的所有文件
准备
cd /export/server/flume-1.6.0-cdh5.14.0-bin
mkdir position
mkdir -p /export/data/flume
echo " " >> /export/data/flume/bigdata01.txt
mkdir -p /export/data/flume/bigdata
开发
# define sourceName/channelName/sinkName for the agent
a1.sources = s1
a1.channels = c1
a1.sinks = k1
# define the s1
a1.sources.s1.type = TAILDIR
#指定一个元数据记录文件
a1.sources.s1.positionFile = /export/server/flume-1.6.0-cdh5.14.0-bin/position/taildir_position.json
#将所有需要监控的数据源变成一个组,这个组内有两个数据源
a1.sources.s1.filegroups = f1 f2
#指定了f1是谁:监控一个文件
a1.sources.s1.filegroups.f1 = /export/data/flume/bigdata01.txt
#指定f1采集到的数据的header中包含一个KV对
a1.sources.s1.headers.f1.headerKey1 = value1
#指定f2是谁:监控一个目录下的所有文件
a1.sources.s1.filegroups.f2 = /export/data/flume/bigdata/.*
#指定f2采集到的数据的header中包含一个KV对
a1.sources.s1.headers.f2.headerKey1 = value2
a1.sources.s1.fileHeader = true
# define the c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# def the k1
a1.sinks.k1.type = logger
#source、channel、sink bond
a1.sources.s1.channels = c1
a1.sinks.k1.channel = c1
元数据文件的功能:/export/server/flume-1.6.0-cdh5.14.0-bin/position/taildir_position.json
问题:如果Flume程序故障,重启Flume程序,已经被采集过的数据还要不要采集?
需求:不需要,不能导致数据重复
功能:记录Flume所监听的每个文件已经被采集的位置
[
{
"inode":34599996,"pos":14,"file":"/export/data/flume/bigdata01.txt"},{
"inode":67595704,"pos":19,"file":"/export/data/flume/bigdata/test01.txt"},{
"inode":67805657,"pos":7,"file":"/export/data/flume/bigdata/test02.txt"}
]
补充:工作中可能会见到其他的source
小结
目标:掌握file channel与mem channel的功能与应用
实施
mem Channel:将数据缓存在内存中
特点:读写快、容量小、安全性较差
应用:小数据量的高性能的传输
file Channel:将数据缓存在文件中
特点:读写相对慢、容量大、安全性较高
应用:数据量大,读写性能要求不高的场景下
常用属性
小结
目标:掌握HDFS Sink的功能与应用
路径
实施
HDFS sink的功能
常用的SINk
问题:为什么离线采集不直接写入Hive,使用Hive sink
功能:将Flume采集的数据写入HDFS
问题:Flume作为HDFS客户端,写入HDFS数据
解决
方式一:Flume写地址的时候,指定HDFS的绝对地址
hdfs://node1:8020/nginx/log
方式二:在Flume中配置Hadoop的环境变量,将core-site和hdfs-site放入Flume的配置文件目录
需求:将Hive的日志动态采集写入HDFS
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per a1,
# in this case called 'a1'
#定义当前的agent的名称,以及对应source、channel、sink的名字
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#定义s1:从哪读数据,读谁
a1.sources.s1.type = exec
a1.sources.s1.command = tail -f /export/server/hive-1.1.0-cdh5.14.0/logs/hiveserver2.log
#定义c1:缓存在什么地方
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
#定义k1:将数据发送给谁
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://node1:8020/flume/test1
#s1将数据给哪个channel
a1.sources.s1.channels = c1
#k1从哪个channel中取数据
a1.sinks.k1.channel = c1
指定文件大小
问题:Flume默认写入HDFS上会产生很多小文件,都在1KB左右,不利用HDFS存储
解决:指定文件大小
hdfs.rollInterval 30 每隔多长时间产生一个文件,单位为s
hdfs.rollSize 1024 每个文件多大产生一个文件,字节
hdfs.rollCount 10 多少个event生成一个文件
如果不想使用某种规则,需要关闭,设置为0
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per a1,
# in this case called 'a1'
#定义当前的agent的名称,以及对应source、channel、sink的名字
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#定义s1:从哪读数据,读谁
a1.sources.s1.type = exec
a1.sources.s1.command = tail -f /export/server/hive-1.1.0-cdh5.14.0/logs/hiveserver2.log
#定义c1:缓存在什么地方
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
#定义k1:将数据发送给谁
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://node1:8020/flume/test1
#指定按照时间生成文件,一般关闭
a1.sinks.k1.hdfs.rollInterval = 0
#指定文件大小生成文件,一般120 ~ 125M对应的字节数
a1.sinks.k1.hdfs.rollSize = 10240
#指定event个数生成文件,一般关闭
a1.sinks.k1.hdfs.rollCount = 0
#s1将数据给哪个channel
a1.sources.s1.channels = c1
#k1从哪个channel中取数据
a1.sinks.k1.channel = c1
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210508164241255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI1NDY3,size_16,color_FFFFFF,t_70)
指定分区
问题:如何实现分区存储,每天一个或者每小时一个目录?
解决:添加时间标记目录
# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per a1,
# in this case called 'a1'
#定义当前的agent的名称,以及对应source、channel、sink的名字
a1.sources = s1
a1.channels = c1
a1.sinks = k1
#定义s1:从哪读数据,读谁
a1.sources.s1.type = exec
a1.sources.s1.command = tail -f /export/server/hive-1.1.0-cdh5.14.0/logs/hiveserver2.log
#定义c1:缓存在什么地方
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
#定义k1:将数据发送给谁
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://node1:8020/flume/log/daystr=%Y%m%d
#指定按照时间生成文件,一般关闭
a1.sinks.k1.hdfs.rollInterval = 0
#指定文件大小生成文件,一般120 ~ 125M对应的字节数
a1.sinks.k1.hdfs.rollSize = 10240
#指定event个数生成文件,一般关闭
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#s1将数据给哪个channel
a1.sources.s1.channels = c1
#k1从哪个channel中取数据
a1.sinks.k1.channel = c1
其他参数
#指定生成的文件的前缀
a1.sinks.k1.hdfs.filePrefix = nginx
#指定生成的文件的后缀
a1.sinks.k1.hdfs.fileSuffix = .log
#指定写入HDFS的文件的类型:普通的文件
a1.sinks.k1.hdfs.fileType = DataStream
小结
Flume补充:自己回去看,只要知道有这个东西即可
Flume架构
一个agent中可以有多个source、channel、sink
a1.sources = s1
a1.channels = c1 c2
a1.sinks = k1 k2
Collect架构
两层Flume架构:如果大量并发直接写入HDFS,导致HDFS的IO负载比较高
第一层
第二层
高级组件
Flume Channel Selectors
功能:用于决定source怎么将数据给channel
规则
默认:source默认将数据给每个channel一份
选择:根据event头部的key值不同,给不同的channel
Multiplexing Channel Selector
a1.sources = r1
a1.channels = c1 c2 c3 c4
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = state
a1.sources.r1.selector.mapping.CZ = c1
a1.sources.r1.selector.mapping.US = c2 c3
a1.sources.r1.selector.default = c4
Flume Interceptors:拦截器
功能:可以给event的头部添加KV,还可以对数据进行过滤
提供
Timestamp Interceptor:自动在每个event头部添加一个KV
key:timestamp
value:event产生的时间
a1.sources = r1
a1.channels = c1
a1.sources.r1.channels = c1
a1.sources.r1.type = seq
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = timestamp
Host Interceptor:自动在每个event头部添加一个KV
Static Interceptor:自动在每个event头部添加一个KV
Regex Filtering Interceptor:正则过滤拦截器,判断数据是否符合正则表达式,不符合就直接过滤,不采集
Sink processor
功能:实现collect架构中的高可用和负载均衡
高可用failover:两个sink,一个工作,一个不工作
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000
负载均衡load_balance:两个sink,一起工作
a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.selector = random
,
random目标:掌握Sqoop的功能与应用场景
路径
实施
功能
本质
特点
应用
测试
sqoop list-databases --connect jdbc:mysql://node3:3306 --username root --password 123456
小结
目标:实现Sqoop导入数据到HDFS中
路径
实施
准备数据
MySQL创建数据库==【在MySQL中执行】==
create database sqoopTest;
use sqoopTest;
MySQL创建数据表==【在MySQL中执行】==
CREATE TABLE `tb_tohdfs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySQL插入数据==【在MySQL中执行】==
insert into tb_tohdfs values(null,"laoda",18);
insert into tb_tohdfs values(null,"laoer",19);
insert into tb_tohdfs values(null,"laosan",20);
insert into tb_tohdfs values(null,"laosi",21);
导入语法
sqoop import --help
usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS]
测试导入
常用参数
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--columns id,name \
--delete-target-dir \
--target-dir /sqoop/import/test01 \
--fields-terminated-by '\t' \
-m 1
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--where 'id > 2' \
--delete-target-dir \
--target-dir /sqoop/import/test01 \
--fields-terminated-by '\t' \
-m 1
需求4:将tb_tohdfs表中的id>2的数据中id和name两列导入/sqoop/import/test01目录中
方案一
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--columns id,name \
--where 'id > 2' \
--delete-target-dir \
--target-dir /sqoop/import/test01 \
--fields-terminated-by '\t' \
-m 1
方案二
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
-e 'select id,name from tb_tohdfs where id > 2 and $CONDITIONS' \
--delete-target-dir \
--target-dir /sqoop/import/test01 \
--fields-terminated-by '\t' \
-m 1
小结
目标:实现Sqoop导入MySQL数据到Hive表中
路径
实施
准备数据:在Hive 中创建一张表
use default;
create table fromsqoop(
id int,
name string,
age int
);
直接导入
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--hive-import \
--hive-database default \
--hive-table fromsqoop \
--fields-terminated-by '\001' \
-m 1
hcatalog导入
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--hcatalog-database default \
--hcatalog-table fromsqoop \
--fields-terminated-by '\001' \
-m 1
小结
目标:掌握Sqoop如何实现增量导入
路径
实施
增量需求
第一天:产生数据
+----+--------+-----+
| 1 | laoda | 18 |
| 2 | laoer | 19 |
| 3 | laosan | 20 |
| 4 | laosi | 21 |
第二天的0点:采集昨天的数据
sqoop import --connect jdbc:mysql://node3:3306/sqoopTest --username root --password 123456 --table tb_tohdfs --target-dir /sqoop/import/test02 -m 1
+----+--------+-----+
| 1 | laoda | 18 |
| 2 | laoer | 19 |
| 3 | laosan | 20 |
| 4 | laosi | 21 |
第二天:产生新的数据
| 5 | laowu | 22 |
| 6 | laoliu | 23 |
| 7 | laoqi | 24 |
| 8 | laoba | 25 |
+----+--------+-----+
第三天:采集昨天的数据
sqoop import --connect jdbc:mysql://node3:3306/sqoopTest --username root --password 123456 --table tb_tohdfs --target-dir /sqoop/import/test02 -m 1
问题:每次导入都是所有的数据,每次都是全量
Sqoop中的两种增量方式
设计:用于对某一列值进行判断,只要大于上一次的值就会被导入
参数
Incremental import arguments:
--check-column Source column to check for incremental
change
--incremental Define an incremental import of type
'append' or 'lastmodified'
--last-value Last imported value in the incremental
check column
–check-column :按照哪一列进行增量导入
–last-value:用于指定上一次的值
–incremental:增量的方式
append
lastmodified
append
要求:必须有一列自增的值,按照自增的int值进行判断
特点:只能导入新增的数据,无法导入更新的数据
测试
第一次导入
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
--check-column id \
--incremental append \
--last-value 1 \
-m 1
第二次产生新的数据
insert into tb_tohdfs values(null,"laowu",22);
insert into tb_tohdfs values(null,"laoliu",23);
insert into tb_tohdfs values(null,"laoqi",24);
insert into tb_tohdfs values(null,"laoba",25);
第二次导入
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 4 \
-m 1
lastmodifield
要求:必须包含动态时间变化这一列,按照数据变化的时间进行判断
特点:既导入新增的数据也导入更新的数据
测试
MySQL中创建测试数据
CREATE TABLE `tb_lastmode` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`word` varchar(200) NOT NULL,
`lastmode` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into tb_lastmode values(null,'hadoop',null);
insert into tb_lastmode values(null,'spark',null);
insert into tb_lastmode values(null,'hbase',null);
第一次采集
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--incremental lastmodified \
--check-column lastmode \
--last-value '2021-05-06 16:09:32' \
-m 1
数据发生变化
insert into tb_lastmode values(null,'hive',null);
update tb_lastmode set word = 'sqoop' where id = 1;
第二次采集
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--merge-key id \
--incremental lastmodified \
--check-column lastmode \
--last-value '2021-05-07 16:10:38' \
-m 1
特殊方式
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
-e 'select id,name from tb_tohdfs where id > 12 and $CONDITIONS' \
--delete-target-dir \
--target-dir /sqoop/import/test01 \
--fields-terminated-by '\t' \
-m 1
小结
Sqoop中如何实现增量导入?
目标:实现Sqoop全量导出数据到MySQL
路径
实施
准备数据
MySQL中创建测试表
use sqoopTest;
CREATE TABLE `tb_url` (
`id` int(11) NOT NULL,
`url` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Hive中创建表,并加载数据
vim /export/datas/lateral.txt
1 http://facebook.com/path/p1.php?query=1
2 http://www.baidu.com/news/index.jsp?uuid=frank
3 http://www.jd.com/index?source=baidu
use default;
create table tb_url(
id int,
url string
) row format delimited fields terminated by '\t';
load data local inpath '/export/data/lateral.txt' into table tb_url;
全量导出
sqoop export \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
-m 1
小结
目标:实现Sqoop增量导出到MySQL
路径
实施
增量导出场景
Hive中有一张结果表:存储每天分析的结果
--第一天:10号处理9号
id daystr UV PV IP
1 2020-11-09 1000 10000 500
insert into result
select id,daystr,uv,pv ,ip from datatable where daystr=昨天的日期
--第二天:11号处理10号
id daystr UV PV IP
1 2020-11-09 1000 10000 500
2 2020-11-10 2000 20000 1000
MySQL:存储每一天的结果
1 2020-11-09 1000 10000 500
增量导出方式
updateonly
修改lateral.txt数据
1 http://www.itcast.com/path/p1.php?query=1
2 http://www.baidu.com/news/index.jsp?uuid=frank
3 http://www.jd.com/index?source=baidu
4 http://www.heima.com
重新加载覆盖
load data local inpath '/export/data/lateral.txt' overwrite into table tb_url;
增量导出
sqoop export \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
--update-key id \
--update-mode updateonly \
-m 1
allowerinsert
修改lateral.txt
1 http://bigdata.itcast.com/path/p1.php?query=1
2 http://www.baidu.com/news/index.jsp?uuid=frank
3 http://www.jd.com/index?source=baidu
4 http://www.heima.com
覆盖表中数据
load data local inpath '/export/data/lateral.txt' overwrite into table tb_url;
增量导出
sqoop export \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
--update-key id \
--update-mode allowinsert \
-m 1
小结
目标:了解Sqoop Job的功能与应用
路径
实施
增量导入的问题
增量导入每次都要手动修改上次的值执行,怎么解决?
sqoop import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test04 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 4 \
-m 1
Sqoop Job的使用
MySQL插入数据
insert into tb_tohdfs values(null,'laojiu',26);
insert into tb_tohdfs values(null,'laoshi',27);
创建job
sqoop job --create job01 \
-- import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test04 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 8 \
-m 1
列举job
sqoop job --list
查看job的信息
sqoop job --show jobName
运行job
sqoop job --exec jobName
删除job
sqoop job --delete jobName
小结
目标:了解Sqoop密码的问题及脚本的封装
路径
实施
Sqoop中的数据库密码
如何解决手动输入密码和密码明文问题?
方式一:在sqoop的sqoop-site.xml中配置将密码存储在客户端中,比较麻烦,一般不用
方式二:将密码存储在文件中,通过文件的权限来管理密码
sqoop job --create job02 \
-- import \
--connect jdbc:mysql://node3:3306/sqoopTest \
--username root \
--password-file file:///export/data/sqoop.passwd \
--table tb_tohdfs \
--target-dir /sqoop/import/test05 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 4 \
-m 1
–password-file
读取的是HDFS文件,这个文件中只能有一行密码
Sqoop封装脚本
如何封装Sqoop的代码到文件中?
step1:将代码封装到一个文件中
vim /export/data/test.sqoop
import
--connect
jdbc:mysql://node3:3306/sqoopTest
--username
root
--password-file
file:///export/data/sqoop.passwd
--table
tb_tohdfs
--target-dir
/sqoop/import/test05
--fields-terminated-by
'\t'
-m
1
step2:运行这个文件
sqoop --options-file /export/data/test.sqoop
小结