热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sqoop使用过程中提供密码的几种方式详解

概述本博文基于Sqoop1.4.6版本讲解在使用Sqoop工具从关系型数据库中导入导出数据过程中管理关系型数据库密码的几种方式。这里我们通过讲解sqoopimpor
概述
本博文基于Sqoop1.4.6版本讲解在使用Sqoop工具从关系型数据库中导入导出数据过程中管理关系型数据库密码的几种方式。

这里我们通过讲解sqoopimport命令来说明:

sqoop import在实际应用中主要用于将数据从关系型数据库(比如MySQL,SqlServer,Oracle等)导入到大数据集群文件系统(比如HDFS文件系统,HBase列式存储系统以及Hive数据仓库等)。关系型数据库中的每行数据在HDFS上表示为单独的记录。如果数据保存为textfile文件格式,那么数据库表的一行记录对应textfile文件中一行记录;如果数据导入到HBase中,关系型数据库表中的一行记录被作为一个Put对象进行缓存和持久化。

我们首先来看一下Sqoop官方网站对于sqoop import工具的一些通用的命令参数:


我们可以看到在导入命令使用中关于密码使用的三种方式:
(1) --password
(2) -P
(3) --password-file

关于密码使用的第四种方法我们可以通过sqoop 官方网站的以下描述得到:











根据英文描述,从Hadoop2.6.0开始提供了单独的API用于将密码存储和应用分离。具体的API就是hadoop credential, 关于该命令在密码生成和存储上的使用,我们将在下文具体说明。从上面的英文介绍,我们得到第四种密码使用方式:
(4) –password-alias

到此,我们整理出来现有的四种密码提供和使用方式,接下来我们配合脚本示例来详细说明每种方式的使用和注意事项。

方式一:--password [明文方式]

--password:基于这个通用控制参数的使用方法最简单也最不安全,这种方式通过在命令中以明文的方式提供数据库访问密码来访问数据库进而将数据从关系型数据导入到HDFS上。

因为密码以明文的方式出现在sqoop import命令中,所以其他用户可以通过ps 命令读取到你的数据库访问密码,所以这种方式也是最不安全的方式。

这里我们举个例子来说明如何使用:
sqoop import \
	--connect jdbc:mysql://mdp5:3306/precmarket \
	--username sqoop \
	--password sqoop \
	--table d_area \
	--as-textfile \
	--target-dir /sqoop_training/d_area_1.textfile \
	--compress \
	--null-string '\\N' \
	--null-non-string '\\N' \
	--num-mappers 1 \
	--delete-target-dir \
	--direct

方式二:-P [交互方式]

-P:这个参数指定命令执行通过交互式方式提示用户输入密码。

这种方式避免了数据库密码直接以明文的形式出现,因而防止了密码的泄露,但是它只能在终端状态下使用,一般也只用于命令行中提交一些简单的测试任务,无法应用于后台自动执行这样的应用场景下。

这里我们举个例子来说明如何使用:

sqoop import \
--connect jdbc:mysql://mdp5:3306/precmarket \
--username sqoop \
-P \
--table d_area \
--as-textfile \
--target-dir /sqoop_training/d_area_1.textfile \
--compress \
--null-string '\\N' \
--null-non-string '\\N' \
--num-mappers 1 \
--delete-target-dir \
--direct
命令提交以后会出现提示输入密码,输入密码后回车,命令提交成功。

方式三:--password-file [文件方式]

--password-file:这个控制参数通过指定一个保存密码的文件路径来提供数据库数据访问密码。

这种方式是比较安全的密码提供方式之一,但是需要保证以下三点:
(1) 保存密码的文件创建并保存在当前用户的home目录下
(2) 保存密码的文件的访问权限设置成400,即只有当前用户自己可以访问,其他用户无任何访问权限
(3) 由于Sqoop将读取保存密码的文件中的全部内容作为密码。这将包括任何尾部的空白字符,比如换行或者其他编辑器默认添加的结尾字符。所以需要保证存入该文件中的字符完完整整是你的密码字符串。我们可以通过使用echo –n “secret” > password.file 方式来去除尾部多余的空白结束符。

这里需要强调一点的是,sqoop在执行命令过程中将读取密码文件传递到MapReduce 集群,这个保存密码的文件可以保存在本地也可以保存在HDFS上;如果是本地需要在指定—password-file参数时加file:/// 路径前缀;如果是保存在HDFS上,在指定—password-file参数值时需要指定hdfs://文件系统路径前缀。具体例子如下:

(1) 首先我们创建用于保存密码的文件password.file, 我们假设当前用户是mnt, 数据库密码是sqoop。
    
[mnt /home/mnt] echo –n “mnt_password” > /home/mnt/.password.file
(2) 如果是基于本地密码文件的方式,命令使用如下:

sqoop import \
--connect jdbc:mysql://mdp5:3306/precmarket \
--username sqoop \
--password-file file:///home/mnt/.password.file \
--as-textfile \
--target-dir /sqoop_training/d_area_1_password_file.textfile \
--compress \
--null-string '\\N' \
--null-non-string '\\N' \
--num-mappers 4 \
--delete-target-dir \
--direct \
--query 'select * from d_area where id > 10000 and $CONDITIONS' \
--split-by 'id'
(3) 首先我们将步骤(1) 中创建的.password.file 上传到hfds的/usr/mnt目录下
      
[mnt /home/mnt] hadoop fs –copyFromLocal /home/mnt/.password.file /user/mnt
(4) 基于HDFS文件系统指定密码文件的方式,命令如下:
     
sqoop import \
--connect jdbc:mysql://mdp5:3306/precmarket \
--username sqoop \
--password-file hdfs://user/mnt/.password.file \
--as-textfile \
--target-dir /sqoop_training/d_area_1_password_file.textfile \
--compress \
--null-string '\\N' \
--null-non-string '\\N' \
--num-mappers 4 \
--delete-target-dir \
--direct \
--query 'select * from d_area where id > 10000 and $CONDITIONS' \
--split-by 'id'

方式四:--password-alias [别名方式]

Hadoop2.6.0 之后的版本提供了一个API用于将密码存储和应用程序分离。这个API被称为凭证提供的API,并提供了一个新的命令行工具来管理密码及其别名。密码及其别名一起被存储在密码保护的密钥库中。密钥库密码可以通过控制台交互提示输入提供给应用程序或者作为代码中的变量来提供。

一旦在密钥库中存储了密码及其别名,在应用程序中便可以选择使用别名代替实际密码,并在运行时解析别名以使用密码。这样只有别名在配置文件或者命令中是可见的,这样可以防止密码的泄露。Sqoop基于Hadoop提供的这种功能丰富了密码管理功能,只要底层hadoop支持通过使用密钥库来管理密码及其别名,那么通过使用—password-alias 指定密码对应的别名即可。

这里我们通过脚本来说明具体的步骤:
(1) 首先生成jceks文件,支持本地存储模式和HDFS文件系统存储模式:
  • 本地密钥库模式:
hadoop credential create mydb.password.alias -provider localjceks://file/tmp/mysql.password.jceks
命令行提示输入密码:sqoop [Enter]
确认密码:sqoop [Enter]
完成。
  • HDFS密钥库模式:
  (i) 上传本地生成好的密钥库到HDFS指定目录:

hadoop fs -copyFromLocal /tmp/mysql.password.jceks  /user/sqoop/ 
  (ii)  命令直接生成基于HDFS存储的密钥库:

hadoop credential create mysql.pwd.alias -provider jceks://hdfs/user/password/mysql.pwd.jceks
命令行提示输入密码:sqoop [Enter]
确认密码:sqoop [Enter]
完成。

(2) 通过使用—password-alias参数指定密码对应的别名来指定sqoop import任务:
  •  本地密钥库模式:
sqoop import \
-Dhadoop.security.credential.provider.path=localjceks://file/tmp/mysql.password.jceks \
--connect 'jdbc:mysql://mdp5:3306/precmarket' \
--table d_area  \
--username sqoop \
--password-alias mydb.password.alias \
--delete-target-dir \
--target-dir /sqoop_training/2.textfile
  •  HDFS密钥库存储模式:
sqoop import \
-Dhadoop.security.credential.provider.path=jceks://hdfs/user/sqoop/mysql.password.jceks \
--connect 'jdbc:mysql://mdp5:3306/precmarket' \
--table d_area  \
--username sqoop \
--password-alias mydb.password.alias \
--delete-target-dir \
--target-dir /sqoop_training/3.textfile
注意:基于HDFS文件系统生成的密钥库,在执行sqoop import任务时会出现以下异常:


Sqoop 任务执行日志:空指针异常


其实这个是Hadoop的一个bug,jira上的参考地址是:
https://issues.apache.org/jira/browse/HADOOP-13353

所以在使用密钥库提供密码的方式时,需要注意以下几点:
(1)基于HDFS存储密钥库的方式,需要在本地生成密钥库之后上传到hdfs指定目录,之后通过—password-alias指定具体的密码别名,使用-Dhadoop.security.credential.provider.path 控制参数来指定hdfs文件系统上的密钥库文件路径
(2)基于本地文件系统存储密钥库方式。
通过—password-alias 指定具体的密码别名,使用-Dhadoop.security.credential.provider.path 控制参数来指定本地文件系统上的密钥库文件路径

参考资料: Sqoop官网


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 开发笔记:深度探索!Android之OkHttp网络架构源码解析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了深度探索!Android之OkHttp网络架构源码解析相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉, ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 马蜂窝数据总监分享:从数仓到数据中台,大数据演进技术选型最优解
    大家好,今天分享的议题主要包括几大内容:带大家回顾一下大数据在国内的发展,从传统数仓到当前数据中台的演进过程;我个人认为数 ... [详细]
  • HIVE 移动数据 (从表到分区表,分区表到子分区表)
    为什么80%的码农都做不了架构师?ExchangePartitionSkiptoendofmetadataCreatedbyNamitJain,lastmodi ... [详细]
  • ajax 跨域webapi 最简单的demo(只介绍Get)
    这几天遇到一个nodejs的项目,使用VSCode开发,需要连接数据库的,但是用nodejs连接数据库比较繁琐,需要安装很多 ... [详细]
  • 在写每日签到的时候,我居然使用的是本地时间被项目经理笑哭了。。。。,如果你在写单机游戏,没有游戏服务器,但又不想使用本地时间,就可以采用下面方法.方法总结:     1.使用 ... [详细]
  • 在MirrorAPI中,我们可以使用以下内容: ... [详细]
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • CentOS 7.6网卡绑定mode1
    CentOS7.6网卡绑定mode1[root@server~]#systemctlstopNetworkManager[root@server~]#systemctldisabl ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
author-avatar
1712477436
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有