https://juejin.im/post/5e5e0758e51d4526f55f0bdahtml
MaxCompute 是阿里巴巴自研的旗艦大數據倉庫服務,與開源 Hadoop 搭建的數倉相比,一個很大的不一樣點是 MaxCompute 並不直接開放相似 HDFS 這樣的分佈式文件系統的接口,數據進出 MaxCompute 都要經由結構化數據通道 Tunnel。所以已經使用 Hadoop 建倉的用戶在選擇 MaxCompute 時,首先須要考慮的問題是數據怎麼搬遷。java
目前其實有多種途徑將數據遷移至 MaxCompute,下表分別列出各類途徑的優缺點及適用場景:node
搬遷形式 | 須要使用的工具/服務 | 原理 | 適用場景 |
---|---|---|---|
數據集成 | DataWorks | 數據集成提供資源執行做業,拉取數據 | - 數據集成支持的數據源 - 表數量有限(目前須要按表單獨配置) |
MMA: 閃電立方 | MMA、閃電立方、OSS | 1. 郵寄閃電立方設備進入用戶機房進行本地拷貝 1. 閃電立方郵寄回阿里雲並掛載到 OSS 1. MaxCompute 經過 OSS 外表機制導入數據 |
- MaxC 外表支持的文件格式 - 大數據量一次性搬遷 - 機房出口帶寬受限或不具有安裝專線條件 |
MMA: Hive SQL | MMA | 使用客戶 Hadoop 集羣資源執行 Hive SQL,經過 UDTF 的形式讀取數據並寫入 MaxCompute | - 最好的數據格式支持(包括 Hive 外表) - 數據量有限或具有到阿里雲的專線 - 現有集羣可以承擔搬站任務的資源負載 |
表格中的 MMA 爲 MaxCompute Migrate Assist 的縮寫,是一套輔助 Hadoop 用戶搬遷數據的工具。這套工具能夠自動化批量爬取 Hive Meta,建立對應的 MaxCompute 表和分區,爲客戶 Hadoop 集羣生成配套的 Hive SQL 搬遷任務或爲 OSS 外表生成 MaxCompute 外表導入任務,並可以自動調度、監督、管理這些任務的執行,以及數據搬遷完畢後的校驗工做,從而大大簡化搬站中的手工操做步驟。apache
本文主要討論使用 MMA: Hive SQL 形式進行大規模數據搬站時的常見問題及解法。bash
MMA 搬站工具的原理是在用戶側的 Hadoop 集羣執行 Hive SQL讀取數據,並使用 UDTF 經過 Tunnel 將數據寫入 MaxCompute。所以,MMA 搬站任務重度依賴於 Hive SQL 在客戶集羣的正常運行,背後其實體現對 Hadoop 集羣的管理運維水平。當集羣負載較高或狀況複雜時,搬站做業可能會因多種緣由失敗而延遲搬遷進度。併發
首先常見的問題是 OOM。MMA 使用 MR 模式執行 Hive SQL,由於當輸入表文件很是多,hive cli 在進行 SQL 解析並生成 MR 任務時很是容易內存不足。app
現象是 hive cli 會消耗較長時間頻繁 Full GC,並最終因內存不足退出:運維
FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. GC overhead limit exceeded複製代碼
FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Java heap space複製代碼
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main-EventThread"複製代碼
由於內存不足發生在客戶端,所以須要調大 hive cli 的 Xmx 設置,如 HADOOP_CLIENT_OPTS。但具體設置生效的作法可能會因 Hadoop 部署版本不一樣,並且由於某些 Hadoop 版本 bug 的緣由,在 java 進程啓動參數中可能有多個 Xmx,比較難以準確找到並控制實際生效的參數,所以,MMA 提供了一個更加直接的解決辦法:找到 hadoop 的啓動腳本(不一樣版本的 Hadoop 部署也會稍微不一樣,這裏以 Aliyun E-MapReduce 爲例),在 exec java 的 class 前加上 MMA_OPTS 環境變量(以下),MMA 會在調用 hive cli 時經過 MMA_OPTS 將搬站做業的 Xmx 控制在 5GB,同時不影響集羣現有的默認配置。分佈式
[root@emr-header-1 bin]# which hadoop /usr/lib/hadoop-current/bin/hadoop [root@emr-header-1 bin]# tail /usr/lib/hadoop-current/bin/hadoop HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS" #make sure security appender is turned off HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,NullAppender}" export CLASSPATH=$CLASSPATH exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $MMA_OPTS $CLASS "$@" ;; esac複製代碼
搬站做業失敗或者不穩定的另外一大類緣由則跟 HDFS 相關。工具
Caused by: java.io.IOException: Cannot obtain block length for LocatedBlock{BP-2042735465-10.1.5.152-1530865291994:blk_1789042978_715673405; getBlockSize()=1724740; corrupt=false; offset=0; locs=[DatanodeInfoWithStorage[10.40.11.121:50010,DS-ad53ff64-1a7c-4656-b89e-180b8f53bd20,DISK], DatanodeInfoWithStorage[10.40.11.79:50010,DS-dd8bc397-2889-4e04-842b-e1b5eee3bdec,DISK], DatanodeInfoWithStorage[10.40.11.83:50010,DS-2fc4ff46-47aa-41bb-932f-080456fccbd7,DISK]]}複製代碼
一般是軟件 bug 致使(Flume 常見),解決辦法參考文檔,須要使用 hdfs 工具對指定文件作 recoverLease 操做
hdfs debug recoverLease -path <path-of-the-file> -retries 3複製代碼
Caused by: java.io.IOException: Could not obtain the last block locations.複製代碼
輸入表文件缺失了 block,須要對錶對應的 hdfs location 進行 fsck。
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.io.IOException: Unable to close file because the last block BP-2042735465-10.1.5.152-1530865291994:blk_2290288983_1218244259 does not have enough number of replicas.複製代碼
MMA 搬站做業在執行完畢以後,會向 HDFS 寫入少許做業相關信息(Hive SQL 默認行爲,非 MMA 刻意爲之),若是 HDFS IO 負載特別高,有機率因寫入失敗致使做業失敗。
此時能夠選擇重跑做業,固然還有必定機率失敗,因此根治的辦法是減輕 HDFS 的 IO 壓力。IO 壓力可能來自隨 Hadoop 集羣混部的其餘系統,如 Presto。配置減小 Presto 實例數量能夠緩解問題,提高搬站任務的成功率。
MMA 搬站做業是執行在客戶 Hadoop 集羣的 Hive SQL,所以,搬遷的效率實際上由做業可以併發的 Container 數量,集羣出口帶寬,以及 MaxCompute Tunnel 服務的入口帶寬限制三者構成。
MMA 搬站做業爲簡單的讀數據寫 Tunnel 操做,單個 Container 使用的 CPU 和內存都很是受控,一般使用 Yarn 默認配置能夠知足需求。若是由於集羣默認配置被人爲改動過,額外供給了 CPU 及內存,只會形成浪費。咱們建議保持每一個 Container 默認 1 vcore,不超過 4GB。能夠經過調整集羣如下參數來下降對集羣 cpu 的浪費(MMA 搬站做業是 Map only 的 SQL,但校驗做業帶有 reducer)
mapreduce.map.cpu.vcore | 1 | |
---|---|---|
mapreduce.map.memory.mb | 4096 | MMA 對做業內存沒有高要求,此處可按照集羣總體 CPU 和 Memory 配比來配置 |
mapreduce.reduce.cpu.vcore | 1 |
當 Hadoop 集羣處於資源超賣狀態且實際內存使用負載較高時,MMA 任務容易由於內存不足而失敗(此時內存不足的問題發生在 Hadoop 集羣而非提交做業的客戶端)。
在 Hadoop 與 Presto 混合部署的場景中,Presto 極可能不只有很高的 IO 負載,在繁忙時段還會消耗大量的內存,進而影響 Hive SQL 做業的正常運行。典型的報錯以下:
# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 232259584 bytes for committing reserved memory.複製代碼
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000007aa780000, 232259584, 0) failed; error='Cannot allocate memory' (errno=12)複製代碼
此時減少 MMA 做業併發能夠在必定程度上下降做業失敗的機率,根本性的作法須要控制 Presto 內存使用。
查看更多:https://yqh.aliyun.com/detail/6614?utm_content=g_1000106112
上雲就看雲棲號:更多雲資訊,上雲案例,最佳實踐,產品入門,訪問:https://yqh.aliyun.com/