前面將Cloudera Manager安裝到集群上的一台主機后,並通過Cloudera manager安裝了hadoop-2.6.0-CDH5.4.4。今日來測試安裝的集群是否很夠很好的執行mapreduce任務。測試的方法就是測試WordCount的例子。
1、在講測試用例之前,我們首先為系統當前用戶在HDFS中創建一下工作目錄,並服務相應的權限。
1.1、由於我安裝的時候是用的root用戶,因此也就需要在hdfs中為root用戶創建工作目錄,並授予權限。
(1)首先在HDFS中,在用戶目錄/user/下創建一個root用戶文件夾,作為root用戶的工作目錄。執行如下代碼:
sudo -u hdfs hadoop fs -mkdir /user/root
(2)授予/user/root目錄相應的權限
1)先將該目錄的所有權賦給root用戶: sudo -u hdfs hadoop fs -chown root /user/root
2)再將該目錄的組的權限賦給root用戶自己管理:sudo -u hdfs hadoop fs -chgrp root /user/root
3)最后設置該目錄的權限:sudo -u hdfs hadoop fs -chmod 777 /user/root (該權限是擁有者:可讀可寫可執行;組用戶:可讀可寫可執行;其他用戶:可讀可寫可執行)
1.2、給普通用戶創建HDFS工作目錄,並授予權限。普通用戶與root方法類似,只不過這個過程是需要在root用戶下執行的。
2、測試WordCount例子。
2.1、執行測試用例
通過CDH自身的jar來測試,該jar是在/opt/cloudera/parcels/CDH/jars/hadoop-examples.jar包。然后通過在界面執行如下命令:
hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-examples.jar /user/root/input /user/root/output
以上代碼需要注意的是/user/root/output必須是未存在的。mapreduce運行完之后,會自動創建。
本以為可以搞定,並等待結果,當執行完畢后,通過hdfs網頁管理進入/user/root/output發現有48個part-r-000xx文件,這說明該作業提交后,執行了48個reducer任務。這就奇了怪了。我並沒有讓他執行48個reducer任務啊,而且我以前部署了這么多次的hadoop集群都沒有出現過這個問題,這次運行WordCount竟然出現了這樣的問題。
2.2、2.1的問題的原因分析
通過查看上面產生的48個文件的內容,發現對應的是只是執行了map任務,對應的每一個單詞就是1,reducer並沒有進行累加。出現上面的這個問題,開始分析發現是由於yarn-site.xml配置文件中沒有設置shuffle過程。就是沒有設置洗牌的過程。也就是在yarn-site.xml文件中設置:
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
通過查看Cloudera CDH的配置文件,發現貌似還真的沒有設置。查看的方式是分別查看兩個路徑下的配置文件內容:
客戶端:/etc/hadoop
服務端:/var/run/cloudera-scm-agent/process/ (在該目錄下找yarn-RESOURCEMANAGER或yarn-NODEMANAGER的目錄)
在這兩個目錄下可以查看相應的配置文件。發現配置文件並沒有上面需要添加的信息,於是手動添加。最后發現也還是沒用。
最后考慮reducer的代碼的問題。最后發現是我的reducer類的代碼下的有問題。
2.3、此時本以為問題已經解決了,但是運行之后,發現還是會有48個文件產生,這個時候我有郁悶了,我在查看了這48個文件的內容,發現這次reducer函數起到了作用,單詞的個數進行了累加。那為什么還是會產生48個文件呢?
原因:不明
修改的方法是:通過在代碼中設置reduce的個數來設置reducer的數目。如:job.setNumReduceTasks(1);
此時發現有效,最后只有一個reducer。
進一步測試,通過分別設置job.setNumReduceTasks(10);和job.setNumReduceTasks(100);,並運行產生結果,發現最后的結果都產生了我設置數目的reducer的個數的文件。這個時候,我推斷默認情況下是reducer是48個。
下一步要去分析pritition函數的應用。