- 解压安装包
- 配置环境变量(记得source)
- 添加MySQL驱动包到sqoop文件夹下的lib
cp mysql-connector-java-5.1.10.jar /sqoop-install-path/lib
- 重命名文件并配置文件
mv sqoop-env-template.sh sqoop-env.sh
#添加环境变量
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-2.6.0
export HBASE_HOME=/usr/local/soft/hbase-1.4.6(HBASE使用报错)
export HIVE_HOME=/usr/local/soft/hive-1.2.1
- 修改配置…/bin/configure-sqoop (可不做)
#if [ ! -d "${HBASE_HOME}" ]; then
# echo "Error: $HBASE_HOME does not exist!"
# echo 'Please set $HBASE_HOME to the root of your HBase installation.'
# exit 1
- 测试
#查看sqoop的版本号
sqoop version
#连接测试MySQL
sqoop list-databases -connect jdbc:mysql://master:3306/ -username root -password 123456
我们需要指定文件,使用命令导入文件然后采集数据
sqoop --options-file 文件名
将MySQL中的数据写入到hdfs中 文件名:mysqltoHdfs.conf
import
--connect
jdbc:mysql://master:3306/tjf #连结以及数据库名(注意每一行后不要有空格和换行)
--username
root
--password
123456
--table
student
--m
2
--split-by #会以此为基准分割数据集
age
--target-dir
/sqoop/data/student #hdfs中文件位置
--fields-terminated-by
','
将MySQL中数据写入到hive中 文件名:mysqlToHive.conf
import
--connect
jdbc:mysql://master:3306/tjf
--username
root
--password
123456
--table
score
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
--m
2
--split-by
student_id
--hive-import
--target-dir
/data/score
--hive-table
score
hdfs文件写入到MySQL中 文件名: hdfsToMySQLconf
export
--connect
jdbc:mysql://master:3306/tjf?useUnicode=true&characterEncoding=UTF-8
--username
root
--password
123456
-m
1
--columns
id,name,age,gender,clazz
--export-dir
/sqoop/data/student/
--fields-terminated-by
','
--table
student
增量数据
当离线处理完数据时,发现数据更改对于数据的再一次获取或者更换
以学生表为例,创建带有时间戳的数据
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` char(5) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`gender` char(2) DEFAULT NULL,
`clazz` char(4) DEFAULT NULL,
`last_mod` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1500101002 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1500100001', '施笑槐', '22', '女', '文科六班', '2019-03-16 14:47:59');
INSERT INTO `student` VALUES ('1500100002', '吕金鹏', '24', '男', '文科六班', '2019-03-16 14:47:59');
INSERT INTO `student` VALUES ('1500100003', '单乐蕊', '22', '女', '理科六班', '2019-03-16 14:47:59');
#指定字段的取值范围,增量导数据
#适用于表不断的有新数据插入
sqoop import \
--connect jdbc:mysql://master:3306/tjf?characterEncoding=UTF-8 \
--username root \
--driver com.mysql.jdbc.Driver \
--password 123456 \
--table student \
--target-dir /sqoop/data/student \
--split-by id \
--m 2 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 1500100500
#追加 根据业务可能需要去重
sqoop import \
--connect jdbc:mysql://master:3306/tjf?characterEncoding=UTF-8 \
--username root \
--driver com.mysql.jdbc.Driver \
--password 123456 \
--target-dir /sqoop/data/student \
--table student \
--fields-terminated-by '\t' \
--check-column last_mod \
--incremental lastmodified \
--last-value "2012-11-13 19:19:39" \ #向hdfs中导入在这个时间之后的MySQL数据
--m 1 \
--append
# 更新数据 ,并且合并形成最终的结果
sqoop import \
--connect jdbc:mysql://master:3306/tjf?characterEncoding=UTF-8 \
--username root \
--driver com.mysql.jdbc.Driver \
--password 123456 \
--target-dir /sqoop/data/student \
--table student \
--fields-terminated-by '\t' \
--check-column last_mod \
--incremental lastmodified \
--last-value "2020-11-13 19:35:58" \
--m 1 \
--merge-key id
搭建比较简单 解压上传后配置环境变量之后即可 不像Sqoop依赖于hadoop
使用方法 datax.py 文件名
hdfs写入到MySQL中 文件名: hdfsToMySQL.json
{
"job": {
"setting": {
"speed": {
"channel": 3
}
},
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/datax/data/student",
"defaultFS": "hdfs://master:9000",
"column": ["*"], //获取所有的数据
"fileType": "text",
"encoding": "UTF-8",
"fieldDelimiter": "\t",
"compress":"gzip"
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": true
}
}
}
]
}
}
MySQL中数据写入到hdfs中 文件名 : mysqlToHdfs.json
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"id",
"name",
"age",
"gender",
"clazz"
],
"splitPk": "id",
"connection": [
{
"table": [
"student"
],
"jdbcUrl": [ "jdbc:mysql://master:3306/tjf"]
}
]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://master:9000",
"fileType": "text",
"path": "/datax/data/student",
"fileName": "1",
"column": [
{
"name": "id",
"type": "STRING"
},
{
"name": "name",
"type": "STRING"
},
{
"name": "age",
"type": "INT"
},
{
"name": "gender",
"type": "STRING"
},
{
"name": "clazz",
"type": "STRING"
}
],
"writeMode": "append",
"fieldDelimiter": "\t",
"compress":"gzip"
}
}
}
]
}
}
更多内容可以在码云上的datax官方文档上学习
datax官方文档
上传解压配置环境变量
tar -xvf apache-flume-1.6.0-bin.tar.gz
配置环境变量,然后测试
flume-ng version
- 监控一个目录,将数据打印出来 文件名spoolingtest.conf
a.sources = r1
a.sinks = k1
a.channels = c1
#指定spooldir的属性
a.sources.r1.type = spooldir
a.sources.r1.spoolDir = /usr/local/soft/data
a.sources.r1.fileHeader = true
a.sources.r1.interceptors = i1
a.sources.r1.interceptors.i1.type = timestamp
#指定sink的类型
a.sinks.k1.type = logger
#指定channel
a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100
#组装
a.sources.r1.channels = c1
a.sinks.k1.channel = c1
启动agent
flume-ng agent -n a -f ./spoolingtest.conf -Dflume.root.logger=DEBUG,console
# -n 是文件中的名称 -f 文件的名称
- 监控目录将数据保存到hdfs 文件名:fileToHdfs.conf
a.sources = r1
a.sinks = k1
a.channels = c1
#指定spooldir的属性
a.sources.r1.type = spooldir
a.sources.r1.spoolDir = /usr/local/soft/data
a.sources.r1.fileHeader = true
a.sources.r1.interceptors = i1
a.sources.r1.interceptors.i1.type = timestamp
#将数据保存到hdfs
a.sinks.k1.type = hdfs
#如果不存在会自动创建
a.sinks.k1.hdfs.path =hdfs://master:9000/flume/data
a.sinks.k1.hdfs.filePrefix = pre-
a.sinks.k1.hdfs.minBlockReplicas= 1
a.sinks.k1.hdfs.fileType = DataStream
#指定channel
a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100
#组装
a.sources.r1.channels = c1
a.sinks.k1.channel = c1
启动agent
flume-ng agent -n a -f ./fileToHdfs.conf -Dflume.root.logger=DEBUG,console
- 监控一个文件将数据保存到hdfs 文件名: HbaseLogToHdfs.conf
a.sources = r1
a.sinks = k1
a.channels = c1
#指定exec的属性
a.sources.r1.type = exec
#指定监控的命令
a.sources.r1.command = tail -F /usr/local/soft/hbase-1.4.6/logs/hbase-root-master-master.log
#指定sink的类型
a.sinks.k1.type = hdfs
#如果不存在会自动创建
a.sinks.k1.hdfs.path = hdfs://master:9000/flume/hbase/master
a.sinks.k1.hdfs.filePrefix = pre-
a.sinks.k1.hdfs.minBlockReplicas= 1
a.sinks.k1.hdfs.fileType = DataStream
#指定channel
a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100
#组装
a.sources.r1.channels = c1
a.sinks.k1.channel = c1
启动agent
flume-ng agent -n a -f ./HbaseLogToHdfs.conf -Dflume.root.logger=DEBUG,console
- 绑定一个端口,实时收集数据,可以监视端口数据 文件名: netcat.conf
a.sources = r1
a.sinks = k1
a.channels = c1
#绑定一个端口
a.sources.r1.type=netcat
a.sources.r1.bind=master
a.sources.r1.port=8888
#指定sink的类型
a.sinks.k1.type = logger
#指定channel
a.channels.c1.type = memory
a.channels.c1.capacity = 1000
a.channels.c1.transactionCapacity = 100
#组装
a.sources.r1.channels = c1
a.sinks.k1.channel = c1
启动agent
flume-ng agent -n a -f ./netcat.conf -Dflume.root.logger=DEBUG,console
从另外一个节点发送数据到master的8888端口
安装telnet
yum install telnet
telnet master 8888
- 绑定 一个端口使用http协议 文件名: http.conf
a.sources = r1
a.sinks = k1
a.channels = c1
# Describe/configure the source
a.sources.r1.type = http
a.sources.r1.bind = master
a.sources.r1.port = 8888
a.sinks.k1.type = hdfs
#指定hdfs地址中的输出⽬录
a.sinks.k1.hdfs.path = hdfs://master:9000/flume/output
a.sinks.k1.hdfs.writeFormat = Text
a.sinks.k1.hdfs.fileType = DataStream
a.sinks.k1.hdfs.rollInterval = 10
a.sinks.k1.hdfs.rollSize = 0
a.sinks.k1.hdfs.rollCount = 0
a.sinks.k1.hdfs.filePrefix = %Y-%m-%d-%H-%M-%S
a.sinks.k1.hdfs.useLocalTimeStamp = true
a.channels.c1.type = file
a.channels.c1.checkpointDir = /usr/flume/checkpoint
a.channels.c1.dataDirs = /usr/flume/data
# Bind the source and sink to the channel
a.sources.r1.channels = c1
a.sinks.k1.channel = c1
启动agent
flume-ng agent -n a -f ./http.conf -Dflume.root.logger=DEBUG,console
发送数据到Flume
curl -X POST -d '[{ "headers" :{"a" : "a1","b" : "b1"},"body" : "hello~http~flume~"}]' http://master:8888
- flume将数据写kafka 文件名: flumeToKafka.conf
agent.sources=s1
agent.channels=c1
agent.sinks=k1
agent.sources.s1.type=exec
#监听文件地址
agent.sources.s1.command=tail -F /usr/flume/log.log
agent.channels.c1.type=memory
agent.channels.c1.capacity=10000
agent.channels.c1.transactionCapacity=100
#设置Kafka接收器
agent.sinks.k1.type=org.apache.flume.sink.kafka.KafkaSink
#设置Kafka的broker地址和端口号
agent.sinks.k1.brokerList=master:9092,node1:9092,node2:9092
#设置Kafka的Topic 如果topic不存在会自动创建一个topic,默认分区为1,副本为1
agent.sinks.k1.topic=flume
#设置序列化方式
agent.sinks.k1.serializer.class=kafka.serializer.StringEncoder
#将三个主件串联起来
agent.sources.s1.channels=c1
agent.sinks.k1.channel=c1
在所有节点启动kafka
kafka-server-start.sh -daemon /usr/local/soft/kafka_2.11-1.0.0/config/server.properties
在kafka中创建topic
kafka-topics.sh --create --zookeeper node1:2181,node2:2181,master:2181 --replication-factor 3 --partitions 3 --topic flume
启动Flume
flume-ng agent -n agent -f ./flumeToKafka.conf -Dflume.root.logger=INFO,console
在其他节点启动kafka控制台的消费者 查看数据
kafka-console-consumer.sh --bootstrap-server master:9092,node1:9092,node2:9092 --from-beginning --topic flume
向flume文件中打入数据
echo "java,spark" >> /usr/flume/log.log
只能实时监控MySQL中的数据
修改my.cnf文件
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
vim /etc/my.cnf
在文件下修改一个配置
[mysqld]
# 打开binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog-format=ROW
# 配置MySQL replaction需要定义,不要和canal的slaveId重复
server_id=1
先重启MySQL,在进入MySQL查看是否进入binlog模式
service mysqld restart
show variables like 'log_bin';
上传Canal解压 配置环境变量
tar -zxvf canal.deployer-1.1.4.tar.gz
修改配置文件conf/example/instance.properties
# mysql 地址
canal.instance.master.address=master:3306
# mysql用户名
canal.instance.dbUsername=root
# mysql密码
canal.instance.dbPassword=123456
# 数据写入kafka 的topic
canal.mq.topic=example
修改配置文件conf/canal.properties
# zk地址
canal.zkServers = master:2181,node1:2181,node2:2181
# 数据保存到kafka
canal.serverMode = kafka
# kafka集群地址
canal.mq.servers = master:9092,node1:9092,node2:9092
启动
cd /usr/local/soft/canal/bin
start.sh
简单测试:
use `test`;
# 创建表
CREATE TABLE `order`
(
id BIGINT UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
order_id VARCHAR(64) COMMENT '订单ID',
amount DECIMAL(10, 2) COMMENT '订单金额',
create_time DATETIME COMMENT '创建时间',
UNIQUE uniq_order_id (`order_id`)
) COMMENT '订单表';
# 插入数据
INSERT INTO `order`(order_id, amount) VALUES ('10086', 999);
UPDATE `order` SET amount = 10087 WHERE order_id = '10086';
DELETE FROM `order` WHERE order_id = '10086';
可以利用Kafka的kafka-console-consumer或者Kafka Tools查看test这个topic的数据:
kafka-console-consumer.sh --bootstrap-server master:9092,node1:9092,node2:9092 --from-beginning --topic example