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/
验证启动
- -- --
--
本命令会列出所有 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;
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');
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;
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/
导出结果
bin/sqoop list-databases \
--connect jdbc:mysql://node-21:3306 \
--username root \
--password hadoop
bin/sqoop list-tables \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop
喜欢就点赞评论+关注吧
感谢阅读,希望能帮助到大家,谢谢大家的支持!