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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W