Linux環境Sqoop安裝配置及使用

YBCarry發表於2019-03-09

Linux環境Sqoop安裝配置及使用

1. 認識Sqoop

(1) Sqoop介紹

  • 資料遷移工具(等價於mapreduce的map階段)
  • 過程:資料匯入-->處理-->資料匯出
  • 作用:簡化開發
  • 官網:http://sqoop.apache.org/
  • 概述:Apache Sqoop是一種工具,用於在Apache Hadoop和結構化資料儲存(如關聯式資料庫)之間高效傳輸批量資料——資料遷移。

2. sqoop-1.4.7安裝配置流程

(1) Sqoop環境前提:

  • Hadoop
  • 關係型資料庫(MySQL/Oracle)
  • HBase
  • Hive
  • ZooKeeper

(2) 解壓sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz安裝包到目標目錄下:

  • tar -zxvf .tar.gz -C 目標目錄

(3) 為後續方便,重新命名Sqoop資料夾:

  • mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7

(4) 修改配置檔案:

  • 進入sqoop-1.4.7/conf路徑,重新命名配置檔案:
    • mv sqoop-env-template.sh sqoop-env.sh
  • 修改sqoop-env.sh資訊:(若配置了環境變數,可通過echo $XXXXX_HOME查詢安裝位置)
    • vi sqoop-env.sh
    • #Set path to where bin/hadoop is available
      export HADOOP_COMMON_HOME=Hadoop安裝路徑
      
      #Set path to where hadoop-*-core.jar is available
      #export HADOOP_MAPRED_HOME=Hadoop安裝路徑
      
      #set the path to where bin/hbase is available
      #export HBASE_HOME=HBase安裝路徑
      
      #Set the path to where bin/hive is available
      #export HIVE_HOME=Hive安裝路徑
      
      #Set the path for where zookeper config dir is
      #export ZOOCFGDIR=ZooKeeper 配置資料夾 路徑
      複製程式碼

(5) 關聯Hive:

  • cp /XXX/hive/conf/hive-site.xml /XXX/sqoop-1.4.7/conf/

(5) 配置環境變數:

  • 修改配置檔案:
    • vi /etc/profile
  • 增加以下內容:
    • export SQOOP_HOME=sqoop安裝路徑
    • export PATH=$PATH:$SQOOP_HOME/bin
  • 宣告環境變數:
    • source /etc/profile

(6) 啟動檢視版本號

  • sqoop version

(7) 新增驅動:

  • 匯入MySQL驅動到sqoop/lib下
  • 匯入Oracle驅動到sqoop/lib下

3. Sqoop操作

(1) 常用引數:

  • 引數檢視:Sqoop官網 -> documentation -> Sqoop User Guide

  • import 匯入資料到叢集
  • export 從叢集匯出資料
  • create-hive-table 建立hive表
  • import-all-tables 指定關係型資料庫所有表到叢集
  • list-databases 列出所有資料庫
  • list-tables 列出所有資料庫表
  • merge 合併資料
  • codegen 獲取某張表資料生成JavaBean並打Jar包

(2) import——Sqoop的匯入操作:

  • 功能:MySQL/Oracle --> HDFS/Hive
  • 修改MySQL訪問許可權:
    • 檢視許可權:
      • use mysql;
      • select User, Host, Password from user;
    • 修改許可權為所有使用者都可訪問:
      • update user set host='%' where host='localhost';
      • delete from user where Host='127.0.0.1';
      • delete from user where Host='bigdata01';
      • delete from user where Host='::1';
      • flush privileges;
  • 操作命令:
    • 本地mysql表上傳至hdfs:
      • 匯出命令:
        • sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 # 連線MySQL --username root # 使用者名稱 --password XXXXXX # 密碼 --table 表名 # 上傳至HDFS的表 --target-dir /YYYYYYY # HDFS目標資料夾 --num-mappers 1 # 指定map執行 --fields-terminated-by "\t" # 指定分隔符
      • Linux本地檢視hdfs上傳結果:
        • hdfs dfs -cat /XXXXXXX/part-m-00000
      • 使用query對資料進行過濾:
        • sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password XXXXXX --table 表名 --target-dir /YYYYYYY --num-mappers 1 --fields-terminated-by "\t" --query 'select * from 表名 where 條件 and $CONDITIONS' # $CONDITIONS 對mapper進行索引
      • 直接過濾欄位:
        • sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password XXXXXX --table 表名 --target-dir /YYYYYYY --num-mappers 1 --columns 欄位名
    • 本地mysql表上傳至hive:
      • 準備工作:
        • 開啟hive服務
        • 在hive中建立好要匯入的對應表
      • 匯入命令:
        • sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password 密碼 --table 表名 --num-mappers 1 --hive-import --fields-terminated-by "\t" --hive-overwrite --hive-table hive資料庫名.表名
        • 在Hive中可以看到指定表中已傳入資料資訊
        • 可能報錯1:
          • ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
          • 報錯原因:hive環境變數配置缺失
          • 解決方法:——Hadoop環境加入Hive依賴
            • 修改配置檔案:
              • vi /etc/profile
            • 增加以下內容:
              • export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
            • 宣告環境變數:
              • source /etc/profile
        • 可能報錯2:
          • ERROR tool.ImportTool: Import failed: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://bigdata01:9000/XXXXXXXXXX already exists
          • 報錯原因:hdfs中存在同名路徑
          • 解決方法:
            • 指定新路徑或者刪除hdfs中原檔案
        • 可能報錯3:
          • FAILED: SemanticException [Error 10072]: Database does not exist: XXXXXXXX
          • 報錯原因:Sqoop沒有關聯Hive
          • 解決方法:
            • cp /XXX/hive/conf/hive-site.xml /XXX/sqoop-1.4.7/conf/

(3) emport——Sqoop的匯出操作:

  • 功能:HDFS/Hive --> MySQL/Oracle
  • 操作命令:
    • hive表匯出至本地mysql:
      • 匯出命令:
        • sqoop emport --connect jdbc:mysql://bigdata01:3306/資料庫名 # 連線MySQL --username root # 使用者名稱 --password XXXXXX # 密碼 --table 表名 # 目標mysql表 --export-dir /user/hive/warehouse/YYYYYYY # hive資料夾 --num-mappers 1 # 指定map執行 --input-fields-terminated-by "\t" # 指定分隔符

(4) 列出所有資料庫:

  • 操作命令:
    • sqoop list-databases --connect jdbc:mysql://bigdata01:3306/ --username root --password 密碼

(5) 獲取資料庫表資料生成JavaBean:

  • 操作命令:
    • sqoop codegen --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password 密碼 --table 表名 -- bindir Linux本地路徑 # 指定Jar包打包路徑 --class-name 類名 # 指定Java類名 --fields-terminated-by "\t"

(6) 合併hdfs中不同目錄下的資料:

  • 操作命令:
    • sqoop merge --new-data hdfs新表路徑 --onto hdfs舊錶路徑 --target-dir /YYYYYYY # 合併後的hdfs路徑 --jar-file = # Linux本地Jar包路徑 --class-name XXXXX # Jar包的類 --merge-key id # 合併依據
  • **注意:**merge操作是一個新表替代舊錶的操作,如果有衝突id的話新表資料替換舊錶資料,如果沒有衝突則是新表資料新增到舊錶的資料。

相關文章