MaxCompute 搬站的原理、實踐以及常見問題

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: Hive SQL 常見問題及解法

MMA 搬站工具的原理是在用戶側的 Hadoop 集羣執行 Hive SQL讀取數據,並使用 UDTF 經過 Tunnel 將數據寫入 MaxCompute。所以,MMA 搬站任務重度依賴於 Hive SQL 在客戶集羣的正常運行,背後其實體現對 Hadoop 集羣的管理運維水平。當集羣負載較高或狀況複雜時,搬站做業可能會因多種緣由失敗而延遲搬遷進度。併發


做業規模問題:OOM

首先常見的問題是 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

搬站做業失敗或者不穩定的另外一大類緣由則跟 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。

  • HDFS IO 負載太高致使寫出文件機率失敗
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 實例數量能夠緩解問題,提高搬站任務的成功率。


資源問題:vcore 優化

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


資源問題:memory 優化

當 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/

相關文章
相關標籤/搜索