主頁 >  其他 > 大資料高級開發工程師——大資料相關工具之一 Sqoop

大資料高級開發工程師——大資料相關工具之一 Sqoop

2022-01-04 09:37:03 其他

文章目錄

  • 大資料相關工具
    • Sqoop ETL工具
      • Sqoop簡介
      • Sqoop1與Sqoop2架構對比
      • Sqoop安裝部署
      • Sqoop的資料匯入
        • 1. 列出所有資料庫
        • 2. 準備表資料
        • 3. 匯入資料庫表資料到HDFS
        • 4. 匯入到HDFS指定目錄
        • 5. 匯入到hdfs指定目錄并指定欄位之間的分隔符
        • 6. 匯入關系表到HIVE
        • 7. 匯入關系表到hive并自動創建hive表
        • 8. 將mysql表資料匯入到hbase當中去
        • 9. 匯入表資料子集
        • 10. sql陳述句查找匯入hdfs
        • 11. 增量匯入
      • Sqoop的資料匯出
        • 1. 將資料從HDFS把檔案匯出到RDBMS資料庫
      • Sqoop常用命令及引數詳解
        • 1. 常用命令串列
        • 2. 資料庫連接公共引數
        • 3. import 公共引數
        • 4. export 公共引數
        • 5. hive 公共引數
        • 6. import 特有引數
        • 7. export 特有引數
        • 8. codegen 特有引數
        • 9. create-hive-table 特有引數
        • 10. eval 特有引數
        • 11. import-all-tables 特有引數
        • 12. job 特有引數
        • 13. list-databases 特有引數
        • 14. list-tables 特有引數
        • 15. merge 特有引數
        • 16. metastore 特有引數
      • Sqoop作業
        • 1. 語法
        • 2. 創建作業(--create)
        • 3. 驗證作業 (--list)
        • 4. 檢查作業(--show)
        • 5. 執行作業 (--exec)

大資料相關工具

Sqoop ETL工具

Sqoop簡介

  • Sqoop是apache旗下的一款 ”Hadoop和關系資料庫之間傳輸資料”的工具
    • 匯入資料:將 MySQL、Oracle 匯入資料到 Hadoop 的 HDFS、HIVE、HBASE 等資料存盤系統
    • 匯出資料:從 Hadoop 的檔案系統中匯出資料到關系資料庫

在這里插入圖片描述

  • 作業機制:
    • 將匯入和匯出的命令翻譯成mapreduce程式實作
    • 在翻譯出的mapreduce中主要是對inputformat和outputformat進行定制

Sqoop1與Sqoop2架構對比

sqoop在發展中的程序中演進出來了兩種不同的架構——架構演變史

  • Sqoop1 架構:
    • 版本號:1.4.x
    • 使用 sqoop 客戶端直接提交方式,CLI 控制臺進行訪問
    • 安全性:命令或腳本中指定用戶資料庫名及密碼

在這里插入圖片描述

  • Sqoop2 架構:
    • 版本號:1.99.x
    • 引入了sqoop server,對connector實作了集中的管理,可以通過 REST API、 JAVA API、 WEB UI 以及CLI 控制臺方式進行訪問

在這里插入圖片描述

比較Sqoop1Sqoop2
架構僅僅使用一個 Sqoop 客戶端引入了 Sqoop Server 集中化管理連接,以及 rest api、web ui,引入安全機制
部署簡單,使用 root 權限安裝,連接器必須符合 JDBC架構稍復雜,配置部署更加繁瑣
使用命令方式容易出錯,格式緊耦合,無法支持所有資料型別,安全機制不夠完善,容易暴露密碼多種互動方式:命令列、WebUI、REST API,連接集中管理,完善的權限管理機制,connector僅僅負責資料的讀寫,

Sqoop安裝部署

  • Sqoop安裝很簡單,解壓好進行簡單的修改就可以使用
  • 安裝包下載&解壓
wget http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
# 解壓
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /bigdata/install/
  • 修改組態檔:
cd /bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0/conf
mv sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh

# 根據自己實際的安裝目錄填寫
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/bigdata/install/hadoop-3.1.4
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/bigdata/install/hadoop-3.1.4
#set the path to where bin/hbase is available
export HBASE_HOME=/bigdata/install/hbase-2.2.6
#Set the path to where bin/hive is available
export HIVE_HOME=/bigdata/install/hive-3.1.2
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/apps/zookeeper-3.4.14/conf
  • 添加兩個必要的jar包:將 java-json.jarmysql-connector-java-5.1.38.jar 拷貝到sqoop的lib目錄下
scp java-json.jar mysql-connector-java-5.1.38.jar hadoop@node03:/bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0/lib
  • 配置 sqoop 的環境變數
sudo vim /etc/profile

export SQOOP_HOME=/bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$SQOOP_HOME/bin

source /etc/profile
  • 執行命令sqoop help 命令,有warning日志

在這里插入圖片描述

  • 解決方案:
# pwd = /bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0
vim bin/configure-sqoop

在這里插入圖片描述

  • 再次執行命令sqoop help 命令,一切正常啦!

在這里插入圖片描述

Sqoop的資料匯入

1. 列出所有資料庫

# 列出node03主機所有的資料庫
sqoop list-databases --connect jdbc:mysql://node03:3306/ --username root --password 123456
# 查看某一個資料庫下面的所有資料表
sqoop list-tables --connect jdbc:mysql://node03:3306/mysql --username root --password 123456

在這里插入圖片描述

2. 準備表資料

  • 初始化資料:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`userdb` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `userdb`;

DROP TABLE IF EXISTS `emp`;

CREATE TABLE `emp` (
  `id` INT(11) DEFAULT NULL,
  `name` VARCHAR(100) DEFAULT NULL,
  `deg` VARCHAR(100) DEFAULT NULL,
  `salary` INT(11) DEFAULT NULL,
  `dept` VARCHAR(10) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;

INSERT  INTO `emp`(`id`,`name`,`deg`,`salary`,`dept`) VALUES (1201,'gopal','manager',50000,'TP'),(1202,'manisha','Proof reader',50000,'TP'),(1203,'khalil','php dev',30000,'AC'),(1204,'prasanth','php dev',30000,'AC'),(1205,'kranthi','admin',20000,'TP');

DROP TABLE IF EXISTS `emp_add`;

CREATE TABLE `emp_add` (
  `id` INT(11) DEFAULT NULL,
  `hno` VARCHAR(100) DEFAULT NULL,
  `street` VARCHAR(100) DEFAULT NULL,
  `city` VARCHAR(100) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;

INSERT  INTO `emp_add`(`id`,`hno`,`street`,`city`) VALUES (1201,'288A','vgiri','jublee'),(1202,'108I','aoc','sec-bad'),(1203,'144Z','pgutta','hyd'),(1204,'78B','old city','sec-bad'),(1205,'720X','hitec','sec-bad');

DROP TABLE IF EXISTS `emp_conn`;
CREATE TABLE `emp_conn` (
  `id` INT(100) DEFAULT NULL,
  `phno` VARCHAR(100) DEFAULT NULL,
  `email` VARCHAR(100) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;

INSERT  INTO `emp_conn`(`id`,`phno`,`email`) VALUES (1201,'2356742','gopal@tp.com'),(1202,'1661663','manisha@tp.com'),(1203,'8887776','khalil@ac.com'),(1204,'9988774','prasanth@ac.com'),(1205,'1231231','kranthi@tp.com');
  • 查看資料:

在這里插入圖片描述

3. 匯入資料庫表資料到HDFS

  • 使用sqoop命令匯入、匯出資料前,要先啟動hadoop集群,下面的命令用于從MySQL資料庫服務器中的emp表匯入HDFS:
sqoop import --connect jdbc:mysql://node03:3306/userdb --password 123456 --username root --table emp -m 1
# 引數`--m 1`,表示只啟動一個map task進行資料的匯入
  • 為了驗證在HDFS匯入的資料,可以使用以下命令查看匯入的資料
hdfs dfs -ls /user/hadoop/emp

Found 2 items
-rw-r--r--   3 hadoop supergroup          0 2022-01-01 21:35 /user/hadoop/emp/_SUCCESS
-rw-r--r--   3 hadoop supergroup        381 2022-01-01 21:35 /user/hadoop/emp/part-m-00000
  • 也可以到 hadoop web 頁面查看:

在這里插入圖片描述

  • 如果要開啟多個map task的話,需要在命令中添加--split-by column-name,如下,其中map個數為4
sqoop import --connect jdbc:mysql://node03:3306/userdb --password 123456 --username root --table emp -m 4 --split-by id

4. 匯入到HDFS指定目錄

  • 在匯入表資料到HDFS使用Sqoop匯入工具,我們可以指定目標目錄,
  • 使用引數 --target-dir 來指定匯出目的地,使用引數 --delete-target-dir 來判斷匯出目錄是否存在,如果存在就刪掉
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp -m 1
  • 查看匯出資料
hdfs dfs -text /sqoop/emp/part-m-00000

# 它會用逗號(,)分隔emp表的資料和欄位
1201,gopal,manager,50000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1202,manisha,Proof reader,50000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1203,khalil,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1204,prasanth,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1205,kranthi,admin,20000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1

5. 匯入到hdfs指定目錄并指定欄位之間的分隔符

  • 使用引數 --fields-terminated-by 指定分隔符
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp2 -m 1 --fields-terminated-by '\t'
  • 再查看資料
hdfs dfs -text /sqoop/emp2/part-m-00000

# 它會用(\t)分隔emp表的資料和欄位
1201	gopal	manager	50000	TP	2022-01-01 21:30:39.0	2022-01-01 21:30:39.0	1
1202	manisha	Proof reader	50000	TP	2022-01-01 21:30:39.0	2022-01-01 21:30:39.0	1
1203	khalil	php dev	30000	AC	2022-01-01 21:30:39.0	2022-01-01 21:30:39.0	1
1204	prasanth	php dev	30000	AC	2022-01-01 21:30:39.0	2022-01-01 21:30:39.0	1
1205	kranthi	admin	20000	TP	2022-01-01 21:30:39.0	2022-01-01 21:30:39.0	1

6. 匯入關系表到HIVE

  • 將我們 mysql 表當中的資料直接匯入到 hive 表中的話,需要將 hive 的一個叫做 hive-exec-3.1.2.jar 的 jar 包拷貝到 sqoop 的 lib 目錄下
cp /bigdata/install/hive-3.1.2/lib/hive-exec-3.1.2.jar /bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
  • 準備 hive 表資料,進入 hive 客戶端執行以下命令初始化資料
hive (default)> create database sqooptohive;
hive (default)> use sqooptohive;
hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by '\001';
  • 開始使用 sqoop 匯入:
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp --fields-terminated-by '\001' --hive-import --hive-table sqooptohive.emp_hive --hive-overwrite --delete-target-dir --m 1
  • 在 hive 中查詢資料:
select * from emp_hive;

在這里插入圖片描述

7. 匯入關系表到hive并自動創建hive表

  • 可以通過命令來將我們的 mysql 的表直接匯入到 hive 表當中去
# 通過這個命令,我們可以直接將我們mysql表當中的資料以及表結構一起倒入到hive當中去
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp_conn --hive-import -m 1 --hive-database sqooptohive
  • 匯入完成后,到 hive 查詢資料:
select * from emp_conn;

在這里插入圖片描述

8. 將mysql表資料匯入到hbase當中去

  • sqoop1的最新版本1.4.7只與hbase 1.x相兼容,因此這里修改 sqoop 的組態檔 sqoop-env.sh,指定 hbase-2.2.2 版本的 HBase

  • 初始化 mysql 表資料

CREATE DATABASE IF NOT EXISTS library;
USE library;
CREATE TABLE book(
id INT(4) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
NAME VARCHAR(255) NOT NULL, 
price VARCHAR(255) NOT NULL);
-- 插入資料
INSERT INTO book(NAME, price) VALUES('Lie Sporting', '30'); 
INSERT INTO book (NAME, price) VALUES('Pride & Prejudice', '70'); 
INSERT INTO book (NAME, price) VALUES('Fall of Giants', '50'); 
  • 執行如下命令將 mysql 表當中的資料匯入到HBase當中去
sqoop import --connect jdbc:mysql://node03:3306/library --username root --password 123456 --table book --columns "id,name,price" --column-family "info" --hbase-create-table --hbase-row-key "id" --hbase-table "hbase_book" --num-mappers 1 --split-by id
  • HBase當中查看表資料
hbase(main):057:0> scan 'hbase_book'
ROW           COLUMN+CELL                            
 1            column=info:name, timestamp=1550634017823, value=Lie Sporting   
 1            column=info:price, timestamp=1550634017823, value=30       
 2            column=info:name, timestamp=1550634017823, value=Pride & Prejudice 
 2            column=info:price, timestamp=1550634017823, value=70       
 3            column=info:name, timestamp=1550634017823, value=Fall of Giants  
 3            column=info:price, timestamp=1550634017823, value=50

9. 匯入表資料子集

  • 可以使用Sqoop工具匯入表的“where”子句的一個子集,它執行在各自的資料庫服務器相應的SQL查詢,并將結果存盤在HDFS的目標目錄,

  • 通過--where 引數來查找表 emp_add 當中 city 欄位的值為 sec-bad 的所有資料匯入到 hdfs 上面去

sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp_add --target-dir /sqoop/emp_add -m 1 --delete-target-dir --where "city = 'sec-bad'"
  • hdfs 查看資料
hdfs dfs -text /sqoop/emp_add/part-*

1202,108I,aoc,sec-bad,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1204,78B,old city,sec-bad,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1205,720X,hitec,sec-bad,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1

10. sql陳述句查找匯入hdfs

  • 還可以通過 --query 引數來指定我們的 sql 陳述句,通過 sql 陳述句來過濾我們的資料進行匯入
import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --delete-target-dir -m 1 --query 'select phno from emp_conn where 1=1 and  $CONDITIONS' --target-dir /sqoop/emp_conn
  • hdfs 查看資料
hdfs dfs -text /sqoop/emp_conn/part-*

2356742
1661663
8887776
9988774
1231231

注意:使用sql陳述句來進行查找是不能加引數–table,并且必須要添加where條件,并且where條件后面必須帶一個$CONDITIONS 這個字串,并且這個sql陳述句必須用單引號,不能用雙引號,

11. 增量匯入

  • 在實際作業當中,資料的匯入,很多時候都是只需要匯入增量資料即可,并不需要將表中的資料全部匯入到hive或者hdfs當中去,全部匯入會出現重復的資料的狀況,所以我們一般都是選用一些欄位進行增量的匯入,為了支持增量的匯入,sqoop也給我們考慮到了這種情況并且支持增量的匯入資料,
  • 增量匯入是僅匯入新添加的表中的行的技術,
  • 它需要添加 incrementalcheck-columnlast-value 選項來執行增量匯入,語法如下:
--incremental <Append>       			//基于遞增列的增量匯入           
--check-column <column name> 			//遞增列
--last-value <last check column value> 	//閾值
  • 方式一:使用上面的選項來實作
    • 注意:增量匯入的時候,一定不能加引數 --delete-target-dir 否則會報錯
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp --incremental append --check-column id --last-value 1202 -m 1 --target-dir /sqoop/increment

# 查看
hdfs dfs -text /sqoop/increment/part*

1203,khalil,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1204,prasanth,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1205,kranthi,admin,20000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
  • 方式二:通過 --where 條件來實作
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp --incremental append --where "create_time > '2021-12-30 00:00:00' and is_delete='1' and create_time < '2022-01-02 23:59:59'" --target-dir /sqoop/increment2 --check-column id --m 1

# 查看
hdfs dfs -text /sqoop/increment2/part*

1201,gopal,manager,50000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1202,manisha,Proof reader,50000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1203,khalil,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1204,prasanth,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1205,kranthi,admin,20000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1

Sqoop的資料匯出

1. 將資料從HDFS把檔案匯出到RDBMS資料庫

  • 匯出前,目標表必須存在于目標資料庫中,
  • 默認操作是將檔案中的資料使用 INSERT 陳述句插入到表中,更新模式下,是生成 UPDATE 陳述句更新表資料,
  • 資料是在HDFS當中的如下目錄/sqoop/emp,資料內容如下:
1201,gopal,manager,50000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1202,manisha,Proof reader,50000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1203,khalil,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1204,prasanth,php dev,30000,AC,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
1205,kranthi,admin,20000,TP,2022-01-01 21:30:39.0,2022-01-01 21:30:39.0,1
  • 創建 mysql 表
use userdb;

CREATE TABLE `emp_out` (
 `id` INT(11) DEFAULT NULL,
 `name` VARCHAR(100) DEFAULT NULL,
 `deg` VARCHAR(100) DEFAULT NULL,
 `salary` INT(11) DEFAULT NULL,
 `dept` VARCHAR(10) DEFAULT NULL,
 `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `is_delete` BIGINT(20) DEFAULT '1' 
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • 執行匯出命令:
sqoop export --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp_out --export-dir /sqoop/emp --input-fields-terminated-by ","
  • 驗證:去 mysql 表查詢資料

在這里插入圖片描述

Sqoop常用命令及引數詳解

1. 常用命令串列

命令說明
importImportTool將資料匯入到集群
exportExportTool將集群資料匯出
codegenCodeGenTool獲取資料庫中某張表資料生成Java并打包Jar
create-hive-tableCreateHiveTableTool創建Hive表
evalEvalSqlTool查看SQL執行結果
import-all-tablesImportAllTablesTool匯入某個資料庫下所有表到HDFS中
jobJobTool用來生成一個sqoop的任務,生成后,該任務并不執行,除非使用命令執行該任務,
list-databasesListDatabasesTool列出所有資料庫名
list-tablesListTablesTool列出某個資料庫下所有表
mergeMergeTool將HDFS中不同目錄下面的資料合在一起,并存放在指定的目錄中
metastoreMetastoreTool記錄sqoop job的元資料資訊,如果不啟動metastore實體,則默認的元資料存盤目錄為:~/.sqoop,如果要更改存盤目錄,可以在組態檔sqoop-site.xml中進行更改,
helpHelpTool列印sqoop幫助資訊
versionVersionTool列印sqoop版本資訊

2. 資料庫連接公共引數

引數說明
–connect連接關系型資料庫的URL
–connection-manager指定要使用的連接管理類
–driverJDBC的driver class
–help列印幫助資訊
–password連接資料庫的密碼
–username連接資料庫的用戶名
–verbose在控制臺列印出詳細資訊

3. import 公共引數

引數說明
–enclosed-by <char>給欄位值前后加上指定的字符
–escaped-by <char>對欄位中的雙引號加轉義符
–fields-terminated-by <char>設定每個欄位是以什么符號作為結束,默認為逗號
–lines-terminated-by <char>設定每行記錄之間的分隔符,默認是\n
–mysql-delimitersMysql默認的分隔符設定,欄位之間以逗號分隔,行之間以\n分隔,默認轉義符是\,欄位值以單引號包裹,
–optionally-enclosed-by <char>給帶有雙引號或單引號的欄位值前后加上指定字符,

4. export 公共引數

引數說明
–input-enclosed-by <char>對欄位值前后加上指定字符
–input-escaped-by <char>對含有轉移符的欄位做轉義處理
–input-fields-terminated-by <char>欄位之間的分隔符
–input-lines-terminated-by <char>行之間的分隔符
–input-optionally-enclosed-by <char>給帶有雙引號或單引號的欄位前后加上指定字符

5. hive 公共引數

引數說明
–hive-delims-replacement <arg>用自定義的字串替換掉資料中的\r\n和\013 \010等字符
–hive-drop-import-delims在匯入資料到hive時,去掉資料中的\r\n\013\010這樣的字符
–map-column-hive <map>生成hive表時,可以更改生成欄位的資料型別
–hive-partition-key創建磁區,后面直接跟磁區名,磁區欄位的默認型別為string
–hive-partition-value <v>匯入資料時,指定某個磁區的值
–hive-home <dir>hive的安裝目錄,可以通過該引數覆寫之前默認配置的目錄
–hive-import將資料從關系資料庫中匯入到hive表中
–hive-overwrite覆寫掉在hive表中已經存在的資料
–create-hive-table默認是false,即,如果目標表已經存在了,那么創建任務失敗,
–hive-table后面接要創建的hive表,默認使用MySQL的表名
–table指定關系資料庫的表名

6. import 特有引數

  • 將關系型資料庫中的資料匯入到HDFS(包括Hive,HBase)中,如果匯入的是Hive,那么當Hive中沒有對應表時,則自動創建,
  • 1、匯入資料到hive中:
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp \
--hive-import
  • 2、增量匯入到hive中 mode=append
sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp \
--num-mappers 1 \
--fields-terminated-by "\t" \
--target-dir /user/hive/warehouse/emp \
--check-column id \
--incremental append \
--last-value 3

append不能與–hive-等引數同時使用(Append mode for hive imports is not yet supported. Please remove the parameter --append-mode)

  • 3、增量匯入資料到hdfs中,mode=lastmodified
# 先在mysql中建表并插入幾條資料
create table company.staff_timestamp(id int(4), name varchar(255), sex varchar(255), last_modified timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

insert into company.staff_timestamp (id, name, sex) values(1, 'AAA', 'female');
insert into company.staff_timestamp (id, name, sex) values(2, 'BBB', 'female');

# 先匯入一部分資料
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp_conn --delete-target-dir --m 1

insert into company.staff_timestamp (id, name, sex) values(3, 'CCC', 'female');

# 再增量匯入一部分資料
sqoop import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp_conn --check-column last_modified --incremental lastmodified --last-value "2018-0-28 22:20:38" -m 1 --append

使用lastmodified方式匯入資料要指定增量資料是要–append(追加)還是要–merge-key(合并)

–incremental lastmodified模式下,last-value指定的值是會包含于增量匯入的資料中,

引數說明
–append將資料追加到HDFS中已經存在的DataSet中,如果使用該引數,sqoop會把資料先匯入到臨時檔案目錄,再合并,
–as-avrodatafile將資料匯入到一個Avro資料檔案中
–as-sequencefile將資料匯入到一個sequence檔案中
–as-textfile將資料匯入到一個普通文本檔案中
–boundary-query <statement>邊界查詢,匯入的資料為該引數的值(一條sql陳述句)所執行的結果區間內的資料,
–columns <col1, col2, col3>指定要匯入的欄位
–direct直接匯入模式,使用的是關系資料庫自帶的匯入匯出工具,以便加快匯入匯出程序,
–direct-split-size在使用上面direct直接匯入的基礎上,對匯入的流按位元組分塊,即達到該閾值就產生一個新的檔案
–inline-lob-limit設定大物件資料型別的最大值
–m或–num-mappers啟動N個map來并行匯入資料,默認4個,
–query或–e 將查詢結果的資料匯入,使用時必須伴隨參–target-dir,–hive-table,如果查詢中有where條件,則條件后必須加上$CONDITIONS關鍵字
–split-by <column-name>按照某一列來切分表的作業單元,不能與–autoreset-to-one-mapper連用(請參考官方檔案)
–table <table-name>關系資料庫的表名
–target-dir <dir>指定HDFS路徑
–warehouse-dir <dir>與14引數不能同時使用,匯入資料到HDFS時指定的目錄
–where從關系資料庫匯入資料時的查詢條件
–z或–compress允許壓縮
–compression-codec指定hadoop壓縮編碼類,默認為gzip(Use Hadoop codec default gzip)
–null-string <null-string>string型別的列如果null,替換為指定字串
–null-non-string <null-string>非string型別的列如果null,替換為指定字串
–check-column <col>作為增量匯入判斷的列名
–incremental <mode>mode:append或lastmodified
–last-value <value>指定某一個值,用于標記增量匯入的位置

7. export 特有引數

  • 從HDFS(包括Hive和HBase)中將資料匯出到關系型資料庫中
sqoop export \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--export-dir /user/company \
--input-fields-terminated-by "\t" \
--num-mappers 1
引數說明
–direct利用資料庫自帶的匯入匯出工具,以便于提高效率
–export-dir <dir>存放資料的HDFS的源目錄
-m或–num-mappers <n>啟動N個map來并行匯入資料,默認4個
–table <table-name>指定匯出到哪個RDBMS中的表
–update-key <col-name>對某一列的欄位進行更新操作
–update-mode <mode>updateonly allowinsert(默認)
–input-null-string <null-string>請參考import該類似引數說明
–input-null-non-string <null-string>請參考import該類似引數說明
–staging-table <staging-table-name>創建一張臨時表,用于存放所有事務的結果,然后將所有事務結果一次性匯入到目標表中,防止錯誤,
–clear-staging-table如果第9個引數非空,則可以在匯出操作執行前,清空臨時事務結果表

8. codegen 特有引數

  • 將關系型資料庫中的表映射為一個Java類,在該類中有各列對應的各個欄位
sqoop codegen \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--bindir /home/admin/Desktop/staff \
--class-name Staff \
--fields-terminated-by "\t"
引數說明
–bindir <dir>指定生成的Java檔案、編譯成的class檔案及將生成檔案打包為jar的檔案輸出路徑
–class-name <name>設定生成的Java檔案指定的名稱
–outdir <dir>生成Java檔案存放的路徑
–package-name <name>包名,如com.z,就會生成com和z兩級目錄
–input-null-non-string <null-str>在生成的Java檔案中,可以將null字串或者不存在的字串設定為想要設定的值(例如空字串)
–input-null-string <null-str>將null字串替換成想要替換的值(一般與5同時使用)
–map-column-java <arg>資料庫欄位在生成的Java檔案中會映射成各種屬性,且默認的資料型別與資料庫型別保持對應關系,該引數可以改變默認型別,例如:–map-column-java id=long, name=String
–null-non-string <null-str>在生成Java檔案時,可以將不存在或者null的字串設定為其他值
–null-string <null-str>在生成Java檔案時,將null字串設定為其他值(一般與8同時使用)
–table <table-name>對應關系資料庫中的表名,生成的Java檔案中的各個屬性與該表的各個欄位一一對應

9. create-hive-table 特有引數

  • 生成與關系資料庫表結構對應的hive表結構
sqoop create-hive-table \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table emp_add
引數說明
–hive-home <dir>Hive的安裝目錄,可以通過該引數覆寫掉默認的Hive目錄
–hive-overwrite覆寫掉在Hive表中已經存在的資料
–create-hive-table默認是false,如果目標表已經存在了,那么創建任務會失敗
–hive-table后面接要創建的hive表
–table指定關系資料庫的表名

10. eval 特有引數

  • 可以快速的使用SQL陳述句對關系型資料庫進行操作,經常用于在 import 資料之前,了解一下 SQL 陳述句是否正確,資料是否正常,并可以將結果顯示在控制臺,
sqoop eval \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--query "SELECT * FROM emp"
引數說明
–query或–e后跟查詢的SQL陳述句

11. import-all-tables 特有引數

  • 可以將RDBMS中的所有表匯入到HDFS中,每一個表都對應一個HDFS目錄
$ bin/sqoop import-all-tables \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--warehouse-dir /all_tables
引數說明
–as-avrodatafile這些引數的含義均和import對應的含義一致
–as-sequencefile
–as-textfile
–direct
–direct-split-size <n>
–inline-lob-limit <n>
–m或—num-mappers <n>
–warehouse-dir <dir>
-z或–compress
–compression-codec

12. job 特有引數

  • 用來生成一個sqoop任務,生成后不會立即執行,需要手動執行,
$ bin/sqoop job \
 --create myjob -- import-all-tables \
 --connect jdbc:mysql://node03:3306/userdb \
 --username root \
 --password 123456
$ bin/sqoop job \
--list
$ bin/sqoop job \
--exec myjob

注意 import-all-tables 和它左邊的–之間有一個空格

如果需要連接metastore,則–meta-connect jdbc:hsqldb:hsql://node03:16000/sqoop

引數說明
–create <job-id>創建job引數
–delete <job-id>洗掉一個job
–exec \ 執行一個job
–help顯示job幫助
–list顯示job串列
–meta-connect <jdbc-uri>用來連接metastore服務
–show <job-id>顯示一個job的資訊
–verbose列印命令運行時的詳細資訊

在執行一個job時,如果需要手動輸入資料庫密碼,可以做如下優化

<property>
	<name>sqoop.metastore.client.record.password</name>
	<value>true</value>
	<description>If true, allow saved passwords in the metastore.</description>
</property>

13. list-databases 特有引數

  • 列出所有資料庫名稱
sqoop list-databases \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456
  • 引數與公用引數一樣

14. list-tables 特有引數

  • 列出某個資料庫下所有表
$ bin/sqoop list-tables \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456

**引數:**與公用引數一樣

15. merge 特有引數

  • 將HDFS中不同目錄下面的資料合并在一起并放入指定目錄中
# 資料準備
# 資料的列之間的分隔符應該為\t,行與行之間的分割符為\n
new_staff
1       AAA     male
2       BBB     male
3       CCC     male
4       DDD     male
old_staff
1       AAA     female
2       CCC     female
3       BBB     female
6       DDD     female

# 創建JavaBean
sqoop codegen \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--table emp_conn \
--bindir /home/admin/Desktop/staff \
--class-name EmpConn \
--fields-terminated-by "\t"
  • 開始合并:
sqoop merge \
--new-data /test/new/ \
--onto /test/old/ \
--target-dir /test/merged \
--jar-file /home/admin/Desktop/staff/EmpConn.jar \
--class-name Staff \
--merge-key id
  • 結果:
1	AAA	MALE
2	BBB	MALE
3	CCC	MALE
4	DDD	MALE
6	DDD	FEMALE
引數說明
–new-data <path>HDFS 待合并的資料目錄,合并后在新的資料集中保留
–onto <path>HDFS合并后,重復的部分在新的資料集中被覆寫
–merge-key <col>合并鍵,一般是主鍵ID
–jar-file \ 合并時引入的jar包,該jar包是通過Codegen工具生成的jar包
–class-name <class>對應的表名或物件名,該class類是包含在jar包中的
–target-dir <path>合并后的資料在HDFS里存放的目錄

16. metastore 特有引數

  • 記錄了Sqoop job的元資料資訊,如果不啟動該服務,那么默認job元資料的存盤目錄為~/.sqoop,可在sqoop-site.xml中修改,
# 啟動sqoop的metastore服務
sqoop metastore
引數說明
–shutdown關閉metastore

Sqoop作業

  • Sqoop作業:將事先定義好的資料匯入匯出任務按照指定流程運行

1. 語法

$ sqoop job (generic-args)  (job-args)    [-- [subtool-name] (subtool-args)]    
$ sqoop-job (generic-args)  (job-args)    [-- [subtool-name] (subtool-args)]     

2. 創建作業(–create)

  • 創建一個名為 myjob,可以從 RDBMS 表的資料匯入到 HDFS 的作業,
sqoop job --create myjob -- import --connect jdbc:mysql://node03:3306/userdb --username root --password 123456 --table emp --delete-target-dir

3. 驗證作業 (–list)

  • –list 引數用來驗證保存的作業
sqoop job --list

4. 檢查作業(–show)

  • –show 引數用于檢查或驗證特定的作業,及其詳細資訊
sqoop job --show myjob

在這里插入圖片描述

5. 執行作業 (–exec)

  • –exec 選項用于執行保存的作業
sqoop job --exec myjob

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402696.html

標籤:其他

上一篇:如何在IDEA編譯器中連接HDFS,運行MapReduce程式

下一篇:一場事故告訴你zookeeper和nacos誰更適合做注冊中心

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more