Cloudera 安裝完成后的其他設(shè)定以及spark程序運(yùn)行時(shí)出現(xiàn)的問(wèn)題

前情提要:目前正在學(xué)習(xí)大數(shù)據(jù)方面的知識(shí),于是在4臺(tái)VM上搭建環(huán)境,使用的是Cloudera Parcels安裝法,所以Hadoop,spark和Yarn是用CDH自動(dòng)安裝的。

安裝環(huán)境的各個(gè)版本及對(duì)應(yīng)的官方Documentation
centos:6.8
Cloudera EnterPrise 5.9.x : http://www.cloudera.com/documentation/enterprise/latest.html
Spark(1.6.0) : http://spark.apache.org/docs/1.6.0/
Scala (2.10.4) : http://docs.scala-lang.org/zh-cn/overviews/
java version: 1.8.0_111(若是在parcells安裝時(shí)選擇了自動(dòng)安裝jdk,那就別自己再安裝jdk了)
jdk下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
hadoop 2.6.0-cdh5.9.0
jdk安裝方法:搜索 “centos6 安裝JDK”即可,也可以參考“https://shazi.info/centos-6-%E5%AE%89%E8%A3%9D-java-jdk-1-7-0/
安裝JDK一定要注意設(shè)定 JAVA_HOME。
Intelligent Idea : https://www.jetbrains.com/help/idea/2016.3/meet-intellij-idea.html?utm_content=2016.3&utm_medium=help_link&utm_source=from_product&utm_campaign=IC

一 Cloudera 5.9.X安裝完成之后的設(shè)定

1. 增加Host 名稱

在每一臺(tái)電腦都增加所有 VM 的 IP 跟 Host名稱,如下:

vi /etc/hosts

然后增加下面的內(nèi)容
<code>
140.138.77.22 cglab22
140.138.77.23 cglab23
140.138.77.24 cglab24
140.138.77.25 cglab25 </code>

2. 建立 SSH 免密碼登入,概念是 master VM 產(chǎn)生一個(gè) public key 然后丟給所有slave vm認(rèn)證,讓master可以無(wú)密碼ssh登入其他臺(tái) VM。步驟如下:

cglab22( master ):

ssh localhost //目的是建立 ~/.ssh文件夾
ssh-keygen -t rsa //建立public key
cat ./id_rsa.pub >> ./authorized_keys //概念上類似認(rèn)證,做了就可以免密碼ssh登入
scp ~/.ssh/id_rsa.pub cglab25:~/.ssh //將master的public key傳給slave,過(guò)程中需要密碼
cglab23…( slave ):
ssh localhost //目的是建立 ~/.ssh文件夾
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys //概念上類似認(rèn)證,做了就可以免密碼ssh登入
rm ~/.ssh/id_rsa.pub //可以刪掉了

注意:這個(gè)一定要?jiǎng)h掉,因?yàn)樯厦孢@個(gè)過(guò)程只是完成了從master vm到slave vm的ssh免密登錄,而沒(méi)有完成從slave vm到master vm。對(duì)于其他的每個(gè)slave vm,都要重復(fù)上面的這些步驟,而如果沒(méi)有“ rm ~/.ssh/id_rsa.pub ”這一步,就會(huì)覆蓋掉之前的設(shè)定。

對(duì)剩余的slave vm也做相同的步驟
全部完成cglab22、ssh cglab23…之間就可以直接用ssh互相連接,不需要密碼。
參考:http://www.dashen100.com/question/1014

3.設(shè)置防火墻( iptables ),步驟如下:

sudo vi /etc/sysconfig/iptables

<code>-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -s 140.138.77.23 -j ACCEPT // 這邊是新增的IP,slave vm IP
-A INPUT -i eth0 -p tcp -s 140.138.77.24 -j ACCEPT // 這邊是新增的IP,slave vm IP
-A INPUT -i eth0 -p tcp -s 140.138.77.25 -j ACCEPT // 這邊是新增的IP,slave vm IP
-A INPUT -i eth0 -p tcp -s 140.138.150.169 -j ACCEPT //允許查看remote vm 的本地電腦的IP(就是自己的電腦的IP)
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
</code>

sudo service iptables restart //再啟動(dòng)防火墻

4. 關(guān)掉 SELinux

<code>sudo vi /etc/sysconfig/selinux
SELINUX=disabled</code>

5. reboot //重啟

二 Spark程序運(yùn)行時(shí)出現(xiàn)的問(wèn)題

在cloudera環(huán)境配置好之后,第一次運(yùn)行spark程序出現(xiàn)了許多問(wèn)題,以下是幾個(gè)困擾我最久的問(wèn)題:

1. set master url的問(wèn)題

我是用Intelligent Idea來(lái)寫spark程序,在本地端運(yùn)行時(shí)記得要在初始化spark的時(shí)候設(shè)置master url.
Example:
<code>
val conf = new SparkConf().setAppName("TensorTucker")
.setMaster("Local[*]")
val sc = new SparkContext( conf )
TensorTucker.setSparkContext( sc )
</code>

2.jackson.databind的問(wèn)題

這個(gè)問(wèn)題的名字很長(zhǎng),由于是很久之前的錯(cuò)誤,已經(jīng)沒(méi)有出錯(cuò)信息了。如果有人碰到,仔細(xì)看出錯(cuò)信息,如果里面有關(guān)鍵字jackson.databind,也許我的回答會(huì)有幫助。

我把錯(cuò)誤信息放到stackflow上搜索,得到的答案是這是jackson的版本問(wèn)題。因?yàn)槲业腃DH是屬于比較新的版本,所以需要新的jackson jar包來(lái)支持運(yùn)行。由于我采用的是parcels安裝,所以jackson的目錄是:

/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/jars

下面是此目錄中jackson jar包示例

jackson jar示例

可以發(fā)現(xiàn)里面有許多以jackson開頭的jar包,我下載完jackson-core-2.4.4.jar之后放到上面那個(gè)目錄,然后由于jackson-core-2.4.4.jar對(duì)類似于jackson-annotations.jar等其他jar包的版本也有要求,所以我總共在上述目錄添加了一下這幾個(gè)jar包,后面是對(duì)應(yīng)的版本。
jackson-module-scala_2.10-2.4.4.jar
jackson-annotations-2.4.4.jar
jackson-core.jar 2.4.4
jackson-annotations 2.4.4
jackson-databind 2.4.4
paranamer 2.6
jsr305 2.0.1
還修改了 coudera/parcels/CDH/lib/spark/conf/classpath.txt 中與上述jar包對(duì)應(yīng)的版本
然后在程序中重新引入jackson的jar包。
Link:https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305/2.0.1

3.修改了intelligent idea Setting->Build,Execution..->Compiler->Build process heap size(從700改到1500),這可能會(huì)對(duì)解決java out of space的問(wèn)題有幫助。同時(shí)在程序運(yùn)行時(shí)進(jìn)行如下設(shè)定,也對(duì)解決java out of space的問(wèn)題有幫助。

--driver-memory 8G
--num-executors 2
--executor-cores 3
--executor-memory 8G

4.關(guān)于從本地上傳文件到hdfs的問(wèn)題。

安裝CDH時(shí)會(huì)自動(dòng)在hdfs中創(chuàng)建一個(gè)身份 hdfs,路徑是/user/hdfs(這里的 user = root ),所以在hdfs中已經(jīng)有一個(gè)身份和對(duì)應(yīng)路徑了。

然后我自己又在hdfs中創(chuàng)建了一個(gè)新的身份是 root ( 這個(gè)root其實(shí)是我的vm--cglab22的登錄身份 ), 路徑是/user/root 。

所以如果在使用 hdfs dfs -ls的時(shí)候不指定具體的路徑,使用 hdfs dfs -ls 這種類似的命令就會(huì)默認(rèn)查詢當(dāng)前vm身份下的路徑,即默認(rèn)查詢/user/root 路徑。所以要查詢不同身份的文件,應(yīng)該要指定具體的路徑。

總結(jié)起來(lái)就是,首先在hdfs中創(chuàng)建一個(gè)身份root(root就是我登錄VM的身份

hdfs dfs -mkdir /user/root

然后給這個(gè)hdfs 的root身份一個(gè)對(duì)應(yīng)的權(quán)限,如果是登錄vm 是root,則是root權(quán)限,如果是user或xiaoming,則是user或xiaoming的權(quán)限。

hdfs dfs -chown:hadoop /user/root

參考資料:
https://docs.hortonworks.com/HDPDocuments/Ambari-2.1.2.0/bk_ambari_views_guide/content/_setup_HDFS_user_directory.html

5.以yarn-cluster模式運(yùn)行程序時(shí)遇到的問(wèn)題(注意要在Cloudera WebUI 中找到Y(jié)ARN,然后在YARN里找到Resource ManagerWeb UI ,然后找對(duì)應(yīng)程序的log,不僅要看master vm的log,也要看datanode的log),如下圖:
從這里點(diǎn)進(jìn)去看程序運(yùn)行情況

1)SparkContext did not initialize after waiting for 100000 ms 問(wèn)題

問(wèn)題截圖

這個(gè)屬于spark initial的問(wèn)題,很簡(jiǎn)單,是因?yàn)槲以趕park-submit的時(shí)候沒(méi)有加上--class Test(即在給程序打包時(shí)沒(méi)有指定main class ,所以在運(yùn)行時(shí)需要加,若在打包時(shí)已經(jīng)指定了main class,則不需要加)。比如下面這個(gè)寫法,一定要加上主函數(shù)名那一項(xiàng)。
<code>
/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/spark/bin/spark-submit
--class test \ //(主函數(shù)名)
--master yarn \ //(運(yùn)行模式)
--deploy-mode cluster
--driver-memory 8G \
--num-executors 2
--executor-cores 3
--executor-memory 8G
/usr/Code/Test/out/artifacts/Pi_jar/Pi.jar/ 10
</code>

2) ERROR yarn.ApplicationMaster: User class threw exception: java.lang.UnsupportedClassVersionError: MyFixedLengthInputFormat : Unsupported major.minor version 52.0

log

這個(gè)問(wèn)題屬于程序編譯的jdk版本與程序運(yùn)行環(huán)境的版本不一致,我的情況是程序編譯時(shí)jdk1.8.0-111,而運(yùn)行環(huán)境卻是1.7,運(yùn)行環(huán)境的配置可以在spark UI中找到,如下圖:

運(yùn)行環(huán)境

所以我把intelligent Idea的jdk改到了1.7。改動(dòng)的地方如下圖:

改動(dòng)方法

參考stackflow上的回答:http://stackoverflow.com/questions/10382929/how-to-fix-java-lang-unsupportedclassversionerror-unsupported-major-minor-versi

3)在cluster上運(yùn)行程序時(shí),log上的錯(cuò)誤信息:INFO yarn.ApplicationMaster: Unregistering ApplicationMaster with FAILED (diag message: User class threw exception: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user/root/test1":hdfs:hadoop:drwxr-xr-x

又是hdfs 中文件的權(quán)限問(wèn)題,我以hdfs身份創(chuàng)建的test1,test2,其所屬權(quán)限屬于hdfs,所以程序運(yùn)行時(shí)root沒(méi)有權(quán)限對(duì)這兩個(gè)文件進(jìn)行寫操作,所以應(yīng)以root身份創(chuàng)建文件。

6 關(guān)于add host 和delete host

(1)如果在一個(gè)cluster中,需要添加或刪除一個(gè)host,可以去cloudera官網(wǎng)找對(duì)應(yīng)教程,值得注意的是,若是要將一個(gè)host徹底從一個(gè)cluster中移除掉,個(gè)人經(jīng)驗(yàn)是按照 remove host的教程來(lái)做,因?yàn)閐elete host 之后cluster中還是會(huì)出現(xiàn)一些跟這個(gè)刪除掉的host有關(guān)的錯(cuò)誤信息。

(2)add new host 也是去看cloudera的官方文檔,記得一定要安裝與現(xiàn)有CDH一樣的版本。add new host的時(shí)候,驗(yàn)證新host與舊host的關(guān)系時(shí),可能出現(xiàn)swap與Transparent Hugepage Compaction的問(wèn)題
解決方法如下
https://www.cloudera.com/documentation/enterprise/5-3-x/topics/cdh_admin_performance.html

版本問(wèn)題的話,缺什么裝什么好了。
(3)若先delete了一個(gè)host ,比如cglab25,然后又add這個(gè)host,需要重新設(shè)置ssh免密登錄,這個(gè)時(shí)候會(huì)出現(xiàn):warning:remote host identification has changed,是因?yàn)閏glab22-23里的認(rèn)證信息是原來(lái)的cglab25,重新裝系統(tǒng)之后要?jiǎng)h掉其他VM原來(lái)的認(rèn)證資訊,然后才能ssh操作。
command line如下:

ssh-keygen -R <host>

(4)add new host的時(shí)候,驗(yàn)證新host與舊host的關(guān)系時(shí),可能出現(xiàn)swap與Transparent Hugepage Compaction的問(wèn)題
解決方法如下:
https://www.cloudera.com/documentation/enterprise/5-3-x/topics/cdh_admin_performance.html

7 若CDH Manager中出現(xiàn)類似 Blocks missing 或 replicated的問(wèn)題,

參考答案為:
http://community.cloudera.com/t5/Storage-Random-Access-HDFS/How-to-fix-missing-and-underreplicated-blocks/td-p/20020

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容