1. 程式人生 > >sqoop提供數據庫密碼的4種方式

sqoop提供數據庫密碼的4種方式

d參數 指定 裏的 路徑 定時 cdh5 als http 並不會

背景

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中提供數據庫密碼的方式,建議大家在今後的工作中多多使用別名模式來提供數據庫的密碼,因為這種方式最為安全也不失便捷。

sqoop提供數據庫密碼的4種方式