Sqoop測試

前言

很早之前用過Sqoop,後來就再也沒有用過,原因是:
Sqoop走的MR,效率顯然不咋地啊
不過,最近新集羣搭建起來後,想把能配的組件都配置起來,然後進行測試,於是就把之前測試過Sqoop的東西,整理了一下

Sqoop簡介

Sqoop(發音:skup)是一款開源的工具,主要用於在Hadoop(Hive)與傳統的數據庫(mysql、postgresql…)間進行數據的傳遞,可以將一個關係型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型數據庫中。

Sqoop2 VS Sqoop1

在這裏插入圖片描述
在這裏插入圖片描述

CDH6.0以後移除了Sqoop2

CDH移除的組件看官網
在這裏插入圖片描述
sqoop2赫然在列,可是爲什麼CDH直接移除了sqoop2呢???

Mysql數據導入Hdfs

  • 沒有指定主鍵(即–split-by參數)
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--columns
id,username,password
--table
t_user
--target-dir
hdfs://unisk01:8020/sqoop/test1
-m
1

說明:如果表沒有定義主鍵–split-by <col> 且未提供主鍵(這裏的主鍵其實就是隨便一個表裏的字段而已),則導入將失敗,除非使用–num-mappers(或-m) 1選項或使用–autoreset-to-one-mapper選項將映射器的數量顯式設置爲1 。該選項 --autoreset-to-one-mapper通常與import-all-tables工具一起使用,以自動處理模式中沒有主鍵的表。

默認情況下,Sqoop作業會並行使用4個map任務來加速導入過程,-m 1則意味着只使用一個map任務,最終也就是生成一個文件

如果要追加往HDFS中的文件寫,需要配置:

--check-column
id
--incremental
append

–check-column :就是指定要給遞增列,其實隨便哪一列都可以,不過不可以不寫,–incremental比如配合其使用,不然報錯:

For an incremental import, the check column must be specified with --check-column. 

可以看到,追加數據成功:

1,張三,85,74,91
2,李四,95,90,83
3,王五,85,84,59
4,趙六,75,79,76
5,田七,69,63,98
6,李老八,89,90,83
1,張三,85,74,91
2,李四,95,90,83
3,王五,85,84,59
4,趙六,75,79,76
5,田七,69,63,98
6,李老八,89,90,83
  • 指定主鍵的配置
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--columns
id,username,password
--table
t_user
--target-dir
hdfs://node01:8020/sqoop/test1
--split-by
id
-m
2
  • 指定輸出數據的格式
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--columns
id,username,password
--table
t_user
--target-dir
hdfs://node01:8020/sqoop/test1
--split-by
id
-m
2
--fields-terminated-by
'\t'
--lines-terminated-by
'\n'
  • 通過sql語句輸出數據
import
--connect
jdbc:mysql://192.168.0.132/db_test
--username
root
--password
root
--as-textfile
--target-dir
hdfs://node01:8020/sqoop/test1
--split-by
username
-m
5
--fields-terminated-by
','
--lines-terminated-by
'\n'
--query
'SELECT * from t_user WHERE  $CONDITIONS'

說明:–query(或-e)不能和–table,–columns共存,通過–query,sqoop可以導入任意sql查詢結果集。
有一個問題就是哪怕後面沒有什麼要寫的條件,也要寫WHERE $CONDITIONS,不然會報錯:
must contain ‘$CONDITIONS’ in WHERE clause.

Mysql數據導入Hive

import
--connect
jdbc:mysql://192.168.0.199/db_test
--username
root
--password
root
--table
t_user
-m
1
--fields-terminated-by
','
--hive-import
--hive-database
default
--hive-table
t1
--hive-overwrite
--hive-drop-import-delims

說明:不需要事先創建hive表,這個腳本執行完後,會自動創建好表

Hdfs數據導入Mysql

Sqoop Export
導出工具將一組文件從HDFS導出回RDBMS。 目標表必須已經存在於數據庫中。 根據用戶指定的分隔符讀取輸入文件並將其解析爲一組記錄。

默認操作是將它們轉換爲一組將INSERT語句注入數據庫的記錄。 在“更新模式”下,Sqoop將生成UPDATE語句來替換數據庫中的現有記錄,並且在“調用模式”下,Sqoop將爲每條記錄創建一個存儲過程調用。

(1) 先創建一張空表用來接收HDFS的數據:
在這裏插入圖片描述
HDFS數據:
在這裏插入圖片描述
(2) 編寫選項文件

export
--connect
jdbc:mysql://192.168.4.16/test //指定把HDFS數據導入哪個數據
--username
root
--password
123
--columns
id,username,password
--table
t_user //指定導入到哪個表
-m
1
--export-dir
hdfs://mycluster/sqoop/test1/
--fields-terminated-by //必須指定HDFS數據是以什麼分割
','

(3)執行選項文件
在這裏插入圖片描述
(4) 去mysql查看數據

在這裏插入圖片描述

如何運行編輯好的選項文件

sqoop --options-file optionfile

可能遇到的問題

  • Please specify one with --split-by or perform a sequential import with ‘-m 1’.
    原因:如果表沒有定義主鍵–split-by 且未提供主鍵(這裏的主鍵其實就是隨便一個表裏的字段而已),
    則導入將失敗,除非使用–num-mappers(或-m)
    1選項或使用–autoreset-to-one-mapper選項將映射器的數量顯式設置爲1 。
    該選項 --autoreset-to-one-mapper通常與import-all-tables工具一起使用,以自動處理模式中沒有主鍵的表。

  • Malformed option in options file(my_options/option1): --fields-terminated-by ‘\t’
    原因:
    不要寫到一行
    應該這樣寫:
    –fields-terminated-by
    ‘\t’

  • ERROR tool.ImportTool: Imported Failed: Wrong FS: hdfs://unisk01:8020/sqoop/test1, expected: hdfs://mycluster
    原因:只是增加了
    –delete-target-dir
    就報瞭如上錯誤
    意思是需要指定一個集羣,而不是單個節點
    如果非要使用該命令就只能指定集羣名稱了
    不然,就手動刪除

  • 把oracle數據導入到hdfs後,數據行數增多
    原因:oracle中的有些字段中包含換行符,sqoop導入數據的時候出現了換行
    解決方法:
    trim(replace(replace(replace(cell_name,chr(13),’’),chr(10),’’),’\n’,’’)) cell_name

  • 把mysql數據導入hive的時候,發現顯示導入成功,但在hive倉庫中沒找到表和數據
    原因:自己在一臺搭建過單擊模式的服務器上搭建的sqoop,由於sqoop中配置的hive
    也是這個單機的hive,而單機的多用戶的hive表存儲的路徑不一樣,所以找不到。

  • 從mysql導入到hive的時候:

import
--connect
jdbc:mysql://192.168.0.199/db_test
--username
root
--password
root
--table
t_user
-m
1
--fields-terminated-by
','
--hive-import
--hive-database
default
--hive-table
t1
--hive-overwrite
--hive-drop-import-delims

使用上面的配置文件沒有任何問題
但是從oracle導入hive的時候就報錯,意思要增加–columns屬性搭配–table,加上就可以了

  • 如果hive的配置文件沒有配hive.metastore.warehouse.dir的話,sqoop導入到hive中的數據是找不到表的
發佈了237 篇原創文章 · 獲贊 145 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章