本文匯總了數據開發時的常見問題。
作業問題:
異常診斷:
功能使用:
環境變量過多或者參數值過長時,為什么提交作業失敗?
問題現象:提交作業時,報錯信息如下。
Message: FailedReason:FailedReason:[[JOB_ENGINE][JOB_ENGINE_START_JOB_FAILED/ERR-200001] Failed to execute job: [FJ-xxxx]].
問題分析:數據開發系統存在單項目變量總數和長度限制。如果環境變量過多或者參數值過長(大于1024)都會導致提交作業失敗。
解決方案:如果確實存在大量需要編輯的變量,請分項目添加變量,確保單項目變量數和長度較小。
為什么Shell作業狀態和相關的YARN Application狀態不一致?
問題現象:在數據開發頁面編輯Shell作業類型,任意編寫一個會拉起YARN Application的作業,例如hive -f xxx.sql。在YARN Application未結束前,單擊作業終止按鈕,此時數據開發作業狀態為KILLED,但YARN Application仍然會繼續運行,直到自然結束。
問題分析:終止Shell作業時會給Shell進程發送終止信號,如果YARN Application的驅動程序和Shell進程不存在父子進程關系,則YARN Application不會隨Shell進程的終止而終止。例如Hive、sqoop、spark-submit(cluster模式)均存在這種情況。
解決方案:建議不要使用Shell類型作業開發Hive、Spark或Sqoop等作業,盡可能使用原生作業類型(例如,Hive、Spark或Sqoop等類型)進行開發,這些作業類型存在一定的關聯機制,可以確保作業驅動程序本身和YARN Application狀態的一致性。
創建作業和執行計劃的區別是什么?
創建作業
在E-MapReduce中創建作業,實際只是創建了作業如何運行的配置,該配置中包括該作業要運行的JAR包、數據的輸入輸出地址以及一些運行參數。該配置創建好后,給它命名即定義了一個作業。
執行計劃
執行計劃是將作業與集群關聯起來的一個紐帶:
可以把多個作業組合成一個作業序列。
可以為作業準備一個運行集群(或者自動創建出一個臨時集群或者關聯一個已存在的集群)。
可以為這個作業序列設置周期執行計劃,并在完成任務后自動釋放集群。
可以在執行記錄列表上查看每一次執行的情況與對應的日志。
如何查看作業運行記錄?
提交作業后,您可以通過數據開發控制臺或YARN UI方式查看作業運行記錄。
數據開發控制臺方式
該方式適用于通過控制臺方式創建并提交作業的場景。
作業運行后,您可以在日志頁簽中查看作業運行的日志。
單擊運行記錄頁簽,可以查看作業實例的運行情況。
單擊目標運行記錄右側的詳情,跳轉到運維中心,可以查看作業實例信息、提交日志和YARN容器列表。
YARN UI方式
該方式適用于通過控制臺方式和命令行方式創建并提交作業的場景。
開啟8443端口。
在目標集群的集群管理頁簽下,單擊左側菜單訪問鏈接與端口。
單擊YARN UI后面的鏈接。
在使用Knox賬號訪問YARN UI頁面時,需要Knox賬號的用戶名和密碼。
在Hadoop控制臺,單擊目標作業的ID,可以查看作業運行的詳情。
如何在OSS上查看日志?
在E-MapReduce數據開發的頁面,找到對應的工作流實例,單擊運行記錄。
在運行記錄區域,單擊待查看工作流實例所在行的詳情,在作業實例信息頁面查看執行集群ID。
在日志保存目錄OSS://mybucket/emr/spark下,查找執行集群ID目錄。
在OSS://mybucket/emr/spark/clusterID/jobs目錄下會按照作業的執行ID存放多個目錄,每個目錄下存放了這個作業的運行日志文件。
讀寫MaxCompute時,報錯java.lang.RuntimeException.Parse response failed: ‘<!DOCTYPE html>…’
問題分析:可能是MaxCompute Tunnel Endpoint填寫錯誤。
解決方法:輸入正確的MaxCompute Tunnel Endpoint,詳情請參見Endpoint。
多個ConsumerID消費同一個Topic時為什么TPS不一致?
有可能這個Topic在公測或其他環境創建過,導致某些Consumer組消費數據不一致。
E-MapReduce中是否可以查看Worker上的作業日志?
可以。您可以通過YARN UI的方式查看Worker上的日志,詳細信息請參見YARN UI方式。
為什么Spark Streaming作業已經結束,但是E-MapReduce控制臺顯示作業還處于“運行中”狀態?
問題分析:Spark Streaming作業的運行模式是Yarn-Client。
解決方法:因為E-MapReduce對Yarn-Client模式的Spark Streaming作業的狀態監控存在問題,所以請修改為Yarn-Cluster模式。
報錯“Error: Could not find or load main class”
檢查作業配置中作業JAR包的路徑協議頭是否是ossref
,如果不是請改為ossref
。
如何在MR作業中使用本地共享庫?
您可以在阿里云E-MapReduce控制臺,YARN服務的配置頁面,修改mapred-site.xml頁簽如下參數。
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m -Djava.library.path=/usr/local/share/</value>
</property>
<property>
<name>mapreduce.admin.user.env</name>
<value>LD_LIBRARY_PATH=$HADOOP_COMMON_HOME/lib/native:/usr/local/lib</value>
</property>
如何在MR或Spark作業中指定OSS數據源文件路徑?
您可以在作業中指定輸入輸出數據源時使用OSS URL: oss://[accessKeyId:accessKeySecret@]bucket[.endpoint]/object/path
形式,類似hdfs://
。
您在操作OSS數據時:
(建議)E-MapReduce提供了MetaService服務,支持免AccessKey訪問OSS數據,直接寫oss://bucket/object/path。
(不建議)可以將AccessKey ID,AccessKey Secret以及Endpoint配置到Configuration(Spark作業是SparkConf,MR作業是Configuration)中,也可以在URI中直接指定AccessKey ID、AccessKey Secret以及Endpoint。
如何查看E-MapReduce服務的日志?
登錄Master節點在/mnt/disk1/log中查看對應服務的日志。
報錯"No space left on device"
問題分析:
Master或Worker節點空間不足,導致作業失敗。
磁盤空間滿導致本地Hive元數據庫(MySQL Server)異常,Hive Metastore連接報錯。
解決方法:清理Master節點磁盤空間、系統盤的空間以及HDFS空間。
訪問OSS或LogService時報錯ConnectTimeoutException或ConnectionException
問題分析:OSS Endpoint需要配置為公網地址,但EMR Worker節點并無公網IP,所以無法訪問。
解決方法:
修改OSS Endpoint地址為內網地址。
使用EMR metaservice功能,不指定Endpoint。
例如
select * from tbl limit 10
可以正常運行,但是執行Hive SQL: select count(1) from tbl
時報錯。修改OSS Endpoint地址為內網地址。alter table tbl set location "oss://bucket.oss-cn-hangzhou-internal.aliyuncs.com/xxx" alter table tbl partition (pt = 'xxxx-xx-xx') set location "oss://bucket.oss-cn-hangzhou-internal.aliyuncs.com/xxx"
如何清理已經完成作業的日志數據?
問題描述:集群的HDFS容量被寫滿,發現/spark-history下有大量的數據。
解決方法:
在Spark配置頁面的服務配置區域,查看是否有spark_history_fs_cleaner_enabled參數:
是:修改參數值為true,可以周期性清理已經完成的作業的日志數據。
否:在spark-defaults頁簽下,單擊自定義配置,新增spark_history_fs_cleaner_enabled為true。
單擊右上角的
在執行集群操作對話框,輸入執行原因,單擊確定。
在彈出的確認對話框中,單擊確定。
為什么AppMaster調度啟動Task的時間過長?
問題分析:作業Task數目過多或Spark Executor數目過多,導致AppMaster調度啟動Task的時間過長,單個Task運行時間較短,作業調度的Overhead較大。
解決方法:
減少Task數目,使用CombinedInputFormat。
提高前序作業產出數據的Block Size(dfs.blocksize)。
提高mapreduce.input.fileinputformat.split.maxsize。
對于Spark作業,在阿里云E-MapReduce控制臺,Spark服務的配置頁面,調節spark.executor.instances減少Executor數目,或者調節spark.default.parallelism降低并發數。
E-MapReduce是否提供實時計算的功能?
E-MapReduce提供Spark Streaming、Storm和Flink三種實時計算服務。
作業參數傳遞至腳本文件該如何處理?
在Hive作業中,您可以通過-hivevar
選項,傳遞作業中配置的參數至腳本中。
準備腳本文件。
腳本文件中引用變量的方式為
${varname}
(例如${rating}
)。本示例中腳本的相關信息如下:腳本名稱:hivesql.hive
腳本的OSS路徑:oss://bucket_name/path/to/hivesql.hive
腳本內容
use default; drop table demo; create table demo (userid int, username string, rating int); insert into demo values(100,"john",3),(200,"tom",4); select * from demo where rating=${rating};
進入數據開發頁面。
通過阿里云賬號登錄阿里云E-MapReduce控制臺。
在頂部菜單欄處,根據實際情況選擇地域和資源組。
單擊上方的數據開發頁簽。
單擊待編輯項目所在行的作業編輯。
新建Hive類型作業。
在頁面左側,在需要操作的文件夾上單擊右鍵,選擇新建作業。
在新建作業對話框中,輸入作業名稱和作業描述,從作業類型下拉列表中選擇Hive作業類型。
單擊確定。
編輯作業內容。
在基礎設置頁面,設置參數的Key和Value,其中Key為腳本文件中的變量名,必須與腳本一致,例如rating。
作業內容中必須添加
-hivevar
選項,以便傳遞作業中配置的參數值至腳本變量。-hivevar rating=${rating} -f ossref://bucket_name/path/to/hivesql.hive
執行作業。
本示例執行結果如下。
如何使用阿里云E-MapReduce HDFS的Balancer功能以及參數調優?
登錄待配置集群任意節點。
執行以下命令,切換到hdfs用戶并執行Balancer參數。
su hdfs /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 10
執行以下命令,查看Balancer運行情況:
方式一
less /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
方式二
tailf /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
說明當提示信息包含
Successfully
字樣時,表示執行成功。Balancer的主要參數。
參數
描述
Threshold
默認值為10%,表示上下浮動10%。
當集群總使用率較高時,需要調小Threshold,避免閾值過高。
當集群新增節點較多時,您可以適當增加Threshold,使數據從高使用率節點移向低使用率節點。
dfs.datanode.balance.max.concurrent.moves
默認值為5。
指定DataNode節點并發移動的最大個數。通常考慮和磁盤數匹配,推薦在DataNode端設置為
4 * 磁盤數
作為上限,可以使用Balancer的值進行調節。例如:一個DataNode有28塊盤,在Balancer端設置為28,DataNode端設置為
28*4
。具體使用時根據集群負載適當調整。在負載較低時,增加concurrent數;在負載較高時,減少concurrent數。說明DataNode端需要重啟來刷新配置。
dfs.balancer.dispatcherThreads
Balancer在移動Block之前,每次迭代時查詢出一個Block列表,分發給Mover線程使用。
說明dispatcherThreads是該分發線程的個數,默認為200。
dfs.balancer.rpc.per.sec
默認值為20,即每秒發送的rpc數量為20。
因為分發線程調用大量getBlocks的rpc查詢,所以為了避免NameNode由于分發線程壓力過大,需要控制分發線程rpc的發送速度。
例如,您可以在負載高的集群調整參數值,減小10或者5,對整體移動進度不會產生特別大的影響。
dfs.balancer.getBlocks.size
Balancer會在移動Block前,每次迭代時查詢出一個Block列表,給Mover線程使用,默認Block列表中Block的大小為2GB。因為getBlocks過程會對RPC進行加鎖,所以您可以根據NameNode壓力進行調整。
dfs.balancer.moverThreads
默認值為1000。
Balancer處理移動Block的線程數,每個Block移動時會使用一個線程。
dfs.namenode.balancer.request.standby
默認值為false。
Balancer是否在Standby NameNode上查詢要移動的Block。因為此類查詢會對NameNode加鎖,導致寫文件時間較長,所以HA集群開啟后只會在Standby NameNode上進行查詢。
dfs.balancer.getBlocks.min-block-size
Balancer查詢需要移動的參數時,對于較小Block(默認10 MB)移動效率較低,可以通過此參數過濾較小的Block,增加查詢效率。
dfs.balancer.max-iteration-time
默認值為1200000,單位毫秒。
Balancer一次迭代的最長時間,超過后將進入下一次迭代。
dfs.balancer.block-move.timeout
默認值為0,單位毫秒。
Balancer在移動Block時,會出現由于個別數據塊沒有完成而導致迭代較長的情況,您可以通過此參數對移動長尾進行控制。
DataNode的主要參數。
參數
描述
dfs.datanode.balance.bandwidthPerSec
指定DataNode用于Balancer的帶寬,通常推薦設置為100 MB/s,您也可以通過dfsadmin -setBalancerBandwidth 參數進行適當調整,無需重啟DataNode。
例如,在負載低時,增加Balancer的帶寬。在負載高時,減少Balancer的帶寬。
dfs.datanode.balance.max.concurrent.moves
指定DataNode上同時用于Balancer待移動Block的最大線程個數。
如果E-MapReduce控制臺上沒有自定義配置選項,該如何處理?
登錄集群的Master節點。
進入配置模板的目錄。
cd /var/lib/ecm-agent/cache/ecm/service/HUE/4.4.0.3.1/package/templates/
本示例以
HUE
為例:HUE
表示服務的目錄。4.4.0.3.1
為Hue的版本。hue.ini
為配置文件。
執行以下命令,添加您需要的配置。
vim hue.ini
當配置項已存在時,您可以根據時間情況修改參數值。
在E-MapReduce控制臺,重啟服務以生效配置。
使用數據開發提交的作業一直處于Submit狀態,該如何處理?
問題現象如下圖所示。
出現此問題,通常是因為EMRFLOW中部分組件狀態錯誤,您需要在控制臺重啟狀態錯誤的組件。
進入EMRFLOW頁面。
進入任意服務頁面,修改訪問鏈接后的服務名為EMRFLOW。
說明本示例是先進入HDFS服務頁面。
單擊部署拓撲頁簽。
啟動組件。
在部署拓撲頁簽,單擊組件處于STOPPED狀態操作列的啟動。
在執行集群操作對話中,輸入執行原因,單擊確定。
在確認對話中,單擊確定。
查看日志信息,檢查組件是否啟動。
單擊上方的查看操作歷史。
在操作歷史對話框中,單擊操作類型列的Start EMRFLOW FlowAgentDaemon。
單擊主機名列的emr-header-1。
單擊任務名列的START_FlowAgentDaemon_ON_emr-header-1。
當任務日志區域,提示如下圖所示時表示組件啟動成功。
說明組件啟動后,如果還有報錯,請根據日志信息排查并處理。如果報錯信息提示權限問題,您可以先通過SSH方式登錄集群,執行命令
sudo chown flowagent:hadoop /mnt/disk1/log/flow-agent/*
處理,然后按照上述步驟重新操作以重啟狀態錯誤的組件。