sqoop提供数据库密码的4种方式

背景

sqoop是一个用来将Hadoop和关系型数据库(RDBMS)中的数据进行相互转移的工具。在使用sqoop时,我们需要提供数据库的访问密码。目前sqoop共支持4种输入密码的方式:

  1. 明文模式。
  2. 交互模式。
  3. 文件模式。
  4. 别名模式。

笔者使用的是CDH5.10里的sqoop,版本是1.4.6。在待会的演示中,我们将以mysql作为我们的关系型数据库。

明文模式

明文模式是最为简单的方式。我们可以在执行sqoop命令时使用--password参数,这样我们就可以直接在命令行中输入密码来访问数据库。

# sqoop list-databases --connect jdbc:mysql://your_mysql_host --username your_mysql_username --password your_mysql_password

由于我们在命令行中敲入了明文的数据库密码,这就带来了泄漏密码的风险。我们设想一下,假设有某个不怀好意的“黑客”侵入了你的服务器,只要他敲一下“history”命令,他就可以看到我们上次敲的命令,也理所当然的看到了我们数据库的密码。所以我们尽量不要采用这种危险的方式。

交互模式

交互模式是一种常用的提供密码的方式。在执行sqoop命令时加上-P参数,按下回车之后,终端会提示你输入密码:

# sqoop list-databases --connect jdbc:mysql://your_mysql_host --username your_mysql_username -P

采用这种方式,不会有泄漏密码的风险,因为没有人能够看到我们的密码,只有sqoop程序知道。但是这种方式有个弊端,因为它需要人为地输入密码(交互式),所以只能在终端下执行。所以这种方式比较适合在命令行中做一些简单的测试,如果要在某些后台服务中(比如Oozie)执行sqoop脚本的话,我们需要采用其他方式。

文件模式

文件模式常用在后台定时执行sqoop脚本的场景。它不需要人为地输入密码,又比明文模式更加安全。具体使用方式如下:

# echo -n "your_mysql_password" > /home/xxx/.mysql.password
# chmod 400 /home/xxx/.mysql.password
# sqoop list-databases --connect jdbc:mysql://your_mysql_host --username your_mysql_username --password-file file:///home/xxx/.mysql.password

首先我们需要建立一个文件来保存我们的密码,比如例子中的.mysql.password文件。这里有个坑就是我们不能用vim来创建该文件,因为vim会自动在文件的最后加上一个换行符,而sqoop并不会忽略末尾的换行符,所以会将含有换行符的密码提交给数据库,导致访问失败。所以我们可以利用echo -n命令来避免末尾换行符的出现。

然后我们将该文件的访问权限设置为400,即只有当前用户具有可读权限。最后在执行sqoop命令时通过--password-file参数来指定密码文件所在的路径。我们也可以指定位于hdfs的密码文件,只要指定路径时将”file”更换成”hdfs”即可。

但是文件模式也有弊端,那就是密码还是以明文的形式存储在文件中,只要“黑客”能够读取到密码文件的内容,那还是能获取到我们的密码。

别名模式

别名模式是一种较新的方式,网上介绍的文章相对较少。采用这种方式可以完美解决文件模式里明文存储密码的问题。从sqoop1.4.5开始后,sqoop支持使用在Java keystore中存储的密码,这样我们就不用在文件中明文存储密码了。

首先我们使用hadoop credential create [alias_name] -provider [hdfs_location]命令(该命令在hadoop 2.6.0之后才有)在keystore中创建密码以及密码别名:

# hadoop credential create mysql.pwd.alias -provider jceks://hdfs/user/password/mysql.pwd.jceks

命令执行时如下图所示:

在Enter alias password后面输入我们数据库的密码。执行完后,程序在hdfs的/user/password/下创建了一个mysql.pwd.jceks文件,而且mysql.pwd.alias就是我们的密码别名。我们可以使用mysql.pwd.alias来代替我们真实的数据库密码。在执行sqoop命令时,我们可以使用--password-alias参数,参数的值就是我们刚才自己指定的密码别名:

# sqoop list-databases -Dhadoop.security.credential.provider.path=jceks://hdfs/user/password/mysql.pwd.jceks --connect jdbc:mysql://master --username root --password-alias mysql.pwd.alias

那么这种方式是否能够隐藏我们的密码呢?打开mysql.pwd.jceks文件,我们只能看到一片乱码,这就说明别名模式很好地隐藏了我们真实的数据库密码。

总结

本文介绍了4种在sqoop中提供数据库密码的方式,建议大家在今后的工作中多多使用别名模式来提供数据库的密码,因为这种方式最为安全也不失便捷。

时间: 2024-10-10 22:10:26

sqoop提供数据库密码的4种方式的相关文章

SqlServer2008 数据库同步的两种方式(Sql JOB)

原文:SqlServer2008 数据库同步的两种方式(Sql JOB) 数据库同步是一种比较常用的功能.以下结合我自己的体会整理的,如果有理解不完全或者有误的地方望大牛不理赐教.下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中.特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作.可以在制定的时间时间作为任务计划自动执行.缺点是需要写SQL来进行操作.既然是数据库之间的同步就涉及到数

MySQL数据库授权的两种方式

MySQL数据库授权的两种方式 方法一:通过grant命令创建用户并授权 grant命令简单语法如下: grant all privileges on dbname.* to [email protected] identified by 'passwd'; 列表说明如下: 说明:上述命令是授权localhost主机上通过用户username管理dbname数据库的所有权限,密码是passwd.其中,username,dbname,passwd可根据业务的情况修改. 举例:创建zd用户,对tes

hibernate动态创建数据库表名几种方式

数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实行分表管理 例如 日志记录表 将日期(yyyy-MM)作为默认表后缀动态追加, 例如 文章发布表 将用户名作为后缀名进行动态追加 ; 动态创建数据库表的方式要具体问题具体分析, 比如JDBC中直接使用create table 表名_dynamicStr(...); 文章发布系统 dynamicStr

【转】SQL Server 2008 数据库同步的两种方式 (发布、订阅)

上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2.订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别介绍发布.订阅的过程. 一.发布.发布需要用实际的服务器名称,不能使用服务器的IP地址进行.能发布的信息包括[表].[存储过程].[用户函数]如果使用IP会有错误,如下图: 具体发

MySQL数据库备份的几种方式

MySQL备份的几种方式 最近一直想写点博客,但是不知道写什么,感觉自己最近的知识没有什么增加,今天想到了一篇可以写的博客.以前试过根据data文件夹备份MySQL,但是从来没有成功过,前几天帮助朋友还原MySQL,终于成功的将备份的data文件夹还原成功了. MySQL数据库算是常用的数据库中最好使用的数据库了,对于备份的操作也不例外.所以今天分享一下MySQL数据库的备份的几种方式. 方式一:使用命令行的方式. 命令行的方式较为快捷,只需要在命令行中使用mysqldump命令即可,默认情况下

(转)SqlServer2008 数据库同步的两种方式 (发布、订阅)

上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别介绍发布.订阅的过程. 1.发布.发布需要用实际的服务器名称,不能使用服务器的IP地址进行.能发布的信息包括[表].[存储过程].[用户函数]如果使用IP会有错误,如下图: 具体发布

SqlServer2008 数据库同步的两种方式 (发布、订阅)

尊重原著作:本文转载自http://www.cnblogs.com/tyb1222/archive/2011/05/31/2064944.html 上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别介绍发布.订阅的过程. 1.发布.

Code First02---CodeFirst配置实体与数据库映射的两种方式

Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API. 这两种方式分别是什么呢?下面进行一一解释: DataAnnotation的配置方式需要你给定义实体和值对象的类和类中的属性加上与数据库映射相关的配置标签. 比如说:我有一个实体类:Customers 按照Code First的规则,数据库的表名应该是跟这个一致Customers,但是如果我想表名为Customer,那怎么才能让实体识别到这个表名呢. [Table(“Cu

SQL Server 2008 数据库同步的两种方式 (发布、订阅)

上篇中 说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2.订阅.首先 在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发 布.下面分别介绍发布.订阅的过程. 一.发布.发布需要用实际的服务器名称,不能使用服务器的IP地址进行.能发布的信息包括[表].[存储过程].[用户函数]如果使用IP会有错误,如下图: