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

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注