Sqoop面試題答案 Sqoop 在工作中的定位是會用就行 Q1:Sqoop導入hdfs的參數 /opt/module/sqoop/bin/sqoop import \--connect \ # 特殊的jdbc連接的字元串--username \--password \--target-dir \ ...
Sqoop 在工作中的定位是會用就行
Q1:Sqoop導入hdfs的參數
/opt/module/sqoop/bin/sqoop import \
--connect \ # 特殊的jdbc連接的字元串
--username \
--password \
--target-dir \ # hdfs目標的目錄
--delete-target-dir \ # 導入的目標目錄如果存在則刪除那個目錄
--num-mappers \ #相當於 -m ,並行導入時map task的個數
--fields-terminated-by \
--query "$2" ' and $CONDITIONS;' # 指定滿足sql和條件的數據導入
Q2:Sqoop導入hive時的參數
一步將表結構和數據都導入到hive中
bin/sqoop import \
--connect jdbc的url字元串 \
--table mysql中的表名\
--username 賬號 \
--password 密碼\
--hive-import \
--m mapTask的個數\
--hive-database hive中的資料庫名;
Q3: RDBMS的增量數據導入
--check-column 欄位名 \ #指定判斷檢查的依據欄位
--incremental 導入模式\ # 用來指定增量導入的模式(Mode),append和lastmodified
--last-value 上一次導入結束的時間\
--m mapTask的個數 \
--merge-key 主鍵
補充: ·如果使用merge-key合併模式 如果是新增的數據則增加,因為incremental是lastmodified模式,那麼當有數據更新了,而主鍵沒有變,則會進行合併。 ·--check-column欄位當數據更新和修改這個欄位的時間也要隨之變化,mysql中建表時該欄位修飾符,欄位名timestamp default current_timestamp on update current_timestamp
Q4: Sqoop Null一致性問題
Hive中的Null在底層是以“\N”來存儲,而MySQL中的Null在底層就是Null,為了保證數據兩端的一致性,轉化的過程中遇到null-string,null-non-string數據都轉化成指定的類型,通常指定成"\N"。在導出數據時採用–input-null-string “\N” --input-null-non-string “\N” 兩個參數。導入數據時採用–null-string “\N” --null-non-string “\N”。
Q5:Sqoop數據導出一致性
1)場景1:如Sqoop在導出到Mysql時,使用4個Map任務,過程中有2個任務失敗,那此時MySQL中存儲了另外兩個Map任務導入的數據,此時老闆正好看到了這個報表數據。而開發工程師發現任務失敗後,會調試問題並最終將全部數據正確的導入MySQL,那後面老闆再次看報表數據,發現本次看到的數據與之前的不一致,這在生產環境是不允許的。
使用—staging-table選項,將hdfs中的數據先導入到輔助表中,當hdfs中的數據導出成功後,輔助表中的數據在一個事務中導出到目標表中(也就是說這個過程要不完全成功,要不完全失敗)。
為了能夠使用staging這個選項,staging表在運行任務前或者是空的,要不就使用—clear-staging-table配置,如果staging表中有數據,並且使用了—clear-staging-table選項,sqoop執行導出任務前會刪除staging表中所有的數據。
註意:–direct導入時staging方式是不可用的,使用了—update-key選項時staging方式也不能用。
sqoop export \
--connect url \
--username root \
--password 123456 \
--table app_cource_study_report \
--columns watch_video_cnt,complete_video_cnt,dt \
--fields-terminated-by "\t" \
--export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysi_${day}" \
--staging-table app_cource_study_report_tmp \
--clear-staging-table \
--input-null-string '\\N' \
--null-non-string "\\N"
2)場景2:設置map數量為1個(不推薦,面試官想要的答案不只這個)
多個Map任務時,採用–staging-table方式,仍然可以解決數據一致性問題。
Q6:Sqoop底層運行的是什麼
只有Map階段,沒有Reduce階段的任務。
Q7:Map task並行度設置大於1
並行度導入數據的 時候 需要指定根據哪個欄位進行切分 該欄位通常是主鍵或者是自增長不重覆的數值類型欄位,否則會報下麵的錯誤。
Import failed: No primary key could be found for table. Please specify one with --split-by or perform a sequential import with ‘-m 1’.
那麼就是說當map task並行度大於1時,下麵兩個參數要同時使用
–split-by id 指定根據id欄位進行切分
–m n 指定map並行度n個
Q8:Sqoop導出一次多長時間
每天晚上00:30開始執行,Sqoop任務一般情況40 -50分鐘的都有。取決於數據量(11:11,6:18等活動在1個小時左右)
Q9:Sqoop一天導入多少數據
100萬日活=》 10萬訂單,1人10條,每天1g左右業務數據。Sqoop每天將1G的數據量導入到數倉。
Q10: Sqoop導入 數據傾斜
https://blog.csdn.net/lizhiguo18/article/details/103969906
Sqoop抽數的並行化主要涉及到兩個參數:num-mappers:啟動N個map來並行導入數據,分成4個;拆分為:按照併列來切分表的工作單元。
通過ROWNUM()生成一個嚴格的均勻分佈的細分,然後指定為分割分段
Q11:Sqoop數據導出Parquet
數據用Sqoop往MySql中導入數據的時候,如果用了orc(Parquet)不能導入,需轉化成文本格式
(1)創建臨時表,把Parquet中表數據導入到臨時表,把臨時表轉換到目標表用於可視化
(2)Sqoop裡面有參數,可以直接把Parquet轉換為text
(3)建表的時候就不要建Parquet表
Q12:Sqoop是什麼
Sqoop-“SQL to Hadoop and Hadoop to SQL”(翻譯:從SQL到Hadoop和從Hadoop到SQL)Apache Sqoop是一種有效的hadoop工具,用於將數據從RDBMS(如MySQL,Oracle等)導入到HBase,Hive或HDFS中。 Sqoop hadoop還可以用於將數據從HDFS導出到RDBMS。 Apache Sqoop是一個命令行解釋器,即Sqoop命令一次由解釋器執行。
Q13:Sqoop的不同功能/特性
下麵是Sqoop支持的功能列表: 滿載和增量載入;數據壓縮技術;導入SQL查詢結果;所有主要資料庫的數據連接器;直接將數據載入支持到Hadoop文件系統中;安全配置,例如Kerberos;併發導入或導出功能;
Q14:列舉一些Sqoop導入命令
導入控制命令用於導入RDBMS數據
Append:將數據追加到HDFS中的現有數據集。 Columns:要從表中導入的列。 Where:在導入期間使用的where子句。
Q15:Sqoop如何處理大對象
常見的大型對象是Blog和Clob,假設對象小於16 MB,則與其餘數據一起內聯存儲。 如果有大對象,則將它們臨時存儲在名為_lob的子目錄中。 這些數據然後在存儲器中實現以進行處理。 如果我們將lob limit設為零(0),則它將存儲在外部存儲器中。
Q16:Sqoop導入BLOB和CLOB
對於CLOB和BLOB對象,Sqoop不支持直接導入功能。 因此,如果必須導入大型對象,則可以使用基於JDBC的導入。 無需引入import實用程式的直接參數即可完成此操作。
Q17:Sqoop導入預設文件格式
Sqoop允許使用兩種文件格式導入數據。它們如下: 分隔文本文件格式序列文件格式 分隔文本文件格式:這是使用Sqoop導入數據的預設文件格式。 可以使用Sqoop中import命令的–as-textfile參數明確指定此文件格式。 將其作為參數傳遞給命令將在輸出文件中產生所有記錄的基於字元串的表示形式,併在行和列之間使用定界字元。 序列文件格式:這是一種二進位文件格式,其中記錄以特定於記錄的定製數據類型存儲,這些數據類型顯示為Java類。 Sqoop自動創建這些數據類型並將其顯示為java類。
Q18:Sqoop工作原理
下圖顯示了Sqoop的工作流程:
Sqoop導入
導入工具將單個表從RDBMS導入到HDFS。 表中的每一行都被視為HDFS中的一條記錄。 所有記錄都作為文本數據存儲在文本文件中,或者作為二進位數據存儲在Avro和Sequence文件中。
Sqoop導出
導出工具將一組文件從HDFS導出回RDBMS。 作為Sqoop輸入的文件包含記錄,這些記錄稱為表中的行。 讀取這些記錄並將它們解析為一組記錄,並使用用戶指定的定界符定界。
Q19:Sqoop的前提條件
需要基本的核心Java知識,SQL的資料庫概念,Hadoop文件系統以及任何Linux操作系統版本。
Q20:Sqoop導入使用語法
以下語法用於Sqoop導入:
$ sqoop import (generic-args) (import-args) Shell
Q21:Sqoop導出使用什麼語法
以下語法用於Sqoop導出:
$ sqoop export (generic-args) (export-args) Shell
Q22:Sqoop支持關係資料庫
Sqoop當前支持的關係資料庫有:
MySQLPostgreSQLOracleMSSQLTeradataIBM的Netezza作為關係資料庫的一部分。 Sqoop使用MySQL作為預設資料庫。
Q23:Sqoop支持Hadoop資源
當前支持的Hadoop生態系統目標服務是:
HDFC Hive HBase H Catalog Accumulo
Q24:Sqoop的主要功能
Sqoop有4個主要關鍵功能:
批量導入:Sqoop可以將單個表或整個資料庫導入HDFS。 數據存儲在HDFS文件系統的本機目錄和文件中。
直接輸入:Sqoop可以將SQL(關係)資料庫直接導入和映射到Hive和HBase。
數據交互:Sqoop可以生成Java類,以便您可以通過編程方式與數據進行交互。
數據導出:Sqoop可以使用基於目標資料庫詳細信息的目標表定義將數據直接從HDFS導出到關係資料庫中。
Q25:JDBC在Sqoop中的作用
要連接到不同的關係資料庫,sqoop需要一個連接器。 幾乎每個資料庫供應商都可以將該連接器用作特定於該資料庫的JDBC驅動程式。 因此,Sqoop需要與之交互的每個資料庫的JDBC驅動程式。
Q26:JDBC能將sqoop連資料庫
不能。Sqoop同時需要JDBC和連接器才能連接到資料庫。
Q27:target和warehouse使用
要在HDFS中指定特定目錄,請使用–target-dir,但要指定所有sqoop作業的父目錄,請使用–warehouse-dir。 在這種情況下,sqoop將在父目錄下創建一個與表同名的目錄。
Q28:Sqoop預設資料庫
有,MySQL是預設資料庫。
Q29:Sqoop列出表的所有列
與sqoop-list-tables和sqoop-list-databases不同,沒有像sqoop-list-columns這樣的直接命令來列出所有列。 實現此目的的間接方法是檢索所需表的列並將其重定向到一個文件,該文件可以手動查看,其中包含特定表的列名。
Sqoop import \
–m 1
–connect ‘jdbc: sqlserver: //nameofmyserver; database=nameofmydatabase; username=DeZyre; password=mypassword’ \
–query “SELECT column_name, DATA_TYPE FROM INFORMATION_SCHEMA.Columns WHERE table_name=’mytableofinterest’ AND \$CONDITIONS” \
–target-dir ‘mytableofinterest_column_name’
Q30:從特定的行或列導入數據
Sqoop允許根據where子句從數據表中導出和導入數據。 語法是: –columns –where –query 示例:
sqoop import –connect jdbc:mysql://db.one.com/corp –table INTELLIPAAT_EMP –where “start_date> ’2016-07-20’ ” sqoopeval –connect jdbc:mysql://db.test.com/corp –query “SELECT * FROM intellip...
Q31: import命令的目標類型
Sqoop支持將數據導入以下服務:
HDFS
Hive
Hbase
Hcatalog
Accumulo
Q32:target和warehouse
Warehouse-dir指向要導入數據的Hive文件夾(在批量導入表時使用),而通過查詢導入到Hive(sqoop錯誤要求)時,需要–target-dir。在後一種情況下,它用作映射器的臨時區域,後跟LOAD INPATH。(要麼)即 我們使用–target-dir在HDFS中指定特定目錄。 而我們使用–warehouse-dir指定所有sqoop作業的父目錄。 因此,在這種情況下,sqoop將在父目錄下創建一個與表同名的目錄。
Q33:Sqoop中的distcp類
distCP(Hadoop中的分散式副本)和Sqoop都並行傳輸數據,但是唯一的區別是distCP命令可以將任何類型的數據從一個Hadoop群集傳輸到另一個Hadoop群集,而Sqoop則在RDBMS和Hadoop生態系統中的其他組件(例如HBase, Hive, HDFS等)之間傳輸。
Q34:Sqoop在Java程式
可以通過在類路徑中包含sqoop jar並調用Sqoop.runTool()方法,從Java代碼內部運行sqoop。 就像命令行一樣,必須以編程方式為Sqoop創建必要的參數。
Q35:Sqoop存在的所有表
使用Sqoop檢查單個資料庫中存在的所有表的列表的命令如下-
Sqoop list-tables –connect jdbc: mysql: //localhost/user;
Q36:sqoop全部載入
根據Sqoop用戶指南,為了對RDMS執行all-or-nothing載入,可以使用登臺表。 然後,只有在臨時載入成功後,才將其載入到最終目標表中。 但是,此選項似乎僅在出口中可用。 當執行從HDServer的導入(從SQLServer導入)時,選項–staging-table不存在。
Q37:防止import中密碼
-P選項從標準輸入中詢問密碼而不回顯,而–password-file選項讀取存儲在其他文件中的密碼值。
Q38:Sqoop使用什麼壓縮
Sqoop沒有任何內置代碼來執行文件壓縮。 它依賴Hadoop的壓縮設置。
Q39:使用Oozie安排Sqoop
Oozie具有內置的sqoop動作,我們可以在其中提及要執行的sqoop命令。
Q40:不使用where子句
我們可以在資料庫上運行過濾查詢,並將結果保存到資料庫中的臨時表中。
然後,使用sqoop import命令而不使用–where子句。
Q41:compress參數
使用–compress參數從sqoop導入生成的文件的預設擴展名是:.gz
-password-file選項可在sqoop腳本內使用,而-P選項可從標準輸入中讀取,從而防止自動化。
Q43:表HDFS數據同步
將導出的表與刪除了某些行的HDFS數據同步:截斷目標表並再次載入它。
Q44:在Sqoop輸入自由格式
Sqoop可以使用任何SQL查詢而不是僅使用表名和列名以及參數從關係資料庫中導入數據。