前言
離線安裝好CDH、Coudera Manager之后,通過Coudera Manager安裝所有自帶的應用,包括hdfs、hive、yarn、spark、hbase等應用,過程很是波折,此處就不抱怨了,直接進入主題。
描述
在安裝有spark的節點上,通過spark-shell啟動spark,滿懷期待的啟動spark,but,來了個晴天霹靂,報錯了,報錯了!錯誤信息如下:

18/06/11 17:40:27 ERROR spark.SparkContext: Error initializing SparkContext. java.lang.IllegalArgumentException: Required executor memory (1024+384 MB) is above the max threshold (1024 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'. at org.apache.spark.deploy.yarn.Client.verifyClusterResources(Client.scala:281) at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:140) at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57) at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:158) at org.apache.spark.SparkContext.<init>(SparkContext.scala:538) at org.apache.spark.repl.SparkILoop.createSparkContext(SparkILoop.scala:1022) at $line3.$read$$iwC$$iwC.<init>(<console>:15) at $line3.$read$$iwC.<init>(<console>:25) at $line3.$read.<init>(<console>:27) at $line3.$read$.<init>(<console>:31) at $line3.$read$.<clinit>(<console>) at $line3.$eval$.<init>(<console>:7) at $line3.$eval$.<clinit>(<console>) at $line3.$eval.$print(<console>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1045) at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1326) at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:821) at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:852) at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:800) at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:857) ....................后面還有很多錯誤信息
仔細查看錯誤信息之后發現,原來是yarn配置的內存不夠,spark啟動需要1024+384 MB的內存,但是我的yarn配置僅有1024 MB,不夠滿足spark啟動要求,所以拋出異常,關鍵錯誤信息如下圖所示:
解決方法
登錄Cloudera Manager,找到YARN (MR2 Included),點擊進如(不要在意我的集群有那么多警告和報錯,解決spark問題是關鍵),如下圖所示:
在導航欄找到 配置 選項,如下圖所示:
點擊進入 配置 頁面,在搜索欄中輸入yarn.scheduler.maximum-allocation-mb,如下圖所示:
可以看到,該配置參數的值正如spark啟動時拋出的異常所示,為1GB,將其修改為2GB即可,點擊保存更改,如下圖所示:
按照上述的步驟,繼續修改yarn.nodemanager.resource.memory-mb 參數的值為2GB,如下圖所示,點擊保存更改,重啟yarn使設置生效。
返回到spark節點命令行里面執行spark-shell命令,奇怪,仍然報錯,但錯誤為其他,不再是上面的錯誤,錯誤信息為

18/06/11 17:46:46 ERROR spark.SparkContext: Error initializing SparkContext. org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkFsPermission(DefaultAuthorizationProvider.java:279) at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:260) at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:240) at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkPermission(DefaultAuthorizationProvider.java:162) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:152) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3530) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3513) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:3495) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAccess(FSNamesystem.java:6649) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:4420) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInt(FSNamesystem.java:4390) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:4363) ...........................后面還有很多不重要的
關鍵錯誤信息如下圖所示:
原因是啟動spark的用戶權限不夠,我是使用root命令啟動spark,需要hdfs用戶啟動spark(注:hdfs是hadoop的超級用戶),所以報錯,切換到hdfs用戶下,再次啟動是spark,成功。
補充
yarn.scheduler.maximum-allocation-mb 參數的作用:該參數在yarn-site.xml配置文件中配置,設置yarn容器的最大分配內存,以MB為單位,如果yarn資源管理器(RM/ResourceManager)中的容器請求的資源大於此處設置的值,就會拋出無效資源請求異常(InvalidResourceRequestException)。
yarn.nodemanager.resource.memory-mb參數的作用:該參數在yarn-site.xml配置文件中配置,設置yarn節點上可用的物理內存,默認大小為8192(MB),該內存可用於分配給yarn容器。