您好,登錄后才能下訂單哦!
這篇文章主要介紹“sqoop內部結構是怎樣的”,在日常操作中,相信很多人在sqoop內部結構是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”sqoop內部結構是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1.1 Sqoop內部結構 Sqoop程序是由的主類com.cloudera.sqoop.Sqoop驅動。有限數量的額外的類在同一個包:SqoopOptions (如前所述),ConnFactory(即熟練操作ManagerFactory實例)。 1.1.1 一般程序流程一般的程序流程如下: com.cloudera.sqoop.Sqoop是主類和實現了Tool,一個新的實例ToolRunner被推出,Sqoop的第一個參數是一個字符串,并在SqoopTool中定義并執行,SqoopTool來執行用戶的各種請求操作(如: import, export, codegen等)。 SqoopTool將解析其余的參數,設置相應的字段在SqoopOptions類,然后執行。 在SqoopTool 的run()方法中,import 、export或者其他正確的指令被執行。一般情況下ConnManager一般在SqoopOptions數據的基礎上進行實例化。ConnFactory被用于從ManagerFactory中獲取一個ConnManager。這在前面的部分已經進行了描述。Imports 、 exports或者其他大型數據的遷移操作通常是一個并行的、可靠的MapReduce任務。Import操作并不是一定要以MapReduce作業的方式運行,ConnManager.importTable()將確定如何以最佳的方式進行import操作。每一個主要操作實際上都有ConnMananger控制,除了生成代碼的操作,這些操作是由CompilationManager和ClassWriter做的(都在 com.cloudera.sqoop.orm 包中)。導入數據到Hive的操作是由com.cloudera.sqoop.hive.HiveImport的importTable()完成的,這樣做是為了不為使用ConnManager的實現都擔心。 ConnManager 的 importTable()方法接收一個類型為ImportJobContext的參數,其中包含這個方法所需的各種參數值。將來,該類可擴展附加參數,以實現功能更加強大的import操作。同樣, exportTable()方法接收的參數類型ExportJobContext。這些類包含一系列導入/導出,指向SqoopOptions對象,以及其他相關的數據。 1.1.2 子包com.cloudera.sqoop包中的子包,包括: ※ Hive:便于數據導入到Hive ※ IO: 實現的java.io. *接口 ※ Lib: 外部公共API(如前所述) ※ Manager: ConnManager和ManagerFactory的接口和它們的實現 ※ Mapreduce: 新的(0.20 +)MapReduce的API接口的類 ※ Orm: 代碼自動生成 ※ Tool: 實現SqoopTool ※ Util: 各種實用工具類 IO包中的OutputStream和BufferedWriter的實現被用于直接向HDFS進行寫入。SplittableBufferedWriter允許為客戶端打開一個單一的BufferedWriter,在引擎之下,當達到目標值后連續的寫入文件系統。這允許在Sqoopimport的同時使用壓縮機制(如gzip),同時允許在MapR任務之后對數據集進行分割。大對象文件存儲系統的代碼也存在于IO包中。 Mapreduce包中的代碼用于直接與Hadoop MapReduce做接口,將在下一章節中詳述。 ORM包中的代碼用于生產代碼。它依賴于提供了com.sun.tools.javac包的JDK的tools.jar包。 UTIL包中包含用于整個Sqoop的各種工具 ※ ClassLoaderStack:管理由當前線程的堆棧使用的ClassLoader的實例,這正是當以本地模式運行MapReduce任務時自動生成代碼寫入當心線程的原理。 ※ DirectImportUtils:包含一些直接進行Hadoop import操作的方便方法。 ※ Executor:啟動外部進程,并連接這些來生成由一個AsyncSink(見下面更詳細地)的流處理程序。 ※ ExportException:當exports失敗時由ConnManagers拋出異常。 ※ ImportException:當import失敗時由ConnManagers拋出異常。 ※ JDBCURL:處理連接字符串的解析,這是類URL,是不規范的、不合格的。 ※ PerfCounters:被用來估計用于顯示給用戶的傳輸速率。 ※ ResultSetPrinter:漂亮地打印結果集。 在不同的時候,Sqoop從外部程序中讀取stdout,最簡單的模式就是由LocalMySQLManager和DirectPostgresqlManager執行的直接模式 (direct-mode)import。之后由Runtime.exec()產生一個進程,該進程的標準輸出(Process.getInputStream())和潛在錯誤(Process.getErrorStream())都需要被處理。在這些流之間無法讀取更多的數據從而導致在寫入更多數據之前外部進程阻塞。因此,這些都必須處理,最好以異步的方式。 按照Sqoop的說法,“異步接收器”是一個線程需要一個InputStream和讀取完成。這些實現AsyncSink實現。com.cloudera.sqoop.util.AsyncSink抽象類定義了這家工廠必須執行的操作。processStream()將產生另一個線程立即開始處理從InputStream中讀取的數據參數; 它必須讀這流來完成的。 join()方法允許外部線程等待,直到處理完成。 一些"stock"被同步實現:LoggingAsyncSink將重復InputStream上的一切在log4j INFO語句中。NullAsyncSink消耗所有的輸入和什么都不做。 各種ConnManagers使得外部進程以內部類的方式擁有它們自己的AsyncSink實現,它們通過數據庫tools讀取,并且促使數據流向HDFS,有可能在此期間進行格式轉換。 1.1.3 與MapReduce的接口Sqoop調度MapReduce作業產生imports和exports。配置和執行的MapReduce工作如下幾個共同的步驟(配置InputFormat配置OutputFormat設置映射的實施;等等)。這些步驟是在com.cloudera.sqoop.mapreduce.JobBase類中的。為了使用,JobBase允許一個用戶來指定InputFormat,OutputFormat,和映射器。 JobBase本身就是ImportJobBase和ExportJobBase的子集,為特定的配置步驟提供更好的支持,分別由ImportJobBase和ExportJobBase的子類。 ,ImportJobBase.runImport()將調用的配置步驟,并運行一個工作表導入HDFS。 |
到此,關于“sqoop內部結構是怎樣的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。