本文目錄一覽:
- 1、怎樣把數據從hdfs導入mysql
- 2、如何進行MySQL數據庫與HDFS的實時數據同步
- 3、Hadoop MapReduce中把分析數據寫入mysql中
- 4、sqoop將hdfs下的數據導入到mysql如何去重
- 5、調度工具(ETL+任務流)
怎樣把數據從hdfs導入mysql
如果hdfs中是格式化數據的話,可以使用sqoop命令工具來將數據導入到mysql
具體使用方式,你可以網上查找一下,資料蠻豐富的。
如何進行MySQL數據庫與HDFS的實時數據同步
通過Map/Reduce進行批處理遞送到Apache
Hadoop仍然是中樞環節。,但隨着要從「超思維速度「分析方面獲取競爭優勢的壓力遞增,因此Hadoop(分佈式文件系統)自身經歷重大的發展。科技
的發展允許實時查詢,如Apache Drill, Cloudera Impala和Stinger
Initiative正脫穎而出,新一代的資源管理Apache YARN 支持這些。
為了支持這種日漸強調實時性操作,我們正發佈一個新MySQL Applier for Hadoop(用於Hadoop的MySQL Applier)組件。它能夠把MySQL中變化的事務複製到Hadoop / Hive / HDFS。Applier 組件補充現有基於批處理Apache Sqoop的連接性。
這個組件(MySQL Applier for Hadoop)的複製是通過連接MySQL主服務,一旦二進制日誌被提交,就讀取二進制日誌事務,並且把它們寫到HDFS.
這個組件使用libhdfs提供的API,一個C庫操作HDFS中的文件。這庫由Hadoop版本預編譯生成的。
它連接MySQL主服務讀二進制日誌,然後:
•提取發生在主服務上的行插入事件
•解碼事件,提取插入到行的每個字段的數據,並使用滿意的處理程序得到被要求的格式數據。
•把它追加到HDFS 中一個文本文件。
數據庫被映射為單獨的目錄,它們的表映射為子目錄,保存在數據倉庫目錄。每個表的數據被寫到Hive/ HDFS中文本文件(稱為datafile1.txt)。數據可以用逗號格式分隔;或其他格式,那可用命令行參數來配置的。
從這個blog可以了解更多有關該組設計信息。
在這個blog已經詳細討論安裝,配置,實施信息。與Hive集成也有文檔。
Hadoop MapReduce中把分析數據寫入mysql中
你的job類並沒有設置outputformat,如需要輸出到數據庫,需要特定的輸出如下:
job.setJarByClass(TextCheckerJob.class);
job.setMapperClass(TextMapper.class);
job.setReducerClass(TextReduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(MysqlDBOutputFormat.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setNumReduceTasks(1);
MysqlDBOutputFormat.setOutput(job, “data_chck_result”, new String[] { “tblName”, “colName”, “wrongValue”, “count” });
同時,job初始化之前,你需要把連接數據庫的信息寫入conf中,如下
conf.set(“mapreduce.jdbc.driver.class”, clazz);
conf.set(“mapreduce.jdbc.username”, username);
conf.set(“mapreduce.jdbc.password”, password);
conf.set(“mapreduce.jdbc.url”, url);
上面的MysqlDBOutputFormat類是我自己重寫了,你可以直接使用DBOutputFormat這個類
sqoop將hdfs下的數據導入到mysql如何去重
在MYSQL中創建一個參數表A,用來記錄要傳輸的表的表名B和字段。 2、HDFS上的數據的格式和MYSQL中參數表A中B表的字段的數量一樣。
調度工具(ETL+任務流)
kettle是一個ETL工具,ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程)。
kettle中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺裡,然後以一種指定的格式流出。
所以他的重心是用於數據
oozie是一個工作流,Oozie工作流是放置在控制依賴DAG(有向無環圖 Direct Acyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業、Pig作業等),其中指定了動作執行的順序。
oozie工作流中是有數據流動的,但是重心是在於工作流的定義。
二者雖然都有相關功能及數據的流動,但是其實用途是不一樣的。
查看幫助
列舉出所有linux上的數據庫
列舉出所有Window上的數據庫
查看數據庫下的所有表
(1)確定mysql服務啟動正常
查詢控制端口和查詢進程來確定,一下兩種辦法可以確認mysql是否在啟動狀態
辦法1:查詢端口
MySQL監控的TCP的3306端口,如果顯示3306,證明MySQL服務在運行中
辦法二:查詢進程
可以看見mysql的進程
沒有指定數據導入到哪個目錄,默認是/user/root/表名
原因:
如果表中有主鍵,m的值可以設置大於1的值;如果沒有主鍵只能將m值設置成為1;或者要將m值大於1,需要使用–split-by指定一個字段
設置了-m 1 說明只有一個maptask執行數據導入,默認是4個maptask執行導入操作,但是必須指定一個列來作為劃分依據
導入數據到指定目錄
在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。使用參數 –target-dir來指定導出目的地,使用參數—delete-target-dir來判斷導出目錄是否存在,如果存在就刪掉
查詢導入
提示:must contain ‘$CONDITIONS’ in WHERE clause。
where id =1 匹配條件
$CONDITIONS:傳遞作用。
如果 query 後使用的是雙引號,則 $CONDITIONS前必須加轉義符,防止 shell 識別為自己的變量。
–query時不能使用–table一起使用
需要指定–target-dir路徑
導入到hdfs指定目錄並指定要求
數據導出儲存方式(數據存儲文件格式—( textfil parquet)–as-textfileImports data as plain text (default)–as-parquetfile Imports data to Parquet Files)
導入表數據子集到HDFS
sqoop導入blob數據到hive
對於CLOB,如xml文本,sqoop可以遷移到Hive表,對應字段存儲為字符類型。
對於BLOB,如jpg圖片,sqoop無法直接遷移到Hive表,只能先遷移到HDFS路徑,然後再使用Hive命令加載到Hive表。遷移到HDFS後BLOB字段存儲為16進制形式。
2.1.3導入關係表到Hive
第一步:導入需要的jar包
將我們mysql表當中的數據直接導入到hive表中的話,我們需要將hive的一個叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷貝到sqoop的lib目錄下
第二步:開始導入
導入關係表到hive並自動創建hive表
們也可以通過命令來將我們的mysql的表直接導入到hive表當中去
通過這個命令,我們可以直接將我們mysql表當中的數據以及表結構一起倒入到hive當中去
–incremental 增量模式。
append id 是獲取一個某一列的某個值。
lastmodified 「2016-12-15 15:47:35」 獲取某個時間後修改的所有數據
-append 附加模式
-merge-key id 合併模式
–check-column 用來指定一些列,可以去指定多個列;通常的是指定主鍵id
–last -value 從哪個值開始增量
==注意:增量導入的時候,一定不能加參數–delete-target-dir 否則會報錯==
第一種增量導入方式(不常用)
1.Append方式
使用場景:有個訂單表,裏面每個訂單有一個唯一標識的自增列id,在關係型數據庫中以主鍵的形式存在。之前已經將id在0-1000之間的編號的訂單導入到HDFS 中;如果在產生新的訂單,此時我們只需指定incremental參數為append,–last-value參數為1000即可,表示只從id大於1000後開始導入。
(1)創建一個MySQL表
(2)創建一個hive表(表結構與mysql一致)
注意:
append 模式不支持寫入到hive表中
2.lastModify方式
此方式要求原有表有time字段,它能指定一個時間戳,讓sqoop把該時間戳之後的數據導入到HDFS;因為後續訂單可能狀體會變化,變化後time字段時間戳也會變化,此時sqoop依然會將相同狀態更改後的訂單導入HDFS,當然我們可以只當merge-key參數為order-id,表示將後續新的記錄和原有記錄合併。
# 將時間列大於等於閾值的數據增量導入HDFS
使用 lastmodified 方式導入數據,要指定增量數據是要 –append(追加)還是要 –merge-key(合併)last-value 指定的值是會包含於增量導入的數據中。
第二種增量導入方式(推薦)
==通過where條件選取數據更加精準==
2.1.5從RDBMS到HBase
會報錯
原因:sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自動創建 HBase 表的功能。
解決方案:手動創建 HBase 表
導出前,目標表必須存在與目標數據庫中
默認操作是將文件中的數據使用insert語句插入到表中
數據是在HDFS當中的如下目錄/sqoop/emp,數據內容如下
第一步:創建MySQL表
第二步:執行導出命令
通過export來實現數據的導出,將hdfs的數據導出到mysql當中去
全量導出
增量導出
更新導出
總結:
參數介紹
–update-key 後面也可以接多個關鍵字列名,可以使用逗號隔開,Sqoop將會匹配多個關鍵字後再執行更新操作。
–export-dir 參數配合–table或者–call參數使用,指定了HDFS上需要將數據導入到MySQL中的文件集目錄。
–update-mode updateonly和allowinsert。 默認模式為updateonly,如果指定–update-mode模式為allowinsert,可以將目標數據庫中原來不存在的數據也導入到數據庫表中。即將存在的數據更新,不存在數據插入。
組合測試及說明
1、當指定update-key,且關係型數據庫表存在主鍵時:
A、allowinsert模式時,為更新目標數據庫表存的內容,並且原來不存在的數據也導入到數據庫表;
B、updateonly模式時,為更新目標數據庫表存的內容,並且原來不存在的數據也不導入到數據庫表;
2、當指定update-key,且關係型數據庫表不存在主鍵時:
A、allowinsert模式時,為全部數據追加導入到數據庫表;
B、updateonly模式時,為更新目標數據庫表存的內容,並且原來不存在的數據也不導入到數據庫表;
3、當不指定update-key,且關係型數據庫表存在主鍵時:
A、allowinsert模式時,報主鍵衝突,數據無變化;
B、updateonly模式時,報主鍵衝突,數據無變化;
4、當不指定update-key,且關係型數據庫表不存在主鍵時:
A、allowinsert模式時,為全部數據追加導入到數據庫表;
B、updateonly模式時,為全部數據追加導入到數據庫表;
實際案例:
(1)mysql批量導入hive
使用shell腳本:
筆者目前用sqoop把mysql數據導入到Hive中,最後實現命令行導入,sqoop版本1.4.7,實現如下
最後需要把這個導入搞成job,每天定時去跑,實現數據的自動化增量導入,sqoop支持job的管理,可以把導入創建成job重複去跑,並且它會在metastore中記錄增值,每次執行增量導入之前去查詢
創建job命令如下
創建完job就可以去執行它了
sqoop job –exec users
可以把該指令設為Linux定時任務,或者用Azkaban定時去執行它
hive導出到MySQL時,date類型數據發生變化?
問題原因:時區設置問題,date -R查看服務器時間,show VARIABLES LIKE “%time_zone”查看Mysql時間,system並不表示中國的標準時間,要將時間設置為東八區
(1):對市面上最流行的兩種調度器,給出以下詳細對比,以供技術選型參考。總體來說,ooize相比azkaban是一個重量級的任務調度系統,功能全面,但配置使用也更複雜。如果可以不在意某些功能的缺失,輕量級調度器azkaban是很不錯的候選對象。
(2):功能:
兩者均可以調度mapreduce,pig,java,腳本工作流任務;
兩者均可以定時執行工作流任務;
(3):工作流定義:
Azkaban使用Properties文件定義工作流;
Oozie使用XML文件定義工作流;
(4):工作流傳參:
Azkaban支持直接傳參,例如${input};
Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)};
(5):定時執行:
Azkaban的定時執行任務是基於時間的;
Oozie的定時執行任務基於時間和輸入數據;
(6):資源管理:
Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作;
Oozie暫無嚴格的權限控制;
(7):工作流執行:
Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一台節點)和multi server mode(executor server和web server可以部署在不同節點);
Oozie作為工作流服務器運行,支持多用戶和多工作流;
(8):工作流管理:
Azkaban支持瀏覽器以及ajax方式操作工作流;
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流;
瀏覽器頁面訪問
使用Oozie時通常整合hue,用戶數據倉庫調度
就是剛才選擇的腳本
腳本里需要的參數,盡量設置為動態自動獲取,如 ${date}
第一步的參數是所有文件和當天日期,後面的只需要日期,最後一步是導出所有結果,相應填入
添加文件和設置相應參數
運行後會有狀態提示頁面,可以看到任務進度
點擊調度任務的頁面情況
修改定時任務名和描述
添加需要定時調度的任務
sm-workflow的參數都是寫死的,沒有設置動態,這裡的下拉列表就不會有可選項。
設置參數
將sm-workflow的日期修改為 ${do_date},保存
進入定時計劃sm-dw中,會看到有參數 do_date
填入相應參數,前一天日期
Oozie常用系統常量
當然,也可以通過這樣將參數傳入workflow任務中,代碼或者shell中需要的參數。
如,修改sm-workflow 中的 sqoop_import.sh,添加一個參數 ${num}。
編輯文件(需要登陸Hue的用戶有對HDFS操作的權限),修改shell中的一個值為參數,保存。
在workflow中,編輯添加參數 ${num} ,或者num=${num} 保存。
進入schedule中,可以看到添加的參數,編輯輸入相應參數即可。
Bundle統一管理所有定時調度,階段劃分:Bundle Schedule workflow
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/227366.html