Sqoop學習

来源:https://www.cnblogs.com/jifengblog/archive/2018/07/13/9302642.html
-Advertisement-
Play Games

目錄 一、概述 二、工作機制 三、安裝 1、前提概述 2、軟體下載 3、安裝步驟 四、Sqoop的基本命令 基本操作 示例 五、Sqoop的數據導入 1、從RDBMS導入到HDFS中 2、把MySQL資料庫中的表數據導入到Hive中 3、把MySQL資料庫中的表數據導入到hbase 目錄 一、概述 ...


目錄

 

正文

回到頂部

一、概述

  sqoop 是 apache 旗下一款“Hadoop 和關係資料庫伺服器之間傳送數據”的工具。

  核心的功能有兩個:

    導入、遷入

    導出、遷出

  導入數據:MySQL,Oracle 導入數據到 Hadoop 的 HDFS、HIVE、HBASE 等數據存儲系統

  導出數據:從 Hadoop 的文件系統中導出數據到關係資料庫 mysql 等 Sqoop 的本質還是一個命令行工具,和 HDFS,Hive 相比,並沒有什麼高深的理論。

  sqoop:

    工具:本質就是遷移數據, 遷移的方式:就是把sqoop的遷移命令轉換成MR程式

  hive

    工具,本質就是執行計算,依賴於HDFS存儲數據,把SQL轉換成MR程式

回到頂部

二、工作機制

  將導入或導出命令翻譯成 MapReduce 程式來實現 在翻譯出的 MapReduce 中主要是對 InputFormat 和 OutputFormat 進行定製

回到頂部

三、安裝

  1、前提概述

    將來sqoop在使用的時候有可能會跟那些系統或者組件打交道?

    HDFS, MapReduce, YARN, ZooKeeper, Hive, HBase, MySQL

  sqoop就是一個工具, 只需要在一個節點上進行安裝即可。

 

補充一點: 如果你的sqoop工具將來要進行hive或者hbase等等的系統和MySQL之間的交互

 

你安裝的SQOOP軟體的節點一定要包含以上你要使用的集群或者軟體系統的安裝包

 

補充一點: 將來要使用的azakban這個軟體 除了會調度 hadoop的任務或者hbase或者hive的任務之外, 還會調度sqoop的任務

 

azkaban這個軟體的安裝節點也必須包含以上這些軟體系統的客戶端/2、

  2、軟體下載

    下載地址http://mirrors.hust.edu.cn/apache/

    sqoop版本說明

      絕大部分企業所使用的sqoop的版本都是 sqoop1

      sqoop-1.4.6 或者 sqoop-1.4.7 它是 sqoop1

      sqoop-1.99.4----都是 sqoop2

      此處使用sqoop-1.4.6版本sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

  3、安裝步驟

    (1)上傳解壓縮安裝包到指定目錄

  因為之前hive只是安裝在hadoop3機器上,所以sqoop也同樣安裝在hadoop3機器上

[hadoop@hadoop3 ~]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C apps/

    (2)進入到 conf 文件夾,找到 sqoop-env-template.sh,修改其名稱為 sqoop-env.sh cd conf

複製代碼
[hadoop@hadoop3 ~]$ cd apps/
[hadoop@hadoop3 apps]$ ls
apache-hive-2.3.3-bin  hadoop-2.7.5  hbase-1.2.6  sqoop-1.4.6.bin__hadoop-2.0.4-alpha  zookeeper-3.4.10
[hadoop@hadoop3 apps]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop-1.4.6
[hadoop@hadoop3 apps]$ cd sqoop-1.4.6/conf/
[hadoop@hadoop3 conf]$ ls
oraoop-site-template.xml  sqoop-env-template.sh    sqoop-site.xml
sqoop-env-template.cmd    sqoop-site-template.xml
[hadoop@hadoop3 conf]$ mv sqoop-env-template.sh sqoop-env.sh
複製代碼

    (3)修改 sqoop-env.sh

[hadoop@hadoop3 conf]$ vi sqoop-env.sh 
複製代碼
export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.5

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

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

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

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
複製代碼

  為什麼在sqoop-env.sh 文件中會要求分別進行 common和mapreduce的配置呢???

在apache的hadoop的安裝中;四大組件都是安裝在同一個hadoop_home中的

但是在CDH, HDP中, 這些組件都是可選的。

在安裝hadoop的時候,可以選擇性的只安裝HDFS或者YARN,

CDH,HDP在安裝hadoop的時候,會把HDFS和MapReduce有可能分別安裝在不同的地方。

    (4)加入 mysql 驅動包到 sqoop1.4.6/lib 目錄下

[hadoop@hadoop3 ~]$ cp mysql-connector-java-5.1.40-bin.jar apps/sqoop-1.4.6/lib/

    (5)配置系統環境變數

[hadoop@hadoop3 ~]$ vi .bashrc 
#Sqoop
export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin

  保存退出使其立即生效

[hadoop@hadoop3 ~]$ source .bashrc 

    (6)驗證安裝是否成功

   sqoop-version 或者 sqoop version

回到頂部

四、Sqoop的基本命令

  基本操作

  首先,我們可以使用 sqoop help 來查看,sqoop 支持哪些命令

複製代碼
[hadoop@hadoop3 ~]$ sqoop help
Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/04/12 13:37:19 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.
[hadoop@hadoop3 ~]$ 
複製代碼

  然後得到這些支持了的命令之後,如果不知道使用方式,可以使用 sqoop command 的方式 來查看某條具體命令的使用方式

  示例

  列出MySQL數據有哪些資料庫

複製代碼
[hadoop@hadoop3 ~]$ sqoop list-databases \
> --connect jdbc:mysql://hadoop1:3306/ \
> --username root \
> --password root
Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/04/12 13:43:51 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
18/04/12 13:43:51 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/04/12 13:43:51 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hivedb
mysql
performance_schema
test
[hadoop@hadoop3 ~]$ 
複製代碼

  列出MySQL中的某個資料庫有哪些數據表:


[hadoop@hadoop3 ~]$ sqoop list-tables \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root

 

 View Code

  創建一張跟mysql中的help_keyword表一樣的hive表hk:

複製代碼
sqoop create-hive-table \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hive-table hk
複製代碼

 

回到頂部

五、Sqoop的數據導入

  “導入工具”導入單個表從 RDBMS 到 HDFS。表中的每一行被視為 HDFS 的記錄。所有記錄 都存儲為文本文件的文本數據(或者 Avro、sequence 文件等二進位數據) 

  1、從RDBMS導入到HDFS中

  語法格式

sqoop import (generic-args) (import-args)

  常用參數

複製代碼
--connect <jdbc-uri> jdbc 連接地址
--connection-manager <class-name> 連接管理者
--driver <class-name> 驅動類
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--help help 信息
-P 從命令行輸入密碼
--password <password> 密碼
--username <username> 賬號
--verbose 列印流程信息
--connection-param-file <filename> 可選參數
複製代碼

  示例

  普通導入:導入mysql庫中的help_keyword的數據到HDFS上

  導入的預設路徑:/user/hadoop/help_keyword

複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/mysql   \
--username root  \
--password root   \
--table help_keyword   \
-m 1
複製代碼

  查看導入的文件

[hadoop@hadoop4 ~]$ hadoop fs -cat /user/hadoop/help_keyword/part-m-00000

 

  導入: 指定分隔符和導入路徑

 

複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/mysql   \
--username root  \
--password root   \
--table help_keyword   \
--target-dir /user/hadoop11/my_help_keyword1  \
--fields-terminated-by '\t'  \
-m 2
複製代碼

 

  導入數據:帶where條件

複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/mysql   \
--username root  \
--password root   \
--where "name='STRING' " \
--table help_keyword   \
--target-dir /sqoop/hadoop11/myoutport1  \
-m 1
複製代碼

 

  查詢指定列

複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/mysql   \
--username root  \
--password root   \
--columns "name" \
--where "name='STRING' " \
--table help_keyword  \
--target-dir /sqoop/hadoop11/myoutport22  \
-m 1
selct name from help_keyword where name = "string"
複製代碼

 

  導入:指定自定義查詢SQL

複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/  \
--username root  \
--password root   \
--target-dir /user/hadoop/myimport33_1  \
--query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \
--split-by  help_keyword_id \
--fields-terminated-by '\t'  \
-m 4
複製代碼

 

  在以上需要按照自定義SQL語句導出數據到HDFS的情況下:
    1、引號問題,要麼外層使用單引號,內層使用雙引號,$CONDITIONS的$符號不用轉義, 要麼外層使用雙引號,那麼內層使用單引號,然後$CONDITIONS的$符號需要轉義
    2、自定義的SQL語句中必須帶有WHERE \$CONDITIONS

  2、把MySQL資料庫中的表數據導入到Hive中

  Sqoop 導入關係型數據到 hive 的過程是先導入到 hdfs,然後再 load 進入 hive

  普通導入:數據存儲在預設的default hive庫中,表名就是對應的mysql的表名:

複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/mysql   \
--username root  \
--password root   \
--table help_keyword   \
--hive-import \
-m 1
複製代碼

  導入過程

第一步:導入mysql.help_keyword的數據到hdfs的預設路徑
第二步:自動仿造mysql.help_keyword去創建一張hive表, 創建在預設的default庫中
第三步:把臨時目錄中的數據導入到hive表中

  查看數據

[hadoop@hadoop3 ~]$ hadoop fs -cat /user/hive/warehouse/help_keyword/part-m-00000

  指定行分隔符和列分隔符,指定hive-import,指定覆蓋導入,指定自動創建hive表,指定表名,指定刪除中間結果數據目錄

複製代碼
sqoop import  \
--connect jdbc:mysql://hadoop1:3306/mysql  \
--username root  \
--password root  \
--table help_keyword  \
--fields-terminated-by "\t"  \
--lines-terminated-by "\n"  \
--hive-import  \
--hive-overwrite  \
--create-hive-table  \
--delete-target-dir \
--hive-database  mydb_test \
--hive-table new_help_keyword
複製代碼

   報錯原因是hive-import 當前這個導入命令。 sqoop會自動給創建hive的表。 但是不會自動創建不存在的庫

  手動創建mydb_test數據塊

hive> create database mydb_test;
OK
Time taken: 6.147 seconds
hive> 

  之後再執行上面的語句沒有報錯

  查詢一下

select * from new_help_keyword limit 10;

 

  上面的導入語句等價於

複製代碼
sqoop import  \
--connect jdbc:mysql://hadoop1:3306/mysql  \
--username root  \
--password root  \
--table help_keyword  \
--fields-terminated-by "\t"  \
--lines-terminated-by "\n"  \
--hive-import  \
--hive-overwrite  \
--create-hive-table  \ 
--hive-table  mydb_test.new_help_keyword  \
--delete-target-dir
複製代碼

  增量導入

  執行增量導入之前,先清空hive資料庫中的help_keyword表中的數據

truncate table help_keyword;
複製代碼
sqoop import   \
--connect jdbc:mysql://hadoop1:3306/mysql   \
--username root  \
--password root   \
--table help_keyword  \
--target-dir /user/hadoop/myimport_add  \
--incremental  append  \
--check-column  help_keyword_id \
--last-value 500  \
-m 1
複製代碼

  語句執行成功

   查看結果

  3、把MySQL資料庫中的表數據導入到hbase

   普通導入

複製代碼
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family person \
--hbase-row-key help_keyword_id
複製代碼

 

  此時會報錯,因為需要先創建Hbase裡面的表,再執行導入的語句

 

hbase(main):001:0> create 'new_help_keyword', 'base_info'
0 row(s) in 3.6280 seconds

=> Hbase::Table - new_help_keyword
hbase(main):002:0> 

 

 

轉自:扎心了,老鐵  https://www.cnblogs.com/qingyunzong/p/8807252.html#_label0

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Question: Recently I have to use the RHEL and need to config the network with a few NICs. Here comes the question: What's the network bonding and How ...
  • 0.引言 最近打算將現有項目的 Docker 部署到阿裡雲上面,但是之前是單機部署,現在阿裡雲上面有 3 台機器,所以想做一個 Docker 集群。之前考慮是用 Docker Swarm 來做這個事情的,不過後面看了一下現在 K8S 用的比較多,進而想在這三台機器上部署 K8S 集群。 下麵附上 K ...
  • Windows : ping -S Linux : ping -I <device> -I interface interface is either an address, or an interface name. If interface is an address, it sets sour ...
  • 1.首先檢查gcc編譯器安裝了沒 2.首先安裝必要的庫(nginx 中gzip模塊需要 zlib 庫,rewrite模塊需要 pcre 庫,ssl 功能需要openssl庫),檢查一下是否已經安裝了(兩種檢查方法): 3.安裝Nginx 使用源碼編譯安裝 拷貝鏈接 http://nginx.org/ ...
  • 假設原用戶名老王,已刪除,但是cmd後路徑還是C:\Users\老王>,這與現在用戶laowng不一致了需改為C:\Users\laowang>。 1.先新建一個管理員賬戶laowang,然後登陸laowang這個賬戶; 2.重命名 c:\Users\老王 為 c:\Users\laowang; 3 ...
  • linux ping之後一直執行,那麼怎麼退出呢? 1、按Ctrl + C鍵中斷ping命令運行即可。 2、使用ping命令的-c參數,指明發送數據報文的次數,如下圖所示,只發送4次報文,發送完畢自動退出 ...
  • 1.查詢數據表的所有列: select * from 表名; 程式員正常用法:select 列名,列名... form 表名; 2.起別名: select 列名 [AS 別名],列名 別名...from 表名; --正常SELECT ename as 員工姓名,sal From emp; 別名是關鍵 ...
  • 表level,其主鍵為lid 1.select max(id) from table 查詢語句:SELECT MAX(lid) FROM LEVEL 返回插入主鍵 2.select LAST_INSERT_ID(id) from table 查詢語句:SELECT LAST_INSERT_ID(li ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...