其他工具的实践
一、实验目的
1、掌握Flume的安装、配置和简单使用。
2、掌握Sqoop的安装、配置和简单使用。
二、实验原理
1、Flume
Flume是apache的一个顶级项目,是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力。
本实验实现Avro Source + Memory Channel + Logger Sink的组合。使用apache-flume-1.8.0自带的例子:
使用Avro Source接收外部数据源
Logger作为sink
通过Avro RPC调用,将数据缓存在channel中,然后通过Logger打印出调用发送的数据
2、Sqoop
Sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:
数据的导入、迁入 ,例如:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
数据的导出、迁出:从 Hadoop 的文件系统中导出数据到关系数据库 MySQL
Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
Sqoop和Hive的区别:
Sqoop:本质就是迁移数据, 迁移的方式是把迁移命令转换成MR程序
Hive:本质就是执行计算,依赖于HDFS存储数据,把HiveQL转换成MR程序
三、实验准备
完成实验四,已经搭建好Hive环境
四、实验内容
【实验项目】
项目1:Flume的配置与使用
项目2:Sqoop常用功能的使用(HBase相关操作选做)
【注】这个实验没有坑;期末不留思考题,等下一届再看情况
【未来】考虑加入ZooKeeper相关实验,目前条件不够
以上两点别傻乎乎抄在实验报告中,谢谢
项目一:Flume的配置与使用
【大致步骤】
【参考链接】( 梁老师博客)
【具体操作】
(一)、flume的安装与配置
1、下载flume安装文件,(下载地址)
下载版本:apache-flume-1.8.0-bin.tar.gz
将下载的文件上传到Linux的/usr/local/Flume目录下
2、解压
tar -zxvf apache-flume-1.8.0-bin.tar.gz
3、 建立软链接
ln -s apache-flume-1.8.0-bin flume
4、设置系统环境变量
nano /etc/profile
文件末尾添加如下内容:
export FLUME_HOME=/usr/local/Flume/flume
export PATH=$FLUME_HOME/bin:$PATH
让环境变量生效:
source /etc/profile
5.编写配置文件:
cd $FLUME_HOME/conf
nano flume.conf
输入以下内容:
#指定Agent的组件名称
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#指定Flume source(监听的路径为/home/parallels/testFlume,hadoop为用户名,注意修改)
a1.sources.r1.type = spoolDir
a1.sources.r1.spoolDir = /home/parallels/testFlume
#指定Flume sink
a1.sinks.k1.type = logger
#指定Flume channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#绑定source和sink到channel上
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
6、创建监听目录:
mkdir /home/parallels/testFlume
注意:以上路径中的parallels为用户名,注意修改。
7、启动Flume Agent:
flume-ng agent --conf ./ --conf-file flume.conf --name a1 -Dflume.root.logger=INFO,console
8、测试
打开另外一个终端作为测试终端(重要)!!!往监听目录(/home/parallels/testFlume)的test.log文件写一些内容:
echo "hello flume!" >> /home/parallels/testFlume/test.log
(二)、flume的配置和使用
1、进入有权限的目录,例如~目录
cd ~
2、创建配置文件avro.conf(关键)
nano avro.conf
内容如下:
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#配置source
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4141
# 配置sink
a1.sinks.k1.type = logger
# 配置channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 绑定 source 和sink 到 channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3、启动Flume agent:
flume-ng agent --conf ./ --conf-file avro.conf --name a1 -Dflume.root.logger=INFO,console
注意: --conf为配置文件所在目录,这里配置为"./"表示当前目录; --conf-file表示配置文件名称; --name表示 flume代理名称,其他的为日志级别
4、测试
4.1 打开新的终端(重要)
4.2 新建一个文件夹testFlume(如果已存在该文件夹,请跳过mkdir testFlume命令)
cd ~
mkdir testFlume
4.3 向文件log.00输入一些信息,例如:“hello world”
echo "hello world" > ~/testFlume/log.00
5、使用avro-client发送文件
flume-ng avro-client -c ./ -H 0.0.0.0 -p 4141 -F testFlume/log.00
注意:-c为conf所在目录,-H为主机, -p为端口号 -F为要发送文件所在的路径
在监听终端(启动Flume agent命令的终端)看到log.00的内容“hello world”。
更多的案例:
- netcat source --> memory channel --> logger sink
nc.conf
添加内容:
# 设置agent
b1.sources = r1
b1.sinks = k1
b1.channels = c1
# 配置source
b1.sources.r1.type = netcat
b1.sources.r1.bind = localhost
b1.sources.r1.port = 44444
# 配置sink
b1.sinks.k1.type = logger
# 配置channel
b1.channels.c1.type = memory
b1.channels.c1.capacity = 1000
b1.channels.c1.transactionCapacity = 100
#将source和sink绑定到channel
b1.sources.r1.channels = c1
b1.sinks.k1.channel = c1
启动flume:
$ flume-ng agent --conf ./ --conf-file nc.conf --name b1 -Dflume.root.logger=INFO,console
启动另一个终端,执行如下命令:
telnet localhost 44444
进入监听状态后,输入一些数据,按回车发送数据,在flume终端查看接收到的数据。
- exec source --> memory channel --> HDFS sink
exec source表示用执行命令的输出作为数据源,案例中执行的命令为 tail -F /home/hadoop/1.log
HDFS sink表示将数据发送到HDFS中
hdfs.conf
添加内容:
# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /home/hadoop/1.log
a2.sources.r2.shell = /bin/bash -c
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://node1:8020/flume/%Y%m%d/%H%M/%S
#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-
#是否按照时间滚动文件夹
a2.sinks.k2.hdfs.round = true
#多少时间单位创建一个新的文件夹
a2.sinks.k2.hdfs.roundValue = 1
#重新定义时间单位
a2.sinks.k2.hdfs.roundUnit = minute
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a2.sinks.k2.hdfs.batchSize = 3
#设置文件类型,可支持压缩
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件
a2.sinks.k2.hdfs.rollInterval = 600
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与 Event 数量无关
a2.sinks.k2.hdfs.rollCount = 0
#最小冗余数
a2.sinks.k2.hdfs.minBlockReplicas = 1
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
启动HDFS:
start-dfs.sh
启动flume
$ flume-ng agent --conf ./ --conf-file hdfs.conf --name a2 -Dflume.root.logger=INFO,console
另外启动一个终端,发送些数据到1.log
echo "something different 44" >> 1.log
echo "something different 55" >> 1.log
查看hdfs的内容,注意cat后面的文件路径需要从flume终端得到。
hdfs dfs -cat /flume/20201116/2326/00/logs-.1605540379735.tmp
看到了每一分钟会生成一个数据目录,文件名的前缀为logs- 加上毫秒的时间戳(13位).tmp,文件内容为刚才一分钟内给1.log发送的数据。
项目二:Sqoop常用功能的使用
实验内容【大致步骤】
【参考链接】( 梁老师博客)
【具体操作】
- 在MySQL中创建数据库,并准备EMP表和DEPT表
- MySQL与HDFS数据互导,并查看数据迁移结果
- MySQL与Hive数据互导,并查看数据迁移结果
(一)Sqoop的安装
下载安装包sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 下载地址
1、将安装包上传到Linux系统的/usr/local/Sqoop目录下
2、解压:
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
3、建立软链接
ln -s sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
4、 配置Linux系统环境变量
nano /etc/profile
文件末尾添加以下内容:
export SQOOP_HOME=/usr/local/Sqoop/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
让配置生效:
source /etc/profile
5、配置MySQL连接器
下载MySQL连接器:
下载版本:mysql-connector-java-5.1.46.jar
下载地址:http://central.maven.org/maven2/mysql/mysql-connector-java/
将MySQL连接器复制到sqoop的lib目录下
cp mysql-connector-java-5.1.46.jar /usr/local/Sqoop/sqoop/lib
6、配置sqoop环境变量
cd $SQOOP_HOME/conf/
ls
cp sqoop-env-template.sh sqoop-env.sh
nano sqoop-env.sh
修改以下内容:
export HADOOP_COMMON_HOME=/usr/local/hadoop/hadoop-2.7.3
export HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-2.7.3
注意:
1.“=”号右侧的值为$HADOOP_HOME目录,注意按实际修改。
2.要去掉以上两行export前面的#号
7、测试安装是否成功
sqoop help
(二)HBase的安装
1、下载hbase(下载地址)https://archive.apache.org/dist/hbase/
下载文件:hbase-1.3.1-bin.tar.gz
下载完成后,将 hbase-1.3.1-bin.tar.gz 文件通过fileZilla等工具上传到Ubuntu20.04.2中的/usr/local/HBase目录下(如没有该目录,需要自己创建出来,也可以自定义安装目录)
2、解压hbase
进入/usr/local/HBase目录下,执行解压命令
cd /usr/local/HBase
tar -zxvf hbase-1.3.1-bin.tar.gz
新建软链接,方便使用
ln -s hbase-1.3.1 hbase
3、配置系统环境变量
nano /etc/profile
在文件末尾添加
export HBASE_HOME=/usr/local/HBase/hbase
export PATH=$PATH:$HBASE_HOME/bin
注意:HBASE_HOME的路径请根据实际情况修改。
让环境变量立即生效
source /etc/profile
验证
hbase version
4、配置hbase-env.sh
进入hbase的配置目录
cd $HBASE_HOME/conf
编辑hbase-env.sh
nano hbase-env.sh
找到并 修改JAVA_HOME的值 及 配置使用hbase自带的ZooKeeper,如下:
export JAVA_HOME=/usr/local/java/jdk1.8.0_341/bin/java
export HBASE_MANAGES_ZK=true
注意:1.需要去掉export前面的#号; 2.JAVA_HOME的值注意根据实际情况修改。
5、配置hbase-site.xml
nano hbase-site.xml
在之间添加如下内容:
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
注意:hbase.rootdir和hbase.zookeeper.quorum属性值中的hadoop为Ubuntu的主机名,请注意根据实际情况修改。
6、配置regionservers
nano regionservers
删除原有内容改为Ubuntu的主机名,例如:
node1
7、启动hbase
先启动hadoop
start-all.sh
再启动hbase
start-hbase.sh
验证
查看jps进程
正常情况下,能看到hadoop的5个进程以及hbase的3个进程(HMaster、HRegionServer、HQuorumPeer)
9、浏览器访问
ip:16010
注意:ip为Ubuntu的ip
(三)sqoop常用功能的使用
题目:
一.MySQL与HDFS数据互导(相互导入导出)
二.MySQL与Hive数据互导
三.MySQL与HBase数据互导
数据准备
进入mysql创建一个名为ua1的数据库
create database ua1;
进入ua1数据库
use ua1
准备mysql数据:
创建EMP表
CREATE TABLE IF NOT EXISTS `EMP`(
`empno` INT,
`ename` VARCHAR(10),
`job` VARCHAR(9),
`mgr` int,
`hiredate` date,
`sal` int,
`comm` int,
`deptno` int,
PRIMARY KEY ( `empno` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据到EMP表:
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20', 1600, 300, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-2-22', 1250, 500, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-4-2', 2975, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28', 1250, 1400, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1', 2850, NULL, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-6-9', 2450, NULL, 10);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-4-19', 3000, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-9-8', 1500, NULL, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-5-23', 1100, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-3', 950, NULL, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-3', 3000, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-1-23', 1300, NULL, 10);
创建DEPT表:
CREATE TABLE IF NOT EXISTS `DEPT`(
`deptno` INT,
`dname` VARCHAR(14),
`loc` VARCHAR(13)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据到DEPT表:
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (40, 'OPERATIONS', 'BOSTON');
查看EMP表:
select * from EMP;
查看DEPT表:
select * from DEPT;
一.MySQL与HDFS数据互导(相互导入导出)
1、MySQL —导入到–> HDFS
sqoop import --connect jdbc:mysql://192.168.60.133/ua1 --username root --password asdfghjkl --table EMP --target-dir /user/parallels/zhangsan --m 1
注意:
192.168.60.133为mysql登录的IP, 注意修改!
/user/parallels/zhangsan 其中parallels为用户名,注意修改,zhangsan为目录名,可自定义。
asdfghjkl 是登录mysql的密码
回车执行后不需要输入mysql数据库密码
打开新的终端,查看HDFS数据
hdfs dfs -ls /user/parallels/zhangsan
parallels为用户名,注意按实际修改
hdfs dfs -cat /user/parallels/zhangsan/part-m-00000
2、HDFS—导出到–> MySQL
在MySQL新建一张表:EMP_HDFS_zhangsan
create table EMP_HDFS_zhangsan like EMP;
执行导出语句
sqoop export --connect jdbc:mysql://192.168.60.133:3306/ua1 --table EMP_HDFS_zhangsan --export-dir /user/parallels/zhangsan/part-m-00000 --username root -P --num-mappers 1
注意:
192.168.60.133为mysql登录的IP, 注意修改!
/user/parallels/zhangsan 其中parallels为用户名,zhangsan为原来导入到HDFS的目录,注意修改。
root 是登录mysql的用户名
回车执行后需要输入mysql数据库密码
mysql中查看数据是否导入成功
mysql> select * from EMP_HDFS_zhangsan;
二.MySQL与Hive数据互导
1、MySQL—导入到–>Hive
执行导入到Hive命令
sqoop import --connect jdbc:mysql://192.168.60.133:3306/ua1 --username root --password asdfghjkl --table EMP --fields-terminated-by '\t' --num-mappers 1 --hive-database default --hive-import --hive-table hive_zhangsan
注意:
192.168.60.133 为mysql的IP
ua1为mysql的数据库名
hive_zhangsan为导入到Hive的表名,为了不冲突,建议取带有学号的表名,例如:hive_zhangsan001 ,Hive的表名对大小写不敏感
如果报错清楚HDFS中已经存在的输出目录
hadoop fs -rm -r /user/parallels/EMP
进入hive环境
hive
use default;
查看hive的表
show tables;
查看hive_zhangsan表内容:
select * from hive_zhangsan;
2、Hive—导出到–> MySQL
在mysql新建一张EMP_from_hive001表,用于接收数据
create table EMP_from_hive001 like EMP;
查看hive表存储路径
show create table hive_zhangsan;
hive_zhangsan为hibe表名,注意修改。
复制出hive表存储路径:
/user/hive/warehouse/hive_zhangsan
执行导出语句:
sqoop export --connect jdbc:mysql://192.168.60.133:3306/ua1 --username root -P --table EMP_from_hive001 --export-dir /user/hive/warehouse/hive_zhangsan/part-m-00000 --input-fields-terminated-by '\t'
查看MySQL表内容:
三.MySQL与HBase数据互导
1、MySQL —导入到–> HBase
进入hbase shell环境
hbase shell
启动Hadoop集群
start-all.sh
启动Hbase
start-hbase.sh
在hbase中创建一个空表
create 'EMP_HBASE', { NAME => 'EMPINFO', VERSIONS => 5 }
查看表
执行导入语句
sqoop import --connect jdbc:mysql://192.168.60.133:3306/ua1 --username root --password asdfghjkl --table EMP --hbase-table EMP_HBASE --column-family EMPINFO --hbase-row-key empno
查看EMP_HBASE表内容:
scan 'EMP_HBASE'
2、HBase—导出到–> MySQL
目前没有命令可以直接将 hbase 中的数据导出到 mysql。解决思路hbase–>HDFS–>mysql或hbase–>hive–>mysql。
五、实验心得
1、项目一中运行flume-ng agent --conf ./ --conf-file flume.conf --name a1 -Dflume.root.logger=INFO,console
时报错或者一直运行不完
原因:flume.conf 配置有误,用户名未更改
解决方法:正确配置flume.conf 文件
2、项目二中运行sqoop import --connect jdbc:mysql://192.168.60.133:3306/ua1 --username root -P --table EMP -target-dir /user/parallels/zhangsan -m 1
时报错
各个参数细节没注意!!!