掌握Flume的安装、配置和简单使用。掌握Sqoop的安装、配置和简单使用。

1.实验目的

(1).掌握Flume的安装、配置和简单使用。

(2).掌握Sqoop的安装、配置和简单使用。

2.实验原理

(1).两个工具在大数据一般处理流程中的岗位和作用

在这里插入图片描述

(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程序

3.实验准备

(1).完成实验四,已经搭建好Hive环境

4.实验内容

项目1:Flume的配置与使用

【参考链接】https://blog.csdn.net/qq_42881421/article/details/84782509(梁老师博客

前提条件:

安装好hadoop2.7.3(Linux系统下)

安装好Flume,参考:Flume安装配置

原理:

Flume数据流模型:
Flume数据流模型

题目:

完成通过Avro Source接收外部数据源,数据缓存在memory channel中,然后通过Logger sink将打印出数据,即:avro source --> memory channel --> logger sink

步骤:

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

这是一个Apache Flume的配置文件,用于将数据从源(source)传输到接收器(sink)。以下是对这个配置文件的详细解释:
a1.sources = r1:定义了一个名为a1的agent,其中包含一个名为r1的source。
a1.sinks = k1:定义了一个名为a1的agent,其中包含一个名为k1的sink。
a1.channels = c1:定义了一个名为a1的agent,其中包含一个名为c1的channel。
接下来是各个部分的详细配置:
a1.sources.r1.type = avro:定义了名为r1的source类型为avro,即从Avro协议接收数据。
a1.sources.r1.bind = 0.0.0.0:指定r1 source绑定的IP地址为0.0.0.0,表示在所有可用的网络接口上监听数据。
a1.sources.r1.port = 4141:指定r1 source监听的端口号为4141,表示等待从该端口接收数据。
a1.sinks.k1.type = logger:定义了名为k1的sink类型为logger,即将数据输出到日志中。
a1.channels.c1.type = memory:定义了名为c1的channel类型为memory,即将数据存储在内存中。
a1.channels.c1.capacity = 1000:指定了channel c1的最大容量为1000,表示最多可以存储1000个事件。
a1.channels.c1.transactionCapacity = 100:指定了channel c1的最大事务容量为100,表示每次可以处理100个事件。
a1.sources.r1.channels = c1:将source r1绑定到channel c1,表示从r1接收的数据将存储在c1中。
a1.sinks.k1.channel = c1:将sink k1绑定到channel c1,表示从c1中读取数据并将其输出到日志中。
这个配置文件的作用是将从Avro协议接收的数据从r1 source传输到c1 channel,然后从c1 channel读取数据并将其输出到日志中。在这个配置文件中,source、sink和channel是Flume的三个主要组件,它们协同工作来实现数据的传输和处理。其中,source负责接收数据,sink负责将数据输出到目标位置,而channel则缓存数据并协调source和sink之间的数据传输。

3.启动Flume agent

flume-ng agent --conf ./ --conf-file avro.conf --name a1 -Dflume.root.logger=INFO,console

注意: --conf为配置文件所在目录,这里配置为"./"表示当前目录; --conf-file表示配置文件名称; --name表示 flume代理名称,其他的为日志级别

这是一个启动Apache Flume的命令行,以下是对每个参数的详细解释:
flume-ng:启动Flume的命令。
agent:指定启动的Flume组件为agent。
–conf ./:指定Flume的配置文件在当前目录下,即"./“。
–conf-file avro.conf:指定Flume使用的配置文件为"avro.conf”。
–name a1:指定Flume agent的名称为"a1"。
-Dflume.root.logger=INFO,console:设置Flume的日志级别为INFO,并将日志输出到控制台。
这个命令的作用是启动一个名为"a1"的Flume agent,使用当前目录下的"avro.conf"配置文件,并将日志输出到控制台。Flume agent会根据配置文件中定义的source、sink和channel组件来接收、处理和输出数据。在启动之后,Flume agent将开始监听配置文件中指定的端口,等待从Avro协议接收数据,然后将数据传输到配置文件中指定的sink中。同时,Flume agent会将运行日志输出到控制台,供用户进行监控和调试。

启动成功:
在这里插入图片描述
4.测试
4.1 打开新的终端(重要)
4.2 新建一个文件夹testFlume(如果已存在该文件夹,请跳过mkdir testFlume命令)

$ cd ~
$ mkdir testFlume

如图,创建成功!
在这里插入图片描述
4.3 向文件log.00输入一些信息,例如:“hello world”

echo "hello world" > ~/testFlume/log.00

查看log.00里的内容是否写入成功
查看log.00里的内容是否写入成功。
5.使用avro-client发送文件

flume-ng  avro-client  -c ./  -H  0.0.0.0  -p 4141 -F  testFlume/log.00

flume-ng:这是 Flume 代理命令行工具的名称。
avro-client:这指定数据将使用 Avro 协议发送到 Flume 代理。
-c ./:这表示 Flume 配置文件位于当前目录中。
-H 0.0.0.0:这指定 Flume 代理接收方的主机名或 IP 地址。在这种情况下,0.0.0.0 表示代理将在所有可用的网络接口上监听。
-p 4141:这指定 Flume 代理接收器将侦听的端口号。
-F testFlume/log.00:这指定将由 Flume 代理摄取的数据文件路径。在这种情况下,文件位于 testFlume 目录中,名称为 log.00。
总的来说,这个命令用于将数据从文件(log.00)发送到一个 Flume 代理,使用 Avro 协议,其中 Flume 代理接收器在端口 4141 上侦听,并从任何可用的网络接口接受连接。

在这里插入图片描述
在监听终端(启动Flume agent命令的终端)看到log.00的内容“hello world”。
在这里插入图片描述

更多的案例:

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

查看是否编写成功:

在这里插入图片描述

b1.sources = r1:定义 agent b1 的 source 名称为 r1。
b1.sinks = k1:定义 agent b1 的 sink 名称为 k1。
b1.channels = c1:定义 agent b1 的 channel 名称为 c1。
b1.sources.r1.type = netcat:指定 source r1 的类型为 netcat,表示从网络 socket 读取数据。
b1.sources.r1.bind = localhost:指定 source r1 绑定的网络接口为 localhost。
b1.sources.r1.port = 44444:指定 source r1 监听的端口号为 44444。
b1.sinks.k1.type = logger:指定 sink k1 的类型为 logger,表示将数据写入日志。
b1.channels.c1.type = memory:指定 channel c1 的类型为 memory,表示将数据存储在内存中。
b1.channels.c1.capacity = 1000:指定 channel c1 的容量为 1000,表示 channel 最多可以存储 1000 条数据。
b1.channels.c1.transactionCapacity = 100:指定 channel c1 的事务容量为 100,表示每个事务最多可以处理 100 条数据。
b1.sources.r1.channels = c1:将 source r1 绑定到 channel c1,表示从 source r1 获取的数据将会存储在 channel c1 中。
b1.sinks.k1.channel = c1:将 sink k1 绑定到 channel c1,表示从 channel c1 获取的数据将会写入 sink k1 中。
这个配置文件的作用是从本地的 localhost:44444 端口读取数据,并将数据写入日志中。由于 channel 的类型为 memory,因此数据将存储在内存中。

启动flume

$ flume-ng agent --conf ./ --conf-file nc.conf --name b1 -Dflume.root.logger=INFO,console

在这里插入图片描述
启动另一个终端,执行如下命令

$ telnet localhost 44444

在这里插入图片描述
在启动flume中的终端查看:
在这里插入图片描述2. exec source --> memory channel --> HDFS sink

编写hdfs.conf

nano 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

a2.sources = r2:定义 agent a2 的 source 名称为 r2。
a2.sinks = k2:定义 agent a2 的 sink 名称为 k2。
a2.channels = c2:定义 agent a2 的 channel 名称为 c2。
a2.sources.r2.type = exec:指定 source r2 的类型为 exec,表示执行一个命令来读取数据。
a2.sources.r2.command = tail -F /home/hadoop/1.log:指定 source r2 执行的命令为 tail -F /home/hadoop/1.log,表示监听并读取 /home/hadoop/1.log 文件的内容。
a2.sources.r2.shell = /bin/bash -c:指定 source r2 执行命令的 shell 环境。
a2.sinks.k2.type = hdfs:指定 sink k2 的类型为 hdfs,表示将数据写入到 HDFS 中。
a2.sinks.k2.hdfs.path = hdfs://node1:8020/flume/%Y%m%d/%H%M/%S:指定 HDFS 的路径,其中 %Y%m%d/%H%M/%S 表示按照年月日/小时分钟/秒的形式创建文件夹。
a2.sinks.k2.hdfs.filePrefix = logs-:指定上传文件的前缀为 logs-。
a2.sinks.k2.hdfs.round = true:指定是否按照时间滚动文件夹。
a2.sinks.k2.hdfs.roundValue = 1:指定多少时间单位(由 a2.sinks.k2.hdfs.roundUnit 指定)创建一个新的文件夹。
a2.sinks.k2.hdfs.roundUnit = minute:重新定义时间单位为分钟。
a2.sinks.k2.hdfs.useLocalTimeStamp = true:指定是否使用本地时间戳。
a2.sinks.k2.hdfs.batchSize = 3:指定积攒多少个 Event 才 flush 到 HDFS 一次。
a2.sinks.k2.hdfs.fileType = DataStream:指定上传文件的类型为 DataStream,可支持压缩。
a2.sinks.k2.hdfs.rollInterval = 600:指定多久生成一个新的文件,单位是秒。
a2.sinks.k2.hdfs.rollSize = 134217700:指定每个文件的滚动大小,单位是字节。
a2.sinks.k2.hdfs.rollCount = 0:指定文件的滚动与 Event 数量无关。
a2.sinks.k2.hdfs.minBlockReplicas = 1:指定最小冗余数为 1。
a2.channels.c2.type = memory:指定 channel c2 的类型为 memory,表示将数据存储在内存中。
a2.channels.c2.capacity = 1000:指定 channel c2 的容量为 1000,表示 channel 最多可以存储 1000 条数据。
a2.channels.c2.transactionCapacity = 100:指定 channel c2 的事务容量为 100,表示每个事务最多可以处理 100 条数据。
a2.sources.r2.channels = c2:将 source r2 绑定到 channel c2,表示从 source r2 获取的数据将会存储在 channel c2 中。
a2.sinks.k2.channel = c2:将 sink k2 绑定到 channel c2,表示从 channel c2 获取的数据将会写入 sink k2 中。
通过这个配置文件,Flume agent a2 会实时监听 /home/hadoop/1.log 文件的变化,并将数据通过 channel c2 存储在内存中。当 channel 中积攒的 Event 数量达到 a2.sinks.k2.hdfs.batchSize(本例中为 3)时,Flume 会将这些数据一次性写入到 HDFS 中,并按照配置的方式创建文件夹和文件。同时,Flume 会定期生成新的文件或按照文件大小进行滚动,以避免单个文件过大导致性能下降或存储空间不足。在这个过程中,Flume 还可以通过配置多个 channel 和 sink 实现数据的分流和多副本备份,以提高数据可靠性和处理能力。

启动HDSF:

start-all.sh

在这里插入图片描述
启动flume

$ flume-ng agent --conf ./ --conf-file hdfs.conf --name a2 -Dflume.root.logger=INFO,console

看到这张图片说明启动成功!
在这里插入图片描述

另外启动一个终端,发送些数据到1.log

echo "I like you 111" >> 1.log
echo "I like you 222" >> 1.log

在启动flume的那个终端去查看hdfs的路径:
在这里插入图片描述
查看hdfs的内容,注意cat后面的文件路径需要从flume终端得到。

hdfs dfs -cat /flume/20230608/1735/00/logs-.1686216942335.tmp

注意:cat后面的路径是上面我查看的路径。

查看成功:
在这里插入图片描述

项目2:Sqoop常用功能的使用

【参考链接】https://blog.csdn.net/qq_42881421/article/details/84783600(梁老师博客

前提条件:

安装好hadoop2.7.3(Linux系统下)
安装好sqoop(Linux系统下),参考:Sqoop安装配置
安装好MySQL(Windows系统下或者Linux系统下)
安装好Hive(Linux系统下)参考:Hive安装配置

题目:

一.MySQL与HDFS数据互导(相互导入导出)
二.MySQL与Hive数据互导**

实验步骤:

数据准备

win + x 打开windows powerShell(管理员)输入命令进入mysql

mysql -uroot -p

进入mysql创建一个名为ua1的数据库****

mysql> create database ua1;

使用ua1数据库

mysql> use ua1;

在这里插入图片描述
准备mysql数据:EMP表和DEPT表

-- 创建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表和DEPT表

mysql> select * from EMP;

在这里插入图片描述

mysql> select * from DEPT;

在这里插入图片描述

一.MySQL与HDFS数据互导

  1. MySQL —导入到–> HDFS
sqoop import --connect jdbc:mysql://192.168.17.1:3306/ua1 --username root -P --table EMP  -target-dir  /user/root/zhangsan -m 1

注意:

192.168.17.1为登录的IP, 注意修改!

/user/root/zhangsan 其中root为用户名,注意修改,zhangsan为目录名,可自定义。

回车执行后需要输入mysql数据库密码

输入上面的命令后回启动一个mapreduce程序用来导入数据。
在这里插入图片描述

打开新的终端,查看HDFS数据

$ hdfs dfs -ls /user/root/zhangsan

在这里插入图片描述
查看内容:
在这里插入图片描述

2. HDFS—导出到–> MySQL

在MySQL新建一张表:EMP_HDFS_zhangsan

create table EMP_HDFS_zhangsan like EMP;

查看表是否创建成功:
在这里插入图片描述
执行导出语句

sqoop export --connect jdbc:mysql://192.168.17.1:3306/ua1 --table EMP_HDFS_zhangsan --export-dir /user/root/zhangsan/part-m-00000  --username root  -P  -m 1

注意:

192.168.17.1为登录的IP, 注意修改!
在这里插入图片描述

/user/root/zhangsan 其中root为用户名,zhangsan为原来导入到HDFS的目录,注意修改。

–username root 这个是指定用户名要改。

回车执行后需要输入mysql数据库密码

mysql中查看数据是否导入成功:

mysql> select * from EMP_HDFS_zhangsan;

在这里插入图片描述

二.MySQL与Hive数据互导

  1. MySQL—导入到–>Hive

执行导入到Hive命令

$ sqoop import --connect jdbc:mysql://192.168.17.1:3306/ua1  --username root --password 123 --table EMP --fields-terminated-by '\t' --num-mappers 1  --hive-database default --hive-import --hive-table hive_zhangsan

sqoop import:这是用于将关系型数据库中的数据导入到Hadoop中的Sqoop命令。
–connect:此选项指定要从中导入数据的数据库的URL,本例中为位于jdbc:mysql://192.168.17.1:3306/ua1的MySQL数据库。
–username:此选项指定连接到MySQL数据库的用户名,在本例中为root。
–password:此选项指定连接到MySQL数据库的密码,在本例中为123。
–table:此选项指定要导入的MySQL数据库表的名称,在本例中为EMP。
–fields-terminated-by:此选项指定MySQL数据库表中使用的字段分隔符,本例中为制表符\t。
–num-mappers:此选项指定用于导入数据的并行任务数,在本例中为1。
–hive-database:此选项指定要将数据导入到的Hive数据库的名称,在本例中为default。
–hive-import:此选项告诉Sqoop将数据导入到Hive中。
–hive-table:此选项指定要将数据导入到其中的Hive表的名称,在本例中为hive_zhangsan。

在这里插入图片描述

注意:

ua1为mysql的数据库名

hive_zhangsan为导入到Hive的表名,为了不冲突,建议取带有学号的表名,例如:hive_zhangsan001 ,Hive的表名对大小写不敏感。

若出现如下报错:

ERROR hive.HiveConfig: Could not load
org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set
correctly.

解决办法:点这里解决sqoop报错问题

启动hive:

$ hive

在这里插入图片描述
查看hive_zhangsan表:

hive> show tables;

在这里插入图片描述
查看hive_zhangsan表内容:

select * from hive_zhangsan;

在这里插入图片描述
2. Hive—导出到–> MySQL

在mysql新建一张EMP_from_hive001表,用于接收数据

mysql> create table EMP_from_hive001 like EMP;

检查是否创建成功:

mysql> show tables;

在这里插入图片描述
查看hive表存储路径

hive> show create table hive_zhangsan;

hive_zhangsan为hibe表名,注意修改。

在这里插入图片描述
复制出hive表存储路径:

/user/hive/warehouse/hive_zhangsan

执行导出语句:

sqoop export --connect jdbc:mysql://192.168.17.1:3306/ua1 --username root -P --table  EMP_from_hive001 --export-dir /user/hive/warehouse/hive_zhangsan/part-m-00000 --input-fields-terminated-by '\t'

sqoop: Sqoop 命令行工具。
import: Sqoop 命令,用于将关系型数据库中的数据导入到 Hadoop 中。
–connect jdbc:mysql://192.168.17.1:3306/ua1: 指定要连接的 MySQL 数据库的连接 URL,其中 jdbc:mysql:// 是 JDBC 连接 MySQL 数据库的协议,192.168.17.1:3306 是数据库的 IP 地址和端口号,ua1 是要连接的数据库名。
–username root: 指定连接 MySQL 数据库的用户名为 root。
-P: 提示用户输入密码,Sqoop 将会提示用户输入密码。
–table EMP: 指定要导入的表名为 EMP。
-target-dir /user/root/zhangsan: 指定目标目录为 /user/root/zhangsan,即将导入的数据存储到 HDFS 中的 /user/root/zhangsan 目录下。
-m 1: 指定使用一个 map 任务进行导入数据。在本例中,Sqoop 将会启动一个 map 任务,将数据从 MySQL 数据库中读取出来并写入到 HDFS 中的 /user/root/zhangsan 目录下。
总的来说,这个 Sqoop 命令的作用是将 MySQL 数据库中 EMP 表的数据导入到 HDFS 中的 /user/root/zhangsan 目录下,并使用一个 map 任务完成导入操作。

导出成功!
在这里插入图片描述
查看MySQL表内容:

select * from emp_from_hive001;

在这里插入图片描述
完成!

5.实验心得

本次实验就是熟练掌握简单的flume和sqoop这两个工具的使用,先说说flume,Flume是一个用于在大规模数据流中收集,聚合和移动数据的分布式系统。在使用Flume实现exec source --> memory channel --> HDFS sink:时首先要确保Hadoop和Flume已正确安装和配置。然后编写Flume配置文件,定义一个执行源,一个内存通道和一个HDFS汇。然后运行Flume代理,等待数据传输到HDFS中。最后检查HDFS目录中的数据是否与执行源中的数据匹配。再说说sqoop工具,Sqoop是一个用于在Hadoop和关系型数据库之间高效地转移大量数据的工具。在使用Sqoop将MySQL表中的数据导入到Hive表中时候1.确保Hadoop和Hive已正确安装和配置。2.编写Sqoop命令,指定要导入的MySQL表的名称,以及要将数据导入的Hive表的名称。
sqoop命令的大概格式:`

sqoop import --connect jdbc:mysql://localhost:3306/mydatabase --username root --password password --table mytable --hive-import --hive-table myhive

3.运行Sqoop命令,等待数据导入完成。
4.检查Hive表中的数据是否与MySQL表中的数据匹配。

在使用Sqoop工具实现MySQL与HDFS数据互导的时候:
1.确保Hadoop和Sqoop已正确安装和配置。
2.编写Sqoop命令,指定要导入的MySQL表的名称,以及要将数据导入的HDFS目录。
sqoop命令的大概格式:

sqoop import --connect jdbc:mysql://localhost:3306/mydatabase --username root --password password --table mytable --target-dir /myhdfsdir

3.运行Sqoop命令,等待数据导入完成。
4.检查HDFS目录中的数据是否与MySQL表中的数据匹配。
总的来说,使用Sqoop和Flume这两个工具可以很方便地实现在Hadoop和MySQL之间,以及在本地和Hadoop之间进行数据传输和处理。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值