(1)Hadoop2.7.2 在linux部署完畢,成功啓動dfs和yarn,經過jps查看,進程都存在html
(2)安裝mavenjava
在windows系統中,直接經過Run as Java Application運行wordcount,而不須要先打包成jar包,而後在linux終端運行node
一、啓動dfs和yarnlinux
終端:${HADOOP_HOME}/sbin/start-dfs.shspring
${HADOOP_HOME}/sbin/start-yarn.shapache
經過在namenode節點上jps查看顯示:windows
4852 NameNode
5364 ResourceManager
5141 SecondaryNameNode
10335 Jps緩存
在datanode節點上使用jps查看顯示:服務器
10369 Jps
4852 NameNode
5364 ResourceManager
5141 SecondaryNameNode網絡
二、Eclipse基礎配置
(1)將hadoop-eclipse-plugin-2.7.2.jar插件下載,放在Eclipse的目錄下的plugins目錄下,啓動Eclipse,而後點擊查看Hadoop插件是否生效,點擊windows——>preferences,以下圖1
(2)將hadoop-2.7.2的解壓包添加到2所示的目錄,點擊OK
三、Eclipse建立maven工程
(1)建立過程省略
(2)添加dependency,POM.xml中的依賴項以下:
hadoop-common
hadoop-hdfs
hadoop-mapreduce-client-core
hadoop-mapreduce-client-common
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.7.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>2.7.2</version> </dependency>
(3)此時可能會卡頓一段時間,Build workpath若是特別慢的話,請參考我前不久的一篇解決方法,等到maven中的依賴包下載install完畢便可
四、編寫mapreduce中的wordcount代碼
代碼此處不在累述,,簡單代碼架構(紅色框的那個包)和內容以下:
WCMapper類:
package cn.edu.nupt.hadoop.mr.wordcount; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; // 4個泛型中,前兩個是指定的mapper輸入數據的類型 //map 和 reduce 的數據輸入輸出是以key-value的形式封裝的 //默認狀況下,框架傳遞給咱們的mapper的輸入數據中,key是要處理的文本中一行的其實偏移量,這一行的內容做爲value // JDK 中long string等使用jdk自帶的序列化機制,序列化以後會攜帶不少附加信息,形成網絡傳輸冗餘, // 因此Hadoop本身封裝了一些序列化機制 public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{ // mapreduce框架每讀一行就調用一次該方法 @Override protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException { //具體的業務寫在這個方法中,並且咱們業務要處理的數據已經被該框架傳遞進來 // key是這一行的其實偏移量,value是文本內容 String line = value.toString(); String[] words = StringUtils.split(line, " "); for(String word : words){ context.write(new Text(word), new LongWritable(1)); } } }
WCReducer類:
package cn.edu.nupt.hadoop.mr.wordcount; import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable>{ // 框架在map處理完成以後,將全部的kv對緩存起來,進行分組,而後傳遞一個組 // <key,{value1,value2...valuen}> //<hello,{1,1,1,1,1,1.....}> @Override protected void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException { long count = 0; for(LongWritable value:values){ count += value.get(); } context.write(key, new LongWritable(count)); } }
WCRunner類
package cn.edu.nupt.hadoop.mr.wordcount; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** * *<p> WCRunner.java * Description:<br/> * (1)用來描述一個做業<br/> * (2)好比,該做業使用哪一個類做爲邏輯處理中的map,哪一個做爲reduce * (3)還能夠指定改做業要處理的數據所在的路徑 * (4)還能夠指定做業輸出的路徑 *<p> * Company: cstor * * @author zhuxy * 2016年8月4日 下午9:58:02 */ public class WCRunner { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job wcjob = Job.getInstance(conf); // 找到Mapper和Reducer兩個類所在的路徑 //設置整個job所用的那些類在哪一個jar下 wcjob.setJarByClass(WCRunner.class); //本job使用的mapper和reducer類 wcjob.setMapperClass(WCMapper.class); wcjob.setReducerClass(WCReducer.class); //指定reduce的輸出數據kv類型 wcjob.setOutputKeyClass(Text.class); wcjob.setOutputValueClass(LongWritable.class); // 指定map的輸出數據的kv類型 wcjob.setMapOutputKeyClass(Text.class); wcjob.setMapOutputValueClass(LongWritable.class); // // FileInputFormat.setInputPaths(wcjob, new Path("hdfs://master:9000/wc/input/testHdfs.txt")); // FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://master:9000/wc/output7/")); FileInputFormat.setInputPaths(wcjob, new Path("file:///E:/input/testwc.txt")); FileOutputFormat.setOutputPath(wcjob, new Path("file:///E:/output3/")); wcjob.waitForCompletion(true); } }
此時代碼張貼完畢。
五、在CentOS的本地建立一個文件,命名爲testHdfs.txt(這個是我以前的測試文件,內容不重要,名字不重要,一致便可),內容以下:
hello java
hello Hadoop
hello world
建立好後,將文件上傳到hdfs文件系統的/wc/input文件夾下面
hadoop fs -put ./testHdfs.txt /wc/input
六、在WCRunner類中,右擊Run as -->Java Application,出現以下錯誤:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.NullPointerException
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1012)
at org.apache.hadoop.util.Shell.runCommand(Shell.java:483)
at org.apache.hadoop.util.Shell.run(Shell.java:456)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
at org.apache.hadoop.util.Shell.execCommand(Shell.java:815)
at org.apache.hadoop.util.Shell.execCommand(Shell.java:798)
……
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
at cn.edu.nupt.hadoop.mr.wordcount.WCRunner.main(WCRunner.java:55)
解決辦法:參考:eclipse Run on Hadoop java.lang.NullPointerException
方法:在Hadoop的bin目錄下放winutils.exe,在環境變量中配置 HADOOP_HOME,把hadoop.dll拷貝到C:\Windows\System32下面便可
注:此處最好將HADOOP_HOME/bin目錄添加到path中,這樣能夠運行本地模式,便是上述代碼中註釋的部分
兩個文件的下載地址:win10下hadoo2.7.2的hadoop.dll和winutils.exe
七、此時再次運行Run as -->Java Application,出現問題以下:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
文件夾建立成功,可是文件夾下面沒有success 和 運行結果part*文件,即/wc/output3下面沒內容(輸出結果)。
解決辦法:點擊windows-->perspective-->open perspective-->other-->MapReduce,Eclipse界面效果以下:
而且在底部出現MapReduce Locations,效果以下:
此時右擊黃色的Map/Reduce Locations,選擇New Had*,而後編輯以下,
編輯結束點擊finish。再次運行Run as -->Java Application,出現想要的結果了,如圖:
該圖出現基本表明運行成功,沒問題。可是發現MapReduce程序運行的計數器等信息沒有打印在控制檯,控制檯只打印了log4j三行信息。解決方法見第8條
八、解決將輸出的信息打印到Console上。
參考:Eclipse中運行MapReduce程序時控制檯沒法打印進度信息的問題
這種狀況通常是因爲log4j這個日誌信息打印模塊的配置信息沒有給出形成的,能夠在項目的src目錄下,新建一個文件,命名爲「log4j.properties」,填入如下信息:
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
九、此時,全部的問題解決
(1)控制檯打印信息
2016-08-05 00:56:45,209 INFO [org.apache.hadoop.conf.Configuration.deprecation] - session.id is deprecated. Instead, use dfs.metrics.session-id
2016-08-05 00:56:45,211 INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JVM Metrics with processName=JobTracker, sessionId=
2016-08-05 00:56:45,856 WARN [org.apache.hadoop.mapreduce.JobResourceUploader] - Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
2016-08-05 00:56:45,918 WARN [org.apache.hadoop.mapreduce.JobResourceUploader] - No job jar file set. User classes may not be found. See Job or Job#setJar(String).
2016-08-05 00:56:45,976 INFO [org.apache.hadoop.mapreduce.lib.input.FileInputFormat] - Total input paths to process : 1
(2)/wc/outputn/part*輸出的信息
Hadoop 1
hello 3
java 1
world 1
至此成功實現。
分析執行日誌會發現,發現Runjar啓動的是本地的JVM,使用的是Local模式,從以下幾處的日誌能夠得出:
(1)啓動的JVM processName=JobTracker,此處不是yarn
(2)JobID是job_local……而非job_直接數字
說明運行的本地運行,只是使用了HDFS文件系統,可是執行框架是本地的,而非集羣的yarn框架。
(如下內容爲傳智播客上課筆記)
1/在windows的eclipse裏面直接運行main方法,就會將job提交給本地執行器localjobrunner執行
----輸入輸出數據能夠放在本地路徑下(c:/wc/srcdata/)
----輸入輸出數據也能夠放在hdfs中(hdfs://weekend110:9000/wc/srcdata)
2/在linux的eclipse裏面直接運行main方法,可是不要添加yarn相關的配置,也會提交給localjobrunner執行
----輸入輸出數據能夠放在本地路徑下(/home/hadoop/wc/srcdata/)
----輸入輸出數據也能夠放在hdfs中(hdfs://weekend110:9000/wc/srcdata)
1/將工程打成jar包,上傳到服務器,而後用hadoop命令提交 hadoop jar wc.jar cn.itcast.hadoop.mr.wordcount.WCRunner2/在linux的eclipse中直接運行main方法,也能夠提交到集羣中去運行,可是,必須採起如下措施: ----在工程src目錄下加入 mapred-site.xml 和 yarn-site.xml ----將工程打成jar包(wc.jar),同時在main方法中添加一個conf的配置參數 conf.set("mapreduce.job.jar","wc.jar"); 3/在windows的eclipse中直接運行main方法,也能夠提交給集羣中運行,可是由於平臺不兼容,須要作不少的設置修改 ----要在windows中存放一份hadoop的安裝包(解壓好的) ----要將其中的lib和bin目錄替換成根據你的windows版本從新編譯出的文件 ----再要配置系統環境變量 HADOOP_HOME 和 PATH ----修改YarnRunner這個類的源碼