没有Map和reduce的mapReduce:求解MapReduce过程



    用一个10行代码的案例,一个没有map和reduce的类分解Mapreduce过程

  

操作过程:

  1>:创建MapReduce项目,并配置Run Configuration选项中的Argument输入输出路径.如图

   
 

  2>:再看代 

    

public class MyWordCount{
	/**
	 * @param args
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

		//根据安装的Hadoop夹下conf文件创建对象
		Configuration conf = new Configuration();
		//根据Run Configuration设置下的arguments 下的选项得到输入输出路径
		String [] otherArgs=new GenericOptionsParser(conf, args).getRemainingArgs();
		      
		   if(otherArgs.length!=2){
			    System.err.println("Usage:wordcount <in> <out>");
			      System.exit(2);
		               }
		   
		   //定义一个job
		  Job job=new Job(conf, "My WordCount");
		   //制定输入输出路径
		  FileInputFormat.addInputPath(job,new Path(args[0]));
		  FileOutputFormat.setOutputPath(job, new Path(args[1]));
		  //等待job执行完毕退出
		  System.exit(job.waitForCompletion(true)?0:1);
	}
	
	

	}

 

 

    

 

3>执行结果

 文件源如图:

 
执行结果如图:                                 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

结果分析:

1>事实

源文件有两个,用户没有自己定义任何Map和Reduce的情况下,执行后依旧可以得到MapReduce结果,当然前提是使用了插件创建的是MapReduce项目.并非是一个单纯的Java 项目.

2>过程解析

   第一步:首先使文件会被分为特定大小的split,叫做分区每一个split会对应启动一个task.分别执行的是MapTask和ReduceTask.

   第二步:每一个split首先会被hadoop框架分解成一个个的<key,Value>对,具体是<偏移量,文本行>(偏移量指的是每个文本行的首字母对文件的初始位置的偏移,文本行是以/r/n来判断的). 如此形式:

    <0,zhong nan da xue>

    <14,hu nan da xue>

    <27,shi fan da xue>

   第三步:交由用户自定义的Map处理.以系统的wordcount为例,执行程序中的命令得到的结果是:          <zhong,1>,<nan,1><da,1>,<xue,1>,<hu,1>,<nan,1>.....

  

   第四步:sort过程.即排序.           

  <zhong,list(1)>

  <nan,list(1,1)>

  <da,list(1,1,1)>....

   显然是将文件中有相同的key的进行排序,以这种格式发送给Reduce,有助于解决带宽问题. 

    第五步:shuffle过程,翻译为洗牌过程.顾名思义,洗牌是将牌打乱再分配的过程.对应的是reduce任务取得map任务输出的文件.这个过程是hadoop框架自动实现的,默认是按照hash函数执行的(此处不做深入分析).此过程后就将文件传给了reduce了.

    第六步:执行reduce.还是以wordcount为例.j将list中的数字相加得到:

     <zhong,1>

     <nan,2>

     <da,3>....

 

分析本案例:

     本案例中没有定义任何map和reduce,得到了上述的结果是因为没有执行用户自定义的map和reduce,所以是以第二步之后的结果形式展现的,这是默认的形式.

    以上只是很概括的展现了map和reduce的过程,还有很多细节值得深入,未完待续.....

 

         

    

      

              

              

     

     

 

 

 

 

 

以下是使用Java将doc文档转换为XML文档并生成文件的示例代码。代码中使用了Apache POI库来读取和操作doc文档,使用DOM库来创建和操作XML文档。 ```java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.CharacterRun; import org.apache.poi.hwpf.usermodel.Paragraph; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class DocToXmlConverter { private static final String OUTPUT_ENCODING = "UTF-8"; public static void main(String[] args) { String inputFilePath = "input.doc"; String outputFilePath = "output.xml"; try { HWPFDocument doc = new HWPFDocument(new FileInputStream(inputFilePath)); Document xmlDocument = createXmlDocument(doc); saveXmlDocument(xmlDocument, outputFilePath); } catch (IOException e) { e.printStackTrace(); } } private static Document createXmlDocument(HWPFDocument doc) { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder; Document xmlDocument = null; try { docBuilder = docFactory.newDocumentBuilder(); xmlDocument = docBuilder.newDocument(); Element rootElement = xmlDocument.createElement("document"); xmlDocument.appendChild(rootElement); for (int i = 0; i < doc.getRange().numParagraphs(); i++) { Paragraph paragraph = doc.getRange().getParagraph(i); Element paragraphElement = createParagraphElement(xmlDocument, paragraph); rootElement.appendChild(paragraphElement); } } catch (ParserConfigurationException e) { e.printStackTrace(); } return xmlDocument; } private static Element createParagraphElement(Document xmlDocument, Paragraph paragraph) { Element paragraphElement = xmlDocument.createElement("p"); for (int i = 0; i < paragraph.numCharacterRuns(); i++) { CharacterRun run = paragraph.getCharacterRun(i); String text = run.text(); if (text != null && text.length() > 0) { Map<String, String> attributes = createRunAttributes(run); Element runElement = xmlDocument.createElement("r"); for (Map.Entry<String, String> entry : attributes.entrySet()) { runElement.setAttribute(entry.getKey(), entry.getValue()); } Node textNode = xmlDocument.createTextNode(text); runElement.appendChild(textNode); paragraphElement.appendChild(runElement); } } return paragraphElement; } private static Map<String, String> createRunAttributes(CharacterRun run) { Map<String, String> attributes = new HashMap<>(); if (run.isBold()) { attributes.put("b", "true"); } if (run.isItalic()) { attributes.put("i", "true"); } if (run.isStrikeThrough()) { attributes.put("strike", "true"); } if (run.isUnderline()) { attributes.put("u", "true"); } return attributes; } private static void saveXmlDocument(Document xmlDocument, String outputFilePath) { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer; try { transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, OUTPUT_ENCODING); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); DOMSource source = new DOMSource(xmlDocument); Writer writer = new OutputStreamWriter(new FileOutputStream(new File(outputFilePath)), OUTPUT_ENCODING); StreamResult result = new StreamResult(writer); transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例代码中,我们首先使用Apache POI库读取doc文档并创建一个HWPFDocument对象。然后,我们使用DOM库创建一个空的XML文档对象,并将其根元素设置为document。接下来,我们遍历文档中的每个段落,并为每个段落创建一个XML元素。对于每个段落中的每个字符运行,我们都创建一个XML元素并为其设置文本和属性(例如粗体、斜体等)。最后,我们将XML文档写入输出文件。 这个示例代码还兼容特殊符号,因为DOM库会自动转义它们。例如,如果文档中包含“<”字符,它会被转换为“<”序列。这确保了生成的XML文档是有效的,并且可以正确解析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值