從E-MapReduce-2.4.0(以下簡稱 EMR) 版本開始,E-MapReduce支持了統一元數據管理,在E-MapReduce-2.4.0版本之前,用戶所有集群均採用的是集群本地的mysql數據庫作為Hive元數據庫,在E-MapReduce-2.4.0版本以及之後的版本中, E-MapReduce 會支持統一的高可靠的 Hive元數據庫。
介紹
統一的元數據管理,可以實現:
-
持久化的元數據存儲。
之前元數據都是在集群內部的mysql數據庫,元數據會隨著集群的釋放而丟失,特別是EMR提供了靈活按量模式,集群可以按需創建用完就釋放。如果用戶需要保留現有的元數據信息,必須登錄集群手動將元數據信息導出。支持統一的元數據管理之後,不再存在該問題。 -
更方便地實現計算存儲分離。
EMR上可以支持將數據存放在阿里雲OSS中,在大數據量的情況下將數據存儲在OSS上會大大降低使用的成本,EMR集群主要用來作為計算資源,在計算完成之後機器可以隨時釋放,數據在OSS上,同時也不用再考慮元數據遷移的問題。
更方便地實現數據共享。
使用統一的元數據庫,如果用戶的所有數據都存放在OSS之上,則不需要做任何元數據的遷移和重建,所有集群都是可以直接訪問數據,這樣每個EMR集群可以做不同的業務,但是可以很方便地實現數據的共享。
說明 在支持統一元數據之前,元數據是存儲在每個集群本地環境的Mysql數據庫中,所以元數據會隨著集群的釋放而被清理。在支持統一元數據之後,釋放集群不會清理元數據信息。所以,在任何時候刪除OSS上或者集群HDFS上數據(包括釋放集群操作)的時候,需要先確認該數據對應的元數據已經刪除(即要刪掉數據對應的表和數據庫),否則元數據庫中可能出現一些髒數據。
使用限制
當前元數據庫需要使用公網IP來連接,所以集群必須要有公網IP,同時請不要隨意的切換公網IP地址,防止對應的數據庫白名單失效。
只有在創建集群的時候打開了統一元數據庫這個開關才能使用表管理的功能,如果是本地的元數據庫,目前還不支持在控制檯頁面上管理。可以使用集群上的Hue工具來進行管理。
E-MapReduce後臺RDS統一管理元數據的方式,僅限小容量的用戶使用。對於需要大容量建議您自建RDS作為統一元數據。默認限制為:
- 總容量:200MiB。
- 小時query數量限制: 720000/h。
- 小時update數量限制: 144000/h。
創建使用統一元數據的集群
頁面方式 。
創建集群時,在基礎配置頁面,打開統一 meta 數據庫開關。
API方式 。
參考API文檔中的 CreateClusterV2 定義,請指定此選項:useLocalMetaDb=false。
元數據基本操作
說明 EMR控制檯統一元數據管理頁面,當前只對使用統一元數據的集群生效,且必須有活躍中的統一元數據集群。
- 數據庫操作。
可根據庫名查找庫,單擊庫名可查看當前庫的所有表。
注意 刪除數據庫之前,必須刪除數據庫下所有表。
- 表操作。
表創建:當前僅支持外部表創建和分區表創建。分隔符不僅支持普通的逗號、空格等字符,還支持四種特殊字符:TAB、^A、^B 和 ^C,或者自定義分隔符。
- 表詳情。
分區查看:對於分區表,可以在表詳情 > 分區信息頁面查看分區列表,最多顯示10000個分區。
注意
- 如果沒有任何E-MapReduce集群,不支持進行對數據庫和表的創建和刪除操作。
- 由於HDFS是每個集群內部文件系統,在沒有進行特殊的網絡環境設置的情況下,不同集群之間的HDFS無法相互訪問的,所以 EMR 表管理功能對數據庫和表的創建只支持基於OSS文件系統。
- 數據庫和表的location都不能選擇整個OSS bucket,需要選擇到OSS bucket下面的目錄。
-元數據庫信息。
可以在元數據庫信息頁查看當前 RDS 的用量和使用限制,如需修改,請提交工單。
常見問題
Wrong FS
oss://yourbucket/xxx/xxx/xxx 或 Wrong FS: hdfs://yourhost:9000/xxx/xxx/xxx
出現這個問題,是由於刪除OSS上的表數據之前,沒有刪除數據表對應的元數據。導致表的schema還在,但實際的數據已不存在或已移動到別的路徑。可以先修改表的location為一個存在的路徑,然後再刪除表。
alter table test set location 'oss://your_bucket/your_folder'
該操作可以直接在EMR控制檯的交互式控制檯中完成。
說明 oss://your_bucket/your_folder必須是一個存在的OSS路徑。
刪除hive database的時候
出現:java.lang.IllegalArgumentException: java.net.UnknownHostException: xxxxxxx
出現該問題的原因,是因為在之前的集群之上創建了Hive的數據庫,並且數據庫的位置是落在之前集群的HDFS之上,但是在集群釋放的時候,沒有清理掉對應的hive database,導致新建集群之後,沒法訪問到之前已經釋放集群的HDFS數據。所以如果是手動創建了在HDFS之上的數據庫和表,在釋放集群的時候請記得清理。
解決方案:
首先,通過命令行登錄到集群master節點上,找到hive meta db的訪問地址和用戶名密碼信息,在$HIVE_CONF_DIR/hive-site.xml中,找到對應屬性。
javax.jdo.option.ConnectionUserName //對應數據庫用戶名;
javax.jdo.option.ConnectionPassword //對應數據庫訪問密碼;
javax.jdo.option.ConnectionURL //對應數據庫訪問地址和庫名;
在集群master節點上登錄hive meta db:
mysql -h ${DBConnectionURL} -u ${ConnectionUserName} -p [回車]
[輸入密碼]${ConnectionPassword}
登錄上hive meta db之後,修改對應hive database的location為該region真實存在的OSS路徑即可:
阿里巴巴開源大數據技術團隊成立Apache Spark中國技術社區,定期推送精彩案例,技術專家直播,問答區近萬人Spark技術同學在線提問答疑,只為營造純粹的Spark氛圍,歡迎釘釘掃碼加入!
對開源大數據和感興趣的同學可以加小編微信(下圖二維碼,備註“進群”)進入技術交流微信群。
Apache Spark技術交流社區公眾號,微信掃一掃關注