Hadoop实验五 其他工具实践

一、实验目的

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”。
在这里插入图片描述

更多的案例:
  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

启动flume:

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

启动另一个终端,执行如下命令:

telnet localhost 44444

进入监听状态后,输入一些数据,按回车发送数据,在flume终端查看接收到的数据。
在这里插入图片描述

  1. 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常用功能的使用

实验内容【大致步骤】
【参考链接】( 梁老师博客
【具体操作】

  1. 在MySQL中创建数据库,并准备EMP表和DEPT表
  2. MySQL与HDFS数据互导,并查看数据迁移结果
  3. 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的表名对大小写不敏感

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

如果报错清楚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时报错
各个参数细节没注意!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值