数据采集工具Sqoop、Datax、Flume、Canal

离线采集工具

Sqoop

1. 环境配置

  1. 解压安装包
  2. 配置环境变量(记得source)
  3. 添加MySQL驱动包到sqoop文件夹下的lib
cp mysql-connector-java-5.1.10.jar  /sqoop-install-path/lib
  1. 重命名文件并配置文件
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
  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
  1. 测试
#查看sqoop的版本号
sqoop version
#连接测试MySQL
sqoop list-databases -connect jdbc:mysql://master:3306/ -username root -password 123456

2. Sqoop的使用

我们需要指定文件,使用命令导入文件然后采集数据

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 

Datax

1. 环境搭建

搭建比较简单 解压上传后配置环境变量之后即可 不像Sqoop依赖于hadoop

2.Datax的使用

使用方法 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官方文档


实时采集工具

Flume

1.环境搭建

上传解压配置环境变量

tar -xvf apache-flume-1.6.0-bin.tar.gz

配置环境变量,然后测试

flume-ng version

2. Flume的使用

  1. 监控一个目录,将数据打印出来 文件名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   文件的名称

  1. 监控目录将数据保存到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

  1. 监控一个文件将数据保存到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

  1. 绑定一个端口,实时收集数据,可以监视端口数据 文件名: 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


  1. 绑定 一个端口使用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

  1. 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

Canal

只能实时监控MySQL中的数据

1.环境搭建

修改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

2. Canal使用

简单测试:


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

你可能感兴趣的:(大数据,sqoop,flume,大数据,阿里云)