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

2024-06-09 19:58

本文主要是介绍sqoop 使用过程中提供密码的几种方式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

本博文基于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官网

这篇关于sqoop 使用过程中提供密码的几种方式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046154

相关文章

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa