您当前位置:
首页 >
服务器 > 万法归宗之Hadoop编程无界限
万法归宗之Hadoop编程无界限
来源:程序员人生 发布时间:2015-04-20 08:08:06 阅读次数:3333次
记录下,散仙今天的工作和遇到的问题和解决方案,俗语说,好记性不如烂笔头,写出来文章,供大家参考,学习和点评,进步,才是王道 ,空话不多说,下面切入主题:
先介绍下需求:
散仙要处理多个类似表的txt数据,固然只有值,列名甚么的全部在xml里配置了,然后加工这些每一个表的每行数据,生成特定的格式基于ASCII码1和ASCII码2作为分隔符的1行数据,ASCII2作为字段名和字段值的分隔符,ASCII1作为字段和字段之间的分隔符,每解析1个txt文件时,都要获得文件名,然后与xml中的schema信息映照并找到对应位置的值,它的列名,条件是,这些的txt的内容位置,是固定的,然后我们知道它每行属于哪一个表结构的映照,由于这些映照信息是提早配置在xml中的,以下图:
固然类似这样的结构有20个左右的表文件,到时候,我们的数据方,会给我们提供这些txt文件,然后散仙需要加工成特定的格式,然后写入HDFS,由我们的索引系统使用MapReduce批量建索引使用。
本来想直接用java写个单机程序,串行处理,然后写入HDFS,后来1想假设数据量比较大,串行程序还得改成多线程并行履行,这样改来改去,倒不如直接使用MapReduce来的方便
ok,说干就干,测试环境已有1套CDH5.3的hadoop2.5集群,直接就在eclipse进行开发和MapReduce程序的调试,反正也好久也没手写MapReduce了,前段时间,1直在用Apache
Pig分析数据,这次处理的逻辑也不复杂,就再写下练练手 , CDH的集群在远程的服务器上,散仙本机的hadoop是Apache Hadoop2.2的版本,在使用eclipse进行开发时,也没来得及换版本,理论上最好各个版本,不同发行版,之间对应起来开发比较好,这样1般不会存在兼容性问题,但散仙这次就懒的换了,由于CDH5.x以后的版本,是基于社区版的Apache Hadoop2.2之上改造的,接口应当大部份都1致,固然这只是散仙料想的。
(1)首先,散仙要弄定的事,就是解析xml了,在程序启动之前需要把xml解析,加载到1个Map中,这样在处理每种txt时,会根据文件名来去Map中找到对应的schma信息,解析xml,散仙直接使用的jsoup,具体为啥,请点击散仙这篇
http://qindongliang.iteye.com/blog/2162519文章,在这期间遇到了1个比较蛋疼的问题,简直是1个bug,最早散仙定义的xml是每一个表,1个table标签,然后它下面有各个property的映照定义,但是在用jsoup的cssQuery语法解析时,发现总是解析不出来东西,依照之前的做法,是没任何问题的,这次简直是开玩笑了,后来就是各种搜索,测试,最后才发现,将table标签,换成其他的任何标签都无任何问题,具体缘由,散仙还没来得及细看jsoup的源码,猜想table标签应当是1个关键词甚么的标签,在解析时会和html的table冲突,所以在xml解析中失效了,花了接近2个小时,求证,检验,终究弄定了这个小bug。
(2)弄定了这个问题,散仙就开始开发调试MapReduce版的处理程序,这下面临的又1个问题,就是如何使用Jsoup解析寄存在HDFS上的xml文件,有过Hadoop编程经验的人,应当都知道,HDFS是1套散布式的文件系统,与我们本地的磁盘的存储方式是不1样的,比如你在正常的JAVA程序上解析在C:file .tx或在linux上/home/user/t.txt,所编写的程序在Hadoop上是没法使用的,你得使用Hadoop提供的编程接口获得它的文件信息,然后转成字符串以后,再给jsoup解析。
(3)ok,第2个问题弄定以后,你得编写你的MR程序,处理对应的txt文本,而且保证不同的txt里面的数据格式,所获得的scheaml是正确的,所以在map方法里,你要获得固然处理文件的路径,然后做相应判断,在做对应处理。
(4)很好,第3个问题弄定以后,你的MR的程序,基本编写的差不多了,下1步就改斟酌如何提交到Hadoop的集群上,来调试程序了,由于散仙是在Win上的eclipse开发的,所以这1步可能遇到的问题会很多,而且加上,hadoop的版本不1致与发行商也不1致,出问题也纯属正常。
这里多写1点,1般建议大家不要在win上调试hadoop程序,这里的坑非常多,如果可以,还是建议大家在linux上直接玩,下面说下,散仙今天又踩的坑,关于在windows上调试eclipse开发, 运行Yarn的MR程序,散仙之前也记录了文章,感兴趣者,可以点击这个链接
http://qindongliang.iteye.com/blog/2078452地址。
(5)提交前,是需要使用ant或maven或java自带的导出工具,将项目打成1个jar包提交的,这1点大家需要注意下,最后测试得出,Apache的hadoop2.2编写的MR程序,是可以直接向CDH Hadoop2.5提交作业的,但是由于hadoop2.5中,使用google的guice作为了1个内嵌的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作业的代码:
-
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);
-
-
-
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
------分隔线----------------------------
------分隔线----------------------------