博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqoop提供数据库密码的4种方式
阅读量:5786 次
发布时间:2019-06-18

本文共 2390 字,大约阅读时间需要 7 分钟。

背景

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中提供数据库密码的方式,建议大家在今后的工作中多多使用别名模式来提供数据库的密码,因为这种方式最为安全也不失便捷。

参考资料

本文首发于

转载地址:http://hktyx.baihongyu.com/

你可能感兴趣的文章
吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
查看>>
easyui中combobox的值改变onchang事件
查看>>
Eclipse魔法堂:任务管理器
查看>>
一周自学动态站点设计
查看>>
eclipse中查看某个方法(函数)被谁调用
查看>>
poj万人题
查看>>
Android-Universal-Image-Loader
查看>>
Java从零开始学四(数据类型)
查看>>
Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
查看>>
windows 如何查看端口占用情况?
查看>>
根据ImageView的大小来压缩Bitmap,避免OOM
查看>>
TEST
查看>>
loadrunner 的Administration Page里面设置
查看>>
程序员喜欢怎样的职位描述?(转)
查看>>
威胁快报|ProtonMiner挖矿蠕虫扩大攻击面,加速传播
查看>>
<<深入PHP面向对象、模式与实践>>读书笔记:面向对象设计和过程式编程
查看>>
架构的“一小步”,业务的一大步
查看>>
聊聊flink JobManager的heap大小设置
查看>>
PAT A1116
查看>>
App上架/更新怕被拒? iOS过审“避雷秘籍”请查收
查看>>