您當前位置:
首頁 >
服務器 > 萬法歸宗之Hadoop編程無界限
萬法歸宗之Hadoop編程無界限
來源:程序員人生 發(fā)布時間:2015-04-20 08:08:06 閱讀次數(shù):3495次
記錄下,散仙今天的工作和遇到的問題和解決方案,俗語說,好記性不如爛筆頭,寫出來文章,供大家參考,學習和點評,進步,才是王道 ,空話不多說,下面切入主題:
先介紹下需求:
散仙要處理多個類似表的txt數(shù)據(jù),固然只有值,列名甚么的全部在xml里配置了,然后加工這些每一個表的每行數(shù)據(jù),生成特定的格式基于ASCII碼1和ASCII碼2作為分隔符的1行數(shù)據(jù),ASCII2作為字段名和字段值的分隔符,ASCII1作為字段和字段之間的分隔符,每解析1個txt文件時,都要獲得文件名,然后與xml中的schema信息映照并找到對應位置的值,它的列名,條件是,這些的txt的內(nèi)容位置,是固定的,然后我們知道它每行屬于哪一個表結構的映照,由于這些映照信息是提早配置在xml中的,以下圖:

固然類似這樣的結構有20個左右的表文件,到時候,我們的數(shù)據(jù)方,會給我們提供這些txt文件,然后散仙需要加工成特定的格式,然后寫入HDFS,由我們的索引系統(tǒng)使用MapReduce批量建索引使用。
本來想直接用java寫個單機程序,串行處理,然后寫入HDFS,后來1想假設數(shù)據(jù)量比較大,串行程序還得改成多線程并行履行,這樣改來改去,倒不如直接使用MapReduce來的方便
ok,說干就干,測試環(huán)境已有1套CDH5.3的hadoop2.5集群,直接就在eclipse進行開發(fā)和MapReduce程序的調(diào)試,反正也好久也沒手寫MapReduce了,前段時間,1直在用Apache
Pig分析數(shù)據(jù),這次處理的邏輯也不復雜,就再寫下練練手 , CDH的集群在遠程的服務器上,散仙本機的hadoop是Apache Hadoop2.2的版本,在使用eclipse進行開發(fā)時,也沒來得及換版本,理論上最好各個版本,不同發(fā)行版,之間對應起來開發(fā)比較好,這樣1般不會存在兼容性問題,但散仙這次就懶的換了,由于CDH5.x以后的版本,是基于社區(qū)版的Apache Hadoop2.2之上改造的,接口應當大部份都1致,固然這只是散仙料想的。
(1)首先,散仙要弄定的事,就是解析xml了,在程序啟動之前需要把xml解析,加載到1個Map中,這樣在處理每種txt時,會根據(jù)文件名來去Map中找到對應的schma信息,解析xml,散仙直接使用的jsoup,具體為啥,請點擊散仙這篇
http://qindongliang.iteye.com/blog/2162519文章,在這期間遇到了1個比較蛋疼的問題,簡直是1個bug,最早散仙定義的xml是每一個表,1個table標簽,然后它下面有各個property的映照定義,但是在用jsoup的cssQuery語法解析時,發(fā)現(xiàn)總是解析不出來東西,依照之前的做法,是沒任何問題的,這次簡直是開玩笑了,后來就是各種搜索,測試,最后才發(fā)現(xiàn),將table標簽,換成其他的任何標簽都無任何問題,具體緣由,散仙還沒來得及細看jsoup的源碼,猜想table標簽應當是1個關鍵詞甚么的標簽,在解析時會和html的table沖突,所以在xml解析中失效了,花了接近2個小時,求證,檢驗,終究弄定了這個小bug。
(2)弄定了這個問題,散仙就開始開發(fā)調(diào)試MapReduce版的處理程序,這下面臨的又1個問題,就是如何使用Jsoup解析寄存在HDFS上的xml文件,有過Hadoop編程經(jīng)驗的人,應當都知道,HDFS是1套散布式的文件系統(tǒng),與我們本地的磁盤的存儲方式是不1樣的,比如你在正常的JAVA程序上解析在C:file .tx或在linux上/home/user/t.txt,所編寫的程序在Hadoop上是沒法使用的,你得使用Hadoop提供的編程接口獲得它的文件信息,然后轉成字符串以后,再給jsoup解析。
(3)ok,第2個問題弄定以后,你得編寫你的MR程序,處理對應的txt文本,而且保證不同的txt里面的數(shù)據(jù)格式,所獲得的scheaml是正確的,所以在map方法里,你要獲得固然處理文件的路徑,然后做相應判斷,在做對應處理。
(4)很好,第3個問題弄定以后,你的MR的程序,基本編寫的差不多了,下1步就改斟酌如何提交到Hadoop的集群上,來調(diào)試程序了,由于散仙是在Win上的eclipse開發(fā)的,所以這1步可能遇到的問題會很多,而且加上,hadoop的版本不1致與發(fā)行商也不1致,出問題也純屬正常。
這里多寫1點,1般建議大家不要在win上調(diào)試hadoop程序,這里的坑非常多,如果可以,還是建議大家在linux上直接玩,下面說下,散仙今天又踩的坑,關于在windows上調(diào)試eclipse開發(fā), 運行Yarn的MR程序,散仙之前也記錄了文章,感興趣者,可以點擊這個鏈接
http://qindongliang.iteye.com/blog/2078452地址。
(5)提交前,是需要使用ant或maven或java自帶的導出工具,將項目打成1個jar包提交的,這1點大家需要注意下,最后測試得出,Apache的hadoop2.2編寫的MR程序,是可以直接向CDH Hadoop2.5提交作業(yè)的,但是由于hadoop2.5中,使用google的guice作為了1個內(nèi)嵌的MVC輕量級的框架,所以在windows上打包提交時,需要引入額外的guice的幾個包,截圖以下:
上面幾步弄定后,打包全部項目,然后運行成功,進程以下:
-
輸前途徑存在,已刪除!
-
2015-04-08 19:35:18,001 INFO [main] client.RMProxy (RMProxy.java:createRMProxy(56)) - Connecting to ResourceManager at /172.26.150.18:8032
-
2015-04-08 19:35:18,170 WARN [main] mapreduce.JobSubmitter (JobSubmitter.java:copyAndConfigureFiles(149)) - Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
-
2015-04-08 19:35:21,156 INFO [main] input.FileInputFormat (FileInputFormat.java:listStatus(287)) - Total input paths to process : 2
-
2015-04-08 19:35:21,219 INFO [main] mapreduce.JobSubmitter (JobSubmitter.java:submitJobInternal(394)) - number of splits:2
-
2015-04-08 19:35:21,228 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - user.name is deprecated. Instead, use mapreduce.job.user.name
-
2015-04-08 19:35:21,228 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.jar is deprecated. Instead, use mapreduce.job.jar
-
2015-04-08 19:35:21,228 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - fs.default.name is deprecated. Instead, use fs.defaultFS
-
2015-04-08 19:35:21,229 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces
-
2015-04-08 19:35:21,229 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.mapoutput.value.class is deprecated. Instead, use mapreduce.map.output.value.class
-
2015-04-08 19:35:21,230 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapreduce.map.class is deprecated. Instead, use mapreduce.job.map.class
-
2015-04-08 19:35:21,230 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.job.name is deprecated. Instead, use mapreduce.job.name
-
2015-04-08 19:35:21,230 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapreduce.inputformat.class is deprecated. Instead, use mapreduce.job.inputformat.class
-
2015-04-08 19:35:21,230 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.input.dir is deprecated. Instead, use mapreduce.input.fileinputformat.inputdir
-
2015-04-08 19:35:21,230 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.output.dir is deprecated. Instead, use mapreduce.output.fileoutputformat.outputdir
-
2015-04-08 19:35:21,230 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapreduce.outputformat.class is deprecated. Instead, use mapreduce.job.outputformat.class
-
2015-04-08 19:35:21,231 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
-
2015-04-08 19:35:21,233 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.mapoutput.key.class is deprecated. Instead, use mapreduce.map.output.key.class
-
2015-04-08 19:35:21,233 INFO [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(840)) - mapred.working.dir is deprecated. Instead, use mapreduce.job.working.dir
-
2015-04-08 19:35:21,331 INFO [main] mapreduce.JobSubmitter (JobSubmitter.java:printTokens(477)) - Submitting tokens for job: job_1419419533357_5012
-
2015-04-08 19:35:21,481 INFO [main] impl.YarnClientImpl (YarnClientImpl.java:submitApplication(174)) - Submitted application application_1419419533357_5012 to ResourceManager at /172.21.50.108:8032
-
2015-04-08 19:35:21,506 INFO [main] mapreduce.Job (Job.java:submit(1272)) - The url to track the job: http:
-
2015-04-08 19:35:21,506 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1317)) - Running job: job_1419419533357_5012
-
2015-04-08 19:35:33,777 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1338)) - Job job_1419419533357_5012 running in uber mode : false
-
2015-04-08 19:35:33,779 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1345)) - map 0% reduce 0%
-
2015-04-08 19:35:43,885 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1345)) - map 100% reduce 0%
-
2015-04-08 19:35:43,902 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1356)) - Job job_1419419533357_5012 completed successfully
-
2015-04-08 19:35:44,011 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1363)) - Counters: 27
-
File System Counters
-
FILE: Number of bytes read=0
-
FILE: Number of bytes written=166572
-
FILE: Number of read operations=0
-
FILE: Number of large read operations=0
-
FILE: Number of write operations=0
-
HDFS: Number of bytes read=47795
-
HDFS: Number of bytes written=594
-
HDFS: Number of read operations=12
-
HDFS: Number of large read operations=0
-
HDFS: Number of write operations=4
-
Job Counters
-
Launched map tasks=2
-
Data-local map tasks=2
-
Total time spent by all maps in occupied slots (ms)=9617
-
Total time spent by all reduces in occupied slots (ms)=0
-
Map-Reduce Framework
-
Map input records=11
-
Map output records=5
-
Input split bytes=252
-
Spilled Records=0
-
Failed Shuffles=0
-
Merged Map outputs=0
-
GC time elapsed (ms)=53
-
CPU time spent (ms)=2910
-
Physical memory (bytes) snapshot=327467008
-
Virtual memory (bytes) snapshot=1905754112
-
Total committed heap usage (bytes)=402653184
-
File Input Format Counters
-
Bytes Read=541
-
File Output Format Counters
-
Bytes Written=594
-
true
最后附上核心代碼,以作備忘:
(1)Map Only作業(yè)的代碼:
-
package com.dhgate.search.rate.convert;
-
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.FileNotFoundException;
-
import java.io.FilenameFilter;
-
import java.io.IOException;
-
import java.util.Map;
-
-
import org.apache.hadoop.conf.Configuration;
-
import org.apache.hadoop.fs.FileSystem;
-
import org.apache.hadoop.fs.Path;
-
import org.apache.hadoop.io.LongWritable;
-
import org.apache.hadoop.io.NullWritable;
-
import org.apache.hadoop.io.Text;
-
import org.apache.hadoop.mapreduce.Job;
-
import org.apache.hadoop.mapreduce.Mapper;
-
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
-
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
-
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
-
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
-
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
-
import com.dhgate.parse.xml.tools.HDFSParseXmlTools;
-
import com.sun.xml.bind.v2.schemagen.xmlschema.Import;
-
-
-
-
-
-
-
-
public class StoreConvert {
-
-
-
static Logger log=LoggerFactory.getLogger(StoreConvert.class);
-
-
-
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
------分隔線----------------------------
------分隔線----------------------------