sqoop源碼解析-----從mysql到hive爲例

    上班這麼久了,大部分時間都是在大數據平臺組件的基礎上做一些小的開發,既然是在別人的東西上修改,除了百度或者谷歌搜索前人的講解,自己閱讀源碼一定是必不可少的。但是源碼裏代碼量那麼大,往往一時間多很難找到整個程序的入口,這時候 往往容易讓人感覺到煩躁而不想動,下次碰到這樣的情況,應該怎麼入手呢?剛好今天在研究根據具體業務需求修改sqoop源碼,實現從mysql到hive的單分區key,多分區value的導入的功能。具體來說就是根據mysql的日期字段,在hive中根據不同日期生成不同的分區表。

    說了這麼多,那就趕緊開始吧,首先我們在github上找到sqoop的源碼,或者直接從官網下載源碼離線包。


    這就是sqoop源碼的整個目錄結構了,我們用命令行調用sqoop的時候,會調用bin目錄下的sqoop文件,這時候看一下sqoop文件的內容,看到文件的最後一行有調用具體類的名稱了:


    好的,找到這裏,我們就可以前往src/java/org/apache/sqoop找到sqoop.java文件了,打開它,直接拉到代碼最後,果然,有我們最熟悉的main函數,找到main函數就可以順藤摸瓜了:


    再往上找到runTool方法,可以看到這個方法又調用了它的另一個重載方法,繼續找



    看到這裏,可以看到這個方法將我們命令行的參數,通過OptionsFileUtil這個類解析之後,解析出第一個參數,這裏被官方定義爲toolName,對應我們的命令行,應該就是sqoop後面的第一個參數,例如import。好的,找到這個toolName之後,它就調用了一個runSqoop方法,這就正式的將我們命令後面的一大串參數傳到核心方法裏了。

    繼續找runSqoop方法,發現它是直接調用ToolRunner.run這個方法,ToolRunner在哪兒呢?看最上面的import那一堆東西,原來是調用的hadoop的方法,我們在github上直接找這個,它在hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/這個裏面,打開它,找到run方法


    哇,又是層層調用,不管了,繼續刨根問底:


    奇怪了,這裏怎麼又找回去了呢,汗,趕緊回到sqoop.java裏去找,果然,裏面還有一個run方法,結果它又調用的是另一個run方法。調用個沒完了,彆着急,看看這個tool哪兒來的。ctrl+F找tool,哈哈,原來這個tool是sqoop tool定義的tool,好說了,打開SqoopTool.java就行了(src/java/org/apache/sqoop/tool/SqoopTool.java)。


    打開後我們看到,這不就是註冊tool的代碼嘛,這個import是我們從mysql到hive裏導數據要用的,可以,我們直接去找ImportTool.java好了(src/java/org/apache/sqoop/tool/)。


    打開ImportTool.java,可以看到這個類繼承自BaseSqoopTool,既然這樣,那就順便看看這個類唄,打開它,


    這不就是我們的命令嘛,繼續查,我們從mysql導入hive是需要用到hive-import的,查查這個關鍵字HIVE_IMPORT_ARG用在哪些地方了


    可以看到,代碼裏進行了判斷,如果我們的命令行裏有這個參數,代碼裏會調用一個SqoopOptions對象的setHiveImport方法,並將參數設置爲true。


    進入src/java/org/apache/sqoop/SqoopOptions.java類,看到

    這時候,再回到ImportTools類,找到它的run方法,這個run方法繼承自SqoopTools,是各個工具類的執行體。

 

    可以看到,因爲前面的SqoopOptions對象將doHiveImport設置爲true了,所以這裏就直接調用了importTable方法,往上看到這個方法可以發現這裏codeGenerator先根據tablename生成數據庫記錄對應的實體類,而manager負責將數據從源庫中查詢出來。最後判定如果含有hive-import,則調用HiveImport.java裏的ImportTable方法。找到這個方法(/src/java/org/apache/sqoop/hive/HiveImport.java)。


    可以看到HiveImport.java更簡單,首先,它調用和他同目錄的TableDefWriter,獲取DDL和DML語句以及warehouseDir 的地址,然後生成一個臨時的腳本文件來存放這些DDL和DML。接着調用自己的excuteScript方法執行臨時腳本,最後刪除他們。



    終於到執行的步驟啦,我們找到executeScript方法,好嘛, 這傢伙直接採用了反射的方法,直接調用Hive的主類,自己加載去了,真會偷懶。後面就是Hive的源碼啦,這裏就不解析了。哼,如果這麼算來,sqoop算對hadoop組件的二次開發,那我們這豈不是就是三次開發了。

, 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章