萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

使用 Sqoop 將 MySQL 數據導入 Hive 的完整實戰指南

前言

Apache Sqoop 是 Hadoop 生態系統中用於在關係型數據庫(如 MySQL)與 Hadoop(HDFS、Hive、HBase)之間高效傳輸數據的工具。本文將通過一個完整的實例,詳細演示如何使用 Sqoop 將 MySQL 表數據直接導入 Hive 表中,並解析關鍵參數與常見日誌輸出。

環境準備

  • Hadoop 叢集已正常運行
  • Hive 服務可用(元數據庫正常)
  • MySQL 數據庫可訪問,並已建立目標表(本例為 toplists 庫下的 award 表)
  • Sqoop 客戶端已安裝並配置好 Hadoop、Hive 的類路徑

核心導入命令詳解

以下命令將 MySQL 的 award 表全量導入 Hive,並在 Hive 中自動建立同名表 mysql_award:

sqoop import \
  --connect jdbc:mysql://Hadoop48/toplists \
  --username root \
  --table award \
  --hive-import \
  --create-hive-table \
  --hive-table mysql_award \
  --fields-terminated-by '\t' \
  --lines-terminated-by '\n' \
  --hive-overwrite \
  --direct \
  -m 1 \
  --verbose

關鍵參數說明

參數作用
--hive-import指定將數據導入 Hive
--create-hive-table若 Hive 表不存在則自動建立
--hive-table指定 Hive 表名(含庫前綴可選)
--fields-terminated-by字段分隔符,此處為 Tab(\t)
--lines-terminated-by行分隔符,此處為換行(\n)
--hive-overwrite覆蓋 Hive 表中現有數據
--direct使用 MySQL 原生 mysqldump 加速導入
-m 1指定 MapReduce 任務並行度為 1(適合小表)

執行日誌關鍵階段解析

1. 代碼生成與編譯

Sqoop 會根據表結構生成 Java 類並編譯打包:

INFO tool.CodeGenTool: Beginning code generation
INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-.../award.jar

2. 使用 mysqldump 快速路徑

因加了 --direct,啟用 MySQL 專用快速導入通道:

INFO manager.DirectMySQLManager: Beginning mysqldump fast path import

3. MapReduce 作業提交與進度

提交 MR 作業,顯示 Map 進度:

INFO mapred.JobClient: Running job: job_201207191159_0322
INFO mapred.JobClient:  map 0% reduce 0%
INFO mapred.JobClient:  map 100% reduce 0%

4. 作業完成與計數器

作業成功結束,顯示讀寫位元組、記錄數等統計:

INFO mapreduce.ImportJobBase: Transferred 208 bytes in 20.349 seconds (10.2216 bytes/sec)
INFO mapreduce.ImportJobBase: Retrieved 44 records.

5. Hive 載入階段

Sqoop 自動調用 Hive CLI 將 HDFS 上的臨時數據載入 Hive 倉庫:

INFO hive.HiveImport: Loading uploaded data into Hive
INFO hive.HiveImport: Loading data to table default.mysql_award
INFO hive.HiveImport: Hive import complete.

驗證導入結果

進入 Hive CLI 執行查詢:

hive> select * from mysql_award;

輸出示例(已脫敏):

OK
2012-04-27 06:55:00:402713629   5947   433203828   2   4027102 402713629   1001   NULL   715878221 殺破天A ios
2012-04-04-27 06:55:00:406788559   778    433203930   19  4017780 406788559   1001   1      13835155880 親牛牛旦旦 android
Time taken: 0.368 seconds

由於數據庫與 Hive 均使用 UTF-8 編碼,中文欄位無亂碼問題。

常見問題與優化建議

  • 編碼不一致:確保 MySQL 連接串加上 ?characterEncoding=utf8,Hive 表建立時指定 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE。
  • 大表分區導入:去掉 -m 1,改用 --split-by 指定數值型主鍵並行導入;或使用 --where 分批次增量同步。
  • 字段類型映射:Sqoop 會自動映射 MySQL 類型到 Hive 類型,特殊類型(如 BIT、GEOMETRY)需手動處理。
  • 權限問題:執行用戶需具備 Hive 倉庫目錄(/user/hive/warehouse)寫權限。

總結

本文通過完整命令、日誌解析與結果驗證,展示了 Sqoop 將 MySQL 數據導入 Hive 的標準流程。掌握核心參數與日誌關鍵點,能幫助你快速排查導入失敗、優化大表遷移效率,實現關係型數據倉庫到數據湖的無縫對接。

copyright © 萬盛學電腦網 all rights reserved