天天看點

sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解

一、概述

Sqoop是一款開源的資料導入導出工具,可以将傳統的關系型資料庫導出至HDFS,也可以将HDFS中的資料導出至關系型資料庫。

官網: http://sqoop.apache.org/

原理:在Hadoop生态體系中,計算基本依賴于MR,那麼Sqoop也是如此,Sqoop就是将Sqoop語句翻譯成MR程式,來實作一個資料導入和導出的操作。那就不難了解到Sqoop就是一個對于InpuFormat和OutputFormat進行特殊定制的MR程式。

二、Sqoop安裝

2.1 下載下傳

官方下載下傳位址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7
sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解

2.2 解壓

上傳至Linux 伺服器,解壓在相關位置即可。

2.3 修改配置檔案

将conf目錄下的sqoop-env.template.sh改名
mv sqoop-env-template.sh sqoop-env.sh 
 vi sqoop-env.sh 
           
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.6.0

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop-2.6.0

#set the path to where bin/hbase is available
export HBASE_HOME=/home/hbase/hbase-1.2.4

#Set the path to where bin/hive is available
export HIVE_HOME=/home/hive/apache-hive-1.2.1-bin

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
           

2.4 拷貝JDBC驅動

将Mysql或者其他使用到的資料的JDBC驅動拷貝到Sqoop根目錄下lib目錄。

3.5 驗證啟動

sqoop-version
 預期的輸出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
           
./sqoop-list-databases --connect jdbc:mysql://HadoopNode00:3306 --username root --password root

預期輸出:
18/10/23 17:09:44 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
18/10/23 17:09:44 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/10/23 17:09:45 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hive
mysql
performance_schema
shortvideo
test
           

三、使用

3.1 導出資料

導出資料使用export關鍵字,指的就是從大資料叢集導入至傳統的關系型資料庫

3.1.1 HDFS 到RDBMS

這裡以 MySQL 為例

準備資料

準備資料需要在Mysql中建立新表
DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs` (
  `uuid` varchar(255) NOT NULL,
  `userid` varchar(255) DEFAULT NULL,
  `fromUrl` varchar(255) DEFAULT NULL,
  `dateString` varchar(255) DEFAULT NULL,
  `timeString` varchar(255) DEFAULT NULL,
  `ipAddress` varchar(255) DEFAULT NULL,
  `browserName` varchar(255) DEFAULT NULL,
  `pcSystemNameOrmobileBrandName` varchar(255) DEFAULT NULL,
  `systemVersion` varchar(255) DEFAULT NULL,
  `language` varchar(255) DEFAULT NULL,
  `cityName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

           

資料導出

這裡資料是使用MR進行清洗後得到的資料
./sqoop export \
--connect jdbc:mysql://centos:3306/hadoop \
--username root \
--password root \
--table logs \
--export-dir /access_log/19-07-30clean04  \
--input-fields-terminated-by ' ' \
--m 1
           
./sqoop export \
--connect jdbc:mysql://centos:3306/nove \
--username root \
--password root \
--table money \
--export-dir /money_result  \
--input-fields-terminated-by '\\m+' \
--m 1
           

3.2 導入資料

導入資料使用import關鍵字,指的就是從傳統的關系型資料庫導入至大資料叢集

3.2.1 RDBMS 到 HDFS

準備資料

資料庫中還是上述文檔中建立的logs。将logs中的資料導入至HDFS

導入資料

(1)全部導入
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--target-dir /sqoop_test/clean01 \
--num-mappers 1 \
--fields-terminated-by "|" \
           
(2)條件導入
通過手動指定查詢條件導入資料 ,在查詢語句中必須包含$CONDITIONS關鍵字
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--target-dir /sqoop_test/clean02 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by " "  \
--query 'select *  from logs  where  $CONDITIONS limit 1,2'
           
(3)導入指令列
其實和手動輸入查詢條件時一樣的效果 注意: 多列之間使用逗号進行分割
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--target-dir /sqoop_test/clean03 \
--num-mappers 1 \
--fields-terminated-by " " \
--columns userid,cityName
           

3.2.2 RDBMS 到 Hive

準備資料

還是上述建表語句

導入資料

./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database baizhi \
--hive-table logs \
--delete-target-dir 
           

填坑三部曲

sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解
解決辦法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
           
sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解
解決辦法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/ 
           
sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解
這裡可以看出目前使用hive中logs是帶有分區的,但是在導入的時候沒有去指定具體是哪個分區,是以問題就在這裡。
           

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-n77Bs2NS-1589640097545)(assets/1561101986300.png)]

從 sqoop import --help 給出幫助指令可以看到sqoop也提供了相關的解決方案,那隻需要在上述語句中加入相關字段即可:–hive-partition-key day|–hive-partition-value 19-06-20
./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database baizhi \
--hive-table logs \
--delete-target-dir \
--hive-partition-key day \
--hive-partition-value 19-07-30
           

從hive導出資料

sqoop export \
--connect "jdbc:mysql://192.168.134.151:3306/logs?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password yhm1211. \
--table logs \
--export-dir /user/hive/warehouse/logs/day=18-10-18     \
--input-fields-terminated-by ' ' \

           

3.2.3 RDBMS 到 HBase

./sqoop import \
--connect jdbc:mysql://HadoopNode00:3306/hadoop \
--username root \
--password root \
--table logs \
--columns "uuid,userid,fromurl" \
--column-family "log_basic" \
--hbase-create-table \
--hbase-row-key "uuid" \
--hbase-table "logs" \
--num-mappers 1 \
--split-by uuid
           
很幸運,使用Sqoop1.4.7中可以在HBase1.2.4中自動建立相關表

四、常見參數詳解

https://blog.csdn.net/myrainblues/article/details/43673129

https://blog.csdn.net/wtzhm/article/details/81810159

4.1 頂級指令列舉

來源 sqoop-help
指令 說明
codegen 資料生成Java并打包
create-hive-table 擷取資料庫中某張表
eval 檢視 SQL 執行結果
export 将叢集資料導出
help 列印 sqoop 幫助資訊
import 将資料導入到叢集
import-all-tables 導入某個資料庫下所有表到 HDFS 中
import-mainframe 将資料集從大型機伺服器導入到HDFS
job 用來生成一個 sqoop的任務,生成後,該任務并不執行,除非使用指令執行該任務。
list-databases 列出所有資料庫名
list-tables 列出某個資料庫下所有表
merge 将 HDFS 中不同目錄下面的資料合在一起,并存放在指定的目錄中
metastore 記錄 sqoop job 的中繼資料資訊,如果不啟動 metastore 執行個體,則預設的中繼資料存儲目錄為:~/.sqoop,如果要更改存儲目錄,可以 在 配 置 文 件sqoop-site.xml中進行更改。
version 列印 sqoop 版本資訊

4.2 頂級指令詳解

export是導出至RDBMS

4.2.1 共用參數:資料庫

序号 參數 說明
1 –connect 連接配接關系型資料庫的 URL
2 –connection-manager 指定要使用的連接配接管理類
3 –driver Hadoop 根目錄
4 –help 列印幫助資訊
5 –password 連接配接資料庫的密碼
6 –username 連接配接資料庫的使用者名
7 –verbose 在控制台列印出詳細資訊

4.2.2 共用參數:import

序号 參數 說明
1 –enclosed-by 給字段值前加上指定的字元
2 –escaped-by 對字段中的雙引号加轉義符
3 –fields-terminated-by 設定每個字段是以什麼符号作為結束,預設為逗号
4 –lines-terminated-by 設定每行記錄之間的分隔符,預設是\n
5 –mysql-delimiters Mysql 預設的分隔符設定,字段之間以逗号分隔,行之間以\n 分隔,預設轉義符是\,字段值以單引号包裹
6 –optionally-enclosed-by 給帶有雙引号或單引号的字段值前後加上指定字元

4.2.3 共用參數:export

序号 參數 說明
1 –input-enclosed-by 對字段值前後加上指定字元
2 –input-escaped-by 對含有轉移符的字段做轉義處理
3 –input-fields-terminated-by 字段之間的分隔符
4 –input-lines-terminated-by 行之間的分隔符
5 –input-optionally-enclosed-by 給帶有雙引号或單引号的字段前後加上指定字元

4.2.4 共用參數:hive

序号 參數 說明
1 –hive-delims-replacement 用自定義的字元串替換掉資料中的\r\n和\013 \010等字元
2 –hive-drop-import-delims 在導入資料到 hive 時,去掉資料中的\r\n\013\010 這樣的字元
3 –map-column-hive 生成 hive 表時,可以更改生成字段的資料類型
4 –hive-partition-key 建立分區,後面直接跟分區名,分區字段的預設類型為string
5 –hive-partition-value 導入資料時,指定某個分區的值
6 –hive-home hive 的安裝目錄,可以通過該參數覆寫之前預設配置的目錄
7 –hive-import 将資料從關系資料庫中導入到 hive 表中
8 –hive-overwrite 覆寫掉在 hive 表中已經存在的資料
9 –create-hive-table 預設是 false,即,如果目标表已經存在了,那麼建立任務失敗
10 –hive-table 後面接要建立的 hive 表,預設使用 MySQL 的表名
11 –table

4.3 次級參數詳解

次級參數值得就是使用導出或者導入時使用的相關參數,均可使用–help來獲得

4.3.1 import

import導入指令在上述文檔中已經提到過,在這裡就不再列舉基本的操作,而是對資料進行增量操作

增量導入

首先是增量導入資料至Hive,但是指的注意的是現在不能指定hive相關的參數,說白了就是使用導入HDFS的方式導入hive,在此基礎上加上增量導入相關參數
準備資料
sqoop初步使用一、概述二、Sqoop安裝三、使用四、常見參數詳解
開始導入
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table user01 \
--hive-import 
           
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20  \
--num-mappers 1 \
--fields-terminated-by " " \
--incremental append \
--check-column uuid \
-m 1
           
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20  \
--num-mappers 1 \
--fields-terminated-by " " \
--append \
-m 1
           

繼續閱讀