本文主要是介绍sqoop之import之部分数据导入和密码文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
sqoop之import之部分数据导入和密码文件
- 一、前置工作
- 二、测试数据
- 三、案例演示
一、前置工作
- 参考:sqoop之import入门案例汇总
二、测试数据
-
在MySQL中创建emp表,建表语句及数据如下:
/* Navicat MySQL Data TransferSource Server : local-mysql Source Server Version : 50722 Source Host : localhost:3306 Source Database : hadoopTarget Server Type : MYSQL Target Server Version : 50722 File Encoding : 65001Date: 2020-05-19 16:05:22 */SET FOREIGN_KEY_CHECKS=0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS `emp`; CREATE TABLE `emp` (`EMPNO` INT(30) NOT NULL AUTO_INCREMENT,`ENAME` VARCHAR(50) DEFAULT NULL,`JOB` VARCHAR(50) DEFAULT NULL,`MGR` INT(30) DEFAULT '0',`HIREDATE` VARCHAR(255) DEFAULT NULL,`SAL` INT(30) DEFAULT '0',`COMM` INT(30) DEFAULT '0',`DEPTNO` INT(30) DEFAULT '0',PRIMARY KEY (`EMPNO`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;-- ---------------------------- -- Records of emp -- ---------------------------- INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980/12/17', '8000', '0', '20'); INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981/2/20', '1600', '300', '30'); INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981/2/22', '1250', '500', '30'); INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981/4/2', '2975', '0', '20'); INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981/9/28', '1250', '1400', '30'); INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981/5/1', '2850', '0', '30'); INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981/6/9', '2450', '0', '10'); INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987/4/19', '3000', '0', '20'); INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', '0', '1981/11/17', '5000', '0', '10'); INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981/9/8', '1500', '0', '30'); INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987/5/23', '1100', '0', '20'); INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981/12/3', '9500', '0', '30'); INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981/12/3', '3000', '0', '20'); INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982/1/23', '1300', '0', '10');
三、案例演示
-
案例一: Importing Part Data(导入部分数据)
命令如下:
sqoop import \ --connect jdbc:mysql://192.168.76.1:3306/gvsys \ --username root \ --password 123456 \ --table emp \ --where 'DEPTNO=20' \ --target-dir /mysql/emp/21/
注意:
--where
后面的是条件,上述最大最小值查询的SQL语句:
SELECT MIN(EMPNO
), MAX(EMPNO
) FROMemp
WHERE ( DEPTNO=20 )
运行结果如下:
上述实现的功能等价于:SELECT `EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREDATE`,`SAL`,`COMM`,`DEPTNO` FROM`emp` AS `emp` WHERE (DEPTNO = 20) AND (1 = 1) AND (1 = 1)
注意事项:
Sqoop将把——where参数的内容传播到所有获取数据的生成查询。这提供了一种强大的能力,通过它可以表达特定数据库服务器可以处理的任何条件。可以使用任何特殊的函数、转换,甚至用户定义的函数。因为SQL片段将被传播到生成的查询中,而不需要进行任何Sqoop处理,所以任何无效的片段都可能导致难以调试的非直观异常。对于新的Sqoop用户来说,这个参数可能会让他们感到困惑。在使用where参数时,请记住Sqoop传输的并行性。数据将在几个并发任务中传输。任何昂贵的函数调用都会给数据库服务器带来巨大的性能负担。高级函数可以锁定某些表,防止Sqoop并行传输数据。这将对传输性能产生不利影响。要获得高效的高级筛选,请在导入之前在数据库上运行筛选查询,将其输出保存到一个临时表中并运行将临时表导入到Hadoop中,而不需where参数。
- 案例二:Protecting Your Password(用文件保护密码)
-
问题描述
:在命令行界面中输入密码是不安全的。它可以很容易地从列出操作系统正在运行的进程中检索出来。 -
解决思路
:
1、使用将指示的参数-P从标准输入读取密码。
2、 可以将密码保存在一个文件中,并使用参数–password-file 文件指定该文件的路径。 -
举例说明
:
1、方式一: 使用参数-P
sqoop import \ --connect jdbc:mysql://192.168.76.1:3306/gvsys \ --username root \ --table emp \ --target-dir /mysql/emp01/ \ -P
执行上述命令后,需要手动输入密码,如图:
这种方式很安全,但是不利于编写自动化脚本
。
2、方式二:使用密码文件
sqoop import \ --connect jdbc:mysql://192.168.76.1:3306/gvsys \ --username root \ --table emp \ --password-file /root/sqoop/sqoop.password
【注意】:
-
0、使用如下命令将密码写入到sqoop.password
echo -n “123456” > sqoop.password -
1、密码文件需要上传到HDFS上 hdfs dfs -put sqoop.password /root/sqoop/
-
2、需要修改密码文件权限为400(可选项)
hdfs dfs -chmod 400 sqoop.password -
3、如果需使用本地密码文件需添加协议,如下所示:
file:///root/sqoop.password
【特别注意】:
如果sqoop和MySQL的所有配置(包括驱动)都正确的情况下,还是报错:
ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: Access denied for user 'root'@'hadoop001' (using password: YES)
原因
是在编写密码文件的时候有换行符导致
解决办法 按照上述【注意】中【0】步骤解决即可 -
-
这篇关于sqoop之import之部分数据导入和密码文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!