Sqoop安装和数据的导入导出

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41455420/article/details/79842000

Sqoop安装和数据的导入导出

1、Sqoop概述

Sqoop 是Hadoop 和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如:MySQL,Oracle 到 Hadoop 的 HDFS,并从 Hadoop 的文件系统导出数据到关系数据库。由 Apache 软件基金会提供。

Sqoop:“SQL 到 Hadoop 和 Hadoop 到 SQL”。

这里写图片描述

Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。
在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。

2、Sqoop安装

安装 sqoop 的前提是已经具备 java 和 hadoop 的环境。

修改配置文件:

cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
export HADOOP_COMMON_HOME=/root/apps/hadoop/
export HADOOP_MAPRED_HOME=/root/apps/hadoop/
export HIVE_HOME=/root/apps/hive
export Hbase_HOME=/root/apps/hbase
加入 mysql 的 jdbc 驱动包
cp /hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/

验证启动

bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --
username root --password hadoop

本命令会列出所有 mysql 的数据库。到这里,整个 Sqoop 安装工作完成。

3、Sqoop导入

“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)。
下面的语法用于将数据导入 HDFS。

$ sqoop import (generic-args) (import-args)

Sqoop 测试表数据在 mysql 中创建数据库 sqoop,然后创建两张表: emp、emp_add 。

创建emp表和emp_add表并导入数据:

DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `deg` varchar(100) DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  `dept` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('1201', 'gopal', 'manager', '50000', 'TP');
INSERT INTO `emp` VALUES ('1202', 'manisha', 'Proof reader', '50000', 'TP');
INSERT INTO `emp` VALUES ('1203', 'khalil', 'php dev', '30000', 'AC');
INSERT INTO `emp` VALUES ('1204', 'prasanth', 'php dev', '30000', 'AC');
INSERT INTO `emp` VALUES ('1205', 'kranthi', 'admin', '20000', 'TP');

-- ----------------------------
-- Table structure for `emp_add`
-- ----------------------------
DROP TABLE IF EXISTS `emp_add`;
CREATE TABLE `emp_add` (
  `id` int(11) DEFAULT NULL,
  `hno` varchar(100) DEFAULT NULL,
  `street` varchar(100) DEFAULT NULL,
  `city` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of emp_add
-- ----------------------------
INSERT INTO `emp_add` VALUES ('1201', '288A', 'vgiri', 'jublee');
INSERT INTO `emp_add` VALUES ('1202', '108I', 'aoc', 'sec-bad');
INSERT INTO `emp_add` VALUES ('1203', '144Z', 'pgutta', 'hyd');
INSERT INTO `emp_add` VALUES ('1204', '78B', 'old city', 'sec-bad');
INSERT INTO `emp_add` VALUES ('1205', '720X', 'hitec', 'sec-bad');

3.1、导入mysql数据到hdfs

下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 hdfs

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password root \
--target-dir /sqoopresult \
--table emp --m 1

–target-dir 指定导出数据存放至 hdfs 的目录
–m 指定MapReduce运行线程数

查看导入的数据:

1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP

可以看出它会用逗号,分隔 emp 表的数据和字段。

3.2、导入 mysql 表数据到hive

将关系型数据的表结构复制到hive中:

bin/sqoop create-hive-table \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--table emp_add \
--username root \
--password root \
--hive-table itcast.emp_add_sp

–table emp_add为mysql中的数据库sqoopdb中的表
–hive-table emp_add_sp 为hive中新建的表名称

从关系数据库导入文件到hive中:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password root \
--table emp_add \
--hive-table cheng_cheng.emp_add_sp \
--hive-import \
--m 1

3.3、导入表数据子集

–where 可以指定从关系数据库导入数据时的查询条件。它执行在各自的数据库服务器相应的 SQL 查询,并将结果存储在hdfs的目标目录。

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password root \
--where "city ='sec-bad'" \
--target-dir /sqoop_wherequery \
--table emp_add --m 1

复杂查询条件:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password root \
--target-dir /sqoo_wherequerys \
--query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 1

3.4、增量导入

增量导入是仅导入新添加行的数据。

  • –check-column (col) 用来作为判断的列名,如 id
  • –incremental (mode) append:追加,比如对大于 last-value 指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加 last-value指定的日期之后的记录
  • –last-value (value) 指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值

新添加数据:

INSERT INTO `emp` VALUES ('1206', 'satish', 'grp', '20000', 'GR');
INSERT INTO `emp` VALUES ('1207', 'ss', 'cc', '1000', 'DF');
INSERT INTO `emp` VALUES ('1208', 'aa', 'cd', '12000', 'DC');

增量导入:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password root \
--target-dir /sqoopresult_zeng \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1205

4、Sqoop导出

将数据从 HDFS 导出到 RDBMS 数据库导出前,目标表必须存在于目标数据库中。
默认操作是从将文件中的数据使用INSERT语句插入到表中,更新模式下,是生成UPDATE语句更新表数据。

以下是 export 命令语法:

$ sqoop export (generic-args) (export-args)

导出hdfs数据到 mysql

数据是在hdfs中“/sqoopresult”目录中
在mysql中创建目标表:

CREATE TABLE `hdfs_to_emp` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `deg` varchar(100) DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  `dept` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

执行导出命令:

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password root \
--table hdfs_to_emp \
--export-dir /sqoopresult/

导出结果

这里写图片描述

  • 1.列出mysql数据库中的所有数据库命令

bin/sqoop list-databases \
--connect jdbc:mysql://node-21:3306 \
--username root \
--password hadoop
  • 2.连接mysql并列出数据库中的表命令
bin/sqoop list-tables \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop

喜欢就点赞评论+关注吧

这里写图片描述

感谢阅读,希望能帮助到大家,谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/qq_41455420/article/details/79842000
今日推荐