Apache Sqoop數據采集問題

Sqoop數據采集格式問題

  • 一、Sqoop工作原理
  • 二、Sqoop命令格式
  • 三、Oracle數據采集格式問題
  • 四、Sqoop增量采集方案

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

Sqoop項目開始于2009年,最早是作為Hadoop的一個第三方模塊存在,后來為了讓使用者能夠快速部署,也為了讓開發人員能夠更快速的迭代開發,Sqoop獨立成為一個Apache項目。

一、Sqoop工作原理

  • 數據導入:Sqoop通過MapReduce任務來實現數據的并行導入。首先,它會將關系型數據庫中的數據表按照一定的規則進行分區,然后為每個分區啟動一個Map任務,同時從數據庫中讀取相應分區的數據,并將數據寫入到HDFS或其他Hadoop存儲系統中。這樣可以充分利用Hadoop集群的分布式計算能力,提高數據導入的效率。

  • 導出過程:與導入類似,Sqoop也會將數據進行分區處理,然后通過Map任務將Hadoop中的數據讀取出來,并按照目標關系型數據庫的格式要求,將數據寫入到數據庫中。

Sqoop通過創建一個數據傳輸的MR程序,進而實現數據傳輸。

Sqoop安裝:

  1. JAVA環境配置
  2. Hadoop環境配置
  3. 相關數據庫驅動包

只要環境滿足以上設置,直接解壓Sqoop安裝包即可安裝,修改配置后即可使用。

二、Sqoop命令格式

基礎使用語法:

sqoop import | export \
--數據庫連接參數
--HDFS或者Hive的連接參數
--配置參數

數據傳輸常用參數:

選項參數
–connectjdbc:mysql://hostname:3306(數據庫連接URL)
–username數據庫用戶名
–password數據庫用戶密碼
–table指定數據表
–columns指定表列值
–where數據過濾條件
–e/–query自定義SQL語句
–driver指定數據庫驅動
–delete-target-dir導入數據時,清空目標目錄
–target-dir指定導入數據的目錄(通常為HDFS路徑)
–export-dir指定導出數據的源目錄(通常為HDFS路徑)

Sqoop命令的使用方法可以通過sqoop -h命令查看相關使用方法,此處不在贅述了

三、Oracle數據采集格式問題

場景:

  • Step1: 查看業務數據庫中 CISS_SERVICE_WORKORDER 表的數據條數。

    select count(1) as cnt from CISS_SERVICE_WORKORDER;  178609
  • Step2: 采集CISS_SERVICE_WORKORDER的數據到HDFS上

    sqoop import \
    --connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \  
    --username ciss \
    --password 123456 \
    --table CISS4.CISS_SERVICE_WORKORDER \
    --delete-target-dir \
    --target-dir /test/full_imp/ciss4.ciss_service_workorder \
    --fields-terminated-by "\001" \   #指定數據分割符
    -m 1  #指定并行度
    
  • Step3: 使用Hive查看導入數據表的行數

    create external table test_text(
    line string # 將導入的數據一行作為表中的一列
    )
    location '/test/full_imp/ciss4.ciss_service_workorder';
    select count(*) from test_text;  195825

問題:
Sqoop采集完數據后,HDFS數據中存儲的數據行數跟源數據庫的數據量不符合。

原因:

  • sqoop以文本格式導入數據時,默認的換行符是特殊字符。
  • Oracle中的數據列中如果出現了\n、\r、\t等特殊字符,就會被劃分為多行

Oracle數據:

idnameage
001zhang\nsan18

Sqoop轉換后的數據:

001zhang
san18

Hive表中的數據:

idnameage
001zhang
san18

解決方法:

  • 方案一:
    • 刪除或者替換數據中的換行符
    • Sqoop參數 --hive-drop-import-delims 刪除換行符
    • Sqoop參數 --hive-delims-replacement char 替換換行符

    不建議使用,破壞原始數據結構,ODS層數據盡量抱持原結構

  • 方案二:
    • 采用特殊的存儲格式,AVRO格式

常見的文件格式介紹:

類型介紹
TextFileHive默認的文件格式,最簡單的數據格式,便于查看和編輯,耗費存儲空間,I/O性能較低
SequenceFile含有鍵值對的二進制文件,優化磁盤利用率和I/O,并行操作數據,查詢效率高,但存儲空間消耗最大
AvroFile特殊的二進制文件,設計的主要目標是為了滿足schema evolution,Schema和數據保存在一起
OrcFile列式存儲,Schema存儲在footer中,不支持schema evolution,高度壓縮比并包含索引,查詢速度非常快
ParquetFile列式存儲,與Orc類似,壓縮比不如Orc,但是查詢性能接近,支持的工具更多,通用性更強

Avro格式特點

  • 優點
    • 二進制數據存儲,性能好、效率高
    • 使用JSON描述模式,支持場景更豐富
    • Schema和數據統一存儲,消息自描述(將表中的一行數據作為對象存儲,并且Schema為元數據)
    • 模式定義允許定義數據的排序
  • 缺點
    • 只支持Avro自己的序列化格式
    • 少量列的讀取性能比較差,壓縮比較低
  • 場景:基于行的大規模結構化數據寫入、列的讀取非常多或者Schema變更操作比較頻繁的場景

Sqoop使用Avro格式:

  sqoop import \-Dmapreduce.job.user.classpath.first=true \--connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \--username ciss \--password 123456 \--table CISS4.CISS_SERVICE_WORKORDER \--delete-target-dir \--target-dir /test/full_imp/ciss4.ciss_service_workorder \--as-avrodatafile \    # 選擇文件存儲格式為AVRO--fields-terminated-by "\001" \-m 1

Hive建表指定文件的存儲格式:

create external table test_avro(
line string
)
stored as avro
location '/test/full_imp/ciss4.ciss_service_workorder';

AVRO 數據以 二進制序列化 存儲,字段通過預定義的 模式(Schema) 解析,而非依賴分隔符,即使字段內容包含逗號、換行符等特殊字符,也不會影響數據結構的正確性。
Schema 定義(JSON 格式),明確描述了字段名稱、類型、順序等信息。

四、Sqoop增量采集方案

Sqoop 支持兩種增量模式:

  • append 模式:
    適用于 僅追加數據 的表(如日志表),基于 遞增列(如自增主鍵 id)采集新數據。

  • lastmodified 模式:
    適用于 數據會更新 的表(如用戶表),基于 時間戳列(如 last_update_time)采集新增或修改的數據。

append模式要求源數據表具備自增列,如建表時設置的自增id
lastmodified模式要求源數據表具有時間戳字段。

Append模式:

要求:必須有一列自增的值,按照自增的int值進行判斷

特點:只能導入增加的數據,無法導入更新的數據

場景:數據只會發生新增,不會發生更新的場景

sqoop import \                                   # 執行數據導入操作--connect jdbc:mysql://node3:3306/sqoopTest \  # 連接MySQL數據庫(地址:node3,數據庫名:sqoopTest)--username root \                             # 數據庫用戶名:root--password 123456 \                           # 數據庫密碼:123456--table tb_tohdfs \                           # 要導入的源表:tb_tohdfs--target-dir /sqoop/import/test02 \           # HDFS目標目錄(數據將寫入此路徑)--fields-terminated-by '\t' \                 # 字段分隔符為制表符(\t)--check-column id \                           # 指定增量檢查列:id(通常是自增主鍵)--incremental append \                        # 增量模式為“append”(僅導入新數據)--last-value 0 \                              # 上次導入的id最大值(初始值為0,首次導入id>0的數據)-m 1                                          # 使用1個Map任務(單線程)

appebd模式使用last-value記錄上次導入的數據id最大值,初次導入一般為全量導入,即id>0

此處的last_value需要手動填寫,因此可以使用Sqoop的job管理進行自動記錄。

sqoop job --create my_job -- import ... --incremental append --check-column id --last-value 0
sqoop job --exec my_job  # 自動更新 last-value

lastmodified模式:
要求:必須包含動態時間變化這一列,按照數據變化的時間進行判斷

特點:既導入新增的數據也導入更新的數據

場景:表中的記錄會新增或更新,且每次更新都會修改 lastmode 時間戳。一般無法滿足要求,所以不用。

sqoop import \                                   # 執行數據導入操作--connect jdbc:mysql://node3:3306/sqoopTest \  # 連接MySQL數據庫(地址:node3,數據庫名:sqoopTest)--username root \                             # 數據庫用戶名:root--password 123456 \                           # 數據庫密碼:123456--table tb_lastmode \                         # 要導入的源表:tb_lastmode--target-dir /sqoop/import/test03 \           # HDFS目標目錄(數據將寫入此路徑)--fields-terminated-by '\t' \                 # 字段分隔符為制表符(\t)--incremental lastmodified \                  # 增量模式為“lastmodified”(采集新增或修改的數據)--check-column lastmode \                     # 指定時間戳列:lastmode(記錄數據的更新時間)--last-value '2021-06-06 16:09:32' \          # 上次導入的最大時間值(導入此時間之后的新增/修改數據)-m 1                                          # 使用1個Map任務(單線程)

lastmodified模式使用時間戳記載數據的更新線。

若同一條記錄被多次更新,且 lastmode 時間超過 --last-value,Sqoop 會多次導入該記錄。

解決方案:添加 --merge-key <主鍵列> 參數,合并新舊數據(基于主鍵去重):

 --merge-key id  # 假設 id 是主鍵列

自定義模式:
要求:每次運行的輸出目錄不能相同

特點:自己實現增量的數據過濾,可以實現新增和更新數據的采集

場景:一般用于自定義增量采集每天的分區數據到Hive

sqoop  import \
--connect jdbc:mysql://node3:3306/db_order \
--username root \
--password-file file:///export/data/sqoop.passwd \
--query "select * from tb_order where substring(create_time,1,10) = '2021-09-14' or substring(update_time,1,10) = '2021-09-14' and \$CONDITIONS " \
--delete-target-dir \
--target-dir /nginx/logs/tb_order/daystr=2021-09-14 \
--fields-terminated-by '\t' \
-m 1

自定義模式可以根據設置的sql進行數據導入,因此是最常用的場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78455.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Grok發布了Grok Studio 和 Workspaces兩個強大的功能。該如何使用?如何使用Grok3 API?

最近Grok又更新了幾個功能&#xff1a;Grok Studio 和 Workspaces。 其中 Grok Studio 主要功能包括&#xff1a; 代碼執行&#xff1a;在預覽標簽中運行 HTML 片段、Python、JavaScript 等。 Google Drive 集成&#xff1a;附加并處理 Docs、Sheets、Slides等文件。 協作工…

Vue選項式 API 與組合式 API

選項式 API 與組合式 API 選項式 API 選項式 API 是 Vue 2 中常用的開發方式&#xff0c;在 Vue 3 里依舊得到支持。它把組件邏輯劃分為不同的選項&#xff0c;像 data、methods、computed 等。 <template><div><p>Count: {{ count }}</p><button…

SiamMask中的分類分支、回歸分支與Mask分支,有何本質差異?

SiamMask中的分類分支、回歸分支與Mask分支&#xff0c;有何本質差異&#xff1f; 一、引言二、分支定位與任務目標三、網絡結構與感受野設計3.1 分類分支&#xff08;Classification Head&#xff09;3.2 回歸分支&#xff08;Regression Head&#xff09;3.3 Mask分支&#x…

threejs學習day02

場景、相機、渲染器 一、創建3D場景 // 引入threejs import * as THREE from three// 創建一個三維場景scene const scene new THREE.Scene();// 給三維場景添加物品 const geometry new THREE.BoxGeometry(100,100,100) // 形狀 const meterial new THREE.MeshBasicMat…

K8S Pod 常見數據存儲方案

假設有如下三個節點的 K8S 集群&#xff1a; k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、理論介紹 1.1、Volumes 卷 Kubernetes 的卷是 pod 的?個組成部分&#xff0c;因此像容器?樣在 pod 的規范&#xff08;pod.spec&#x…

【MySQL數據庫】函數操作

目錄 1&#xff0c;日期函數 2&#xff0c;字符串函數 3&#xff0c;數學函數 1&#xff0c;日期函數 樣例&#xff1a; 獲得年月日 select current_date(); 獲取時分秒 select current_time(); 獲得時間戳 select current_timestamp(); 在日期的基礎上加日期 在2025年4月27…

【每日隨筆】文化屬性 ① ( 天機 | 強勢文化與弱勢文化 | 文化屬性的形成與改變 | 強勢文化 具備的特點 )

文章目錄 一、文化屬性1、天機2、文化屬性的強勢文化與弱勢文化強勢文化弱勢文化 二、文化屬性的形成與改變1、文化屬性形成2、文化屬性改變3、文化知識的階層 三、強勢文化 具備的 特點 一、文化屬性 1、天機 如果想要 了解這個世界的 底層架構 , 就需要掌握 洞察事物本質 的能…

【Fifty Project - D18】

感覺自己就不是計劃星球人&#xff0c;雖然fifty project要求每天早上完成一天的計劃&#xff0c;但是對于一個p人腦子&#xff0c;強制自己按照計劃行事真的太難了。我也理解在早晨花費時間做好一天的計劃有很多好處&#xff0c;但是實際行動起來完成率極低。p人的世界里變動太…

Linux系統編程 day11 鎖 (兩天沒有更新了,中期完就休息了)

鎖的注意事項 1、盡量保證鎖的粒度&#xff0c;越小越好。(訪問共享數據前&#xff0c;加鎖&#xff0c;訪問結束后立即解鎖) 2、互斥鎖&#xff0c;本質是結構體&#xff0c;但是可以看成整數&#xff0c;初值為1。(pthread_mutex_init調用成功) 3、加鎖&#xff1a; --操作…

【Maven】特殊pom.xml配置文件 - BOM

文章目錄 特殊pom.xml配置文件 - BOM一、例子二、注意事項1.特殊的子pom.xml文件2.dependencyManagement 特殊pom.xml配置文件 - BOM 僅用于集中管理項目依賴版本 在 Maven 中&#xff0c;BOM 用于定義一個項目的依賴版本的集合&#xff0c;通常用于管理一組共享的依賴版本。這…

《代碼整潔之道》第5章 格式 - 筆記

你應該選擇一套管理代碼格式的簡單規則。如果是團隊&#xff0c;應該選擇一套團隊一致同意采用的簡單格式規則。 最重要的原則&#xff1a;一致性&#xff08;Consistency&#xff09;&#xff01; 沒有完美的格式規范&#xff0c;但有統一的規范。 整個團隊&#xff08;或者…

C++ 類與對象(中)—— 默認成員函數與運算符重載的深度解析:構造函數,析構函數,拷貝構造函數,賦值運算符重載,普通取地址重載,const取地址重載

在 C 中&#xff0c;類的默認成員函數是編譯器自動生成的重要機制&#xff0c;合理利用這些函數可以簡化代碼編寫&#xff0c;同時避免資源管理錯誤。本文將從構造函數、析構函數、拷貝構造函數、賦值運算符重載等核心內容展開&#xff0c;結合具體案例深入解析。 一、默認成員…

【KWDB創作者計劃】_企業級多模數據庫實戰:用KWDB實現時序+關系數據毫秒級融合(附代碼、性能優化與架構圖)

一、技術背景與行業痛點 1.1 多模數據融合挑戰 場景痛點&#xff1a; 工業物聯網設備每秒產生百萬級傳感器數據&#xff08;時序數據&#xff09;。需關聯設備檔案&#xff08;關系數據&#xff09;生成設備健康報告&#xff0c;傳統方案需多數據庫跳轉&#xff0c;延遲>5…

w~嵌入式C語言~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870376 一、STM32怎么選型 什么是 STM32 STM32&#xff0c;從字面上來理解&#xff0c;ST是意法半導體&#xff0c;M是Microelectronics的縮寫&#xff0c;32表示32位&#xff0c;合起來理解&#xff0c;STM32就是指S…

Multisim使用教程詳盡版--(2025最新版)

一、Multisim14前言 1.1、主流電路仿真軟件 1. Multisim&#xff1a;NI開發的SPICE標準仿真工具&#xff0c;支持模擬/數字電路混合仿真&#xff0c;內置豐富的元件庫和虛擬儀器&#xff08;示波器、頻譜儀等&#xff09;&#xff0c;適合教學和競賽設計。官網&#xff1a;艾…

分布式理論和事務

微服務和分布式 微服務 是一種軟件架構風格&#xff0c;它將應用程序拆分成一系列小型、獨立的服務&#xff0c;每個服務專注于單一功能&#xff0c;彼此通過輕量級通信機制&#xff08;如 API&#xff09;進行交互。微服務通常是松耦合的&#xff0c;可以獨立開發、部署和擴展…

JAVA:紅黑樹應用的技術指南

&#x1f333; 1、簡述 紅黑樹是一種自平衡二叉查找樹&#xff08;Self-Balancing Binary Search Tree&#xff09;&#xff0c;被廣泛應用于操作系統調度、Java集合、數據庫索引等核心模塊中。本文將從 基本原理 入手&#xff0c;結合 實際應用場景與代碼實例&#xff0c;帶你…

【Pandas】pandas DataFrame rfloordiv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于執行 DataFrame 與另一個對象&#xff08;如 DataFrame、Series 或標量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于執行 DataFrame 與另一個對象&…

【數據可視化-26】基于人口統計與社會經濟數據的多維度可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

WinForm真入門(18)——DateTimePicker?控件解析

一、基本概念? ?DateTimePicker? 是 Windows 窗體中用于選擇日期和時間的控件&#xff0c;支持以下交互方式&#xff1a; 通過下拉日歷選擇日期通過上下按鈕調整時間直接輸入日期或時間 適用于需要規范日期格式、限制日期范圍或快速輸入的場景&#xff08;如預約系統、數據…