本文目录一览:
- 1、MapReduce执行过程
- 2、在Hadoop中,使用put命令,在test中生成文件myfile,可以直接创建吗?命令是什么呢?
- 3、如何在hadoop2.5.2使用命令行编译打包运行自己的mapreduce程序
- 4、如何用mapreduce生成html文件
- 5、eclipse中mapreduce没有文件
MapReduce执行过程
MapReduce存在以下4个独立的实体。
1. JobClient:运行于client node,负责将MapReduce程序打成Jar包存储到HDFS,并把Jar包的路径提交到Jobtracker,由Jobtracker进行任务的分配和监控。
2. JobTracker:运行于name node,负责接收JobClient提交的Job,调度Job的每一个子task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。-mapreduce生成文件命令
3. TaskTracker:运行于data node,负责主动与JobTracker通信,接收作业,并直接执行每一个任务。
4. HDFS:用来与其它实体间共享作业文件。
具体细节如下:
1.JobClient通过RPC协议向JobTracker请求一个新应用的ID,用于MapReduce作业的ID
2.JobTracker检查作业的输出说明。例如,如果没有指定输出目录或目录已存在,作业就不提交,错误抛回给JobClient,否则,返回新的作业ID给JobClient
3.JobClient将作业所需的资源(包括作业JAR文件、配置文件和计算所得得输入分片)复制到以作业ID命名的HDFS文件夹中
4.JobClient通过submitApplication()提交作业
5.JobTracker收到调用它的submitApplication()消息后,进行任务初始化
6.JobTracker读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个TaskTracker
map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同事将程序jar包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化-mapreduce生成文件命令
7.TaskTracker通过心跳机制领取任务(任务的描述信息)
8.TaskTracker读取HDFS上的作业资源(JAR包、配置文件等)
9.TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)
10.TaskTracker将Reduce结果写入到HDFS当中
注:以HDFS的一个块的大小(默认64M)为一个分片
15年2.7.3版本开始,block size由64 MB变成了128 MB的。
Shuffle分析
Shuffle的中文意思是“洗牌”,如果我们这样看:一个map产生的数据,结果通过hash过程分区缺分配给了不同的reduce任务,是不是一个对数据洗牌的过程呢?
shuffle的概念:
Collections.shuffle(List list):随机打乱list里的元素顺序。
MapReduce里的Shuffle:描述着数据从map task输出到reduce task输入的这段过程。
Map端流程分析
1 每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(默认64M)为一个分片,当然我们也可以设置块的大小。map输出的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。-mapreduce生成文件命令
2 在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combianer操作,这样做的目的是让尽可能少的数据写入到磁盘。-mapreduce生成文件命令
3 当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和combiner操作,目的有两个:1、尽量减少每次写入磁盘的数据量;2、尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将mapred.compress.map.out设置为true就可以。-mapreduce生成文件命令
数据压缩:Gzip、Lzo、snappy。
4 将分区中的数据拷贝给相对应的reduce任务。有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和obTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就OK了。-mapreduce生成文件命令
reduce端流程分析
1 reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接收的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merg.percent决定),则对数据合并后溢写到磁盘中。-mapreduce生成文件命令
2 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省空间。其实不管在map端还是在reduce端,MapReduce都是反复地执行排序,合并操作,现在终于明白了有些人为什么会说:排序是hadoop的灵魂。-mapreduce生成文件命令
3 合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。
4 Reducer的输入文件。不断地merge后,最后会生成一个“最终文件”。为什么加引号?因为这个文件可能存在于磁盘上,也可能存在于内存中。对我们来说,希望它存放于内存中,直接作为Reducer的输入,但默认情况下,这个文件是存放于磁盘中的。当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果放到HDSF上。-mapreduce生成文件命令
详细过程:
1 每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后在对磁盘中这个map task产生的所有临时文件做一个合并,生成最终的正式输出文件,然后等待reduce task来拉数据。-mapreduce生成文件命令
2 在map task执行时,它的输入数据来源于HDFS的block,当然在MapReduce概念中,map task只读取split。split与block对应关系可能是多对一,默认是一对一。在wordcount例子里,假设map的输入数据都是是像“aaa”这样的字符串。-mapreduce生成文件命令
3 在经过mapper的运行后,我们得知mapper的输出是这样一个key/value对:key是“aaa”,value是数值1。因为当前map端只做加1的操作,在reduce task里采取合并结果集。前面我们知道这个job有3个reduce task。那到底当前的“aaa”究竟该丢给哪个reduce去处理呢?是需要现在做决定的。-mapreduce生成文件命令
4 MapReduce提供Partitioner接口,作用就是根据key或value及reduce的数量来决定当前的输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数据取模(取余)。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以定制并设置到job上。-mapreduce生成文件命令
5 在例子中,“aaa”经过Partition后返回0,也就是这对值应当交由第一个reduce来处理。接下来,需要将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写入缓冲区。当然,写入之前,key与value值都会被序列化成字节数组。-mapreduce生成文件命令
6 内存缓冲区是有大小限制的,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为spill,中文可理解为溢写。溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。比例默认是0.8,也就是当缓冲区的数据值已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。map task的输出结果还可以往剩下的20MB内存中写,互不影响。-mapreduce生成文件命令
7 当溢写线程启动后,需要对这80MB空间内的key做排序(sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。
8 因为map task的输出是需要发送到不同的reduce端去,而内存缓冲区没有对将发送到相同reduce端的数据做合并,那么这种合并应该是体现在磁盘文件中的。从官方图上也可以看到写到磁盘中的一些文件是对不同的reduce端的数值做过合并。所以溢写过程一个很重要的细节在于,如果有很多个key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录。-mapreduce生成文件命令
在针对每个reduce端而合并数据时,有些数据可能像这样:“aaa”/1,“aaa”/1。对于wordcount例子,只是简单地统计单词出现的次数,如果在同一个map task的结果中有很多像“aaa”一样出现多次的key,我们就应该把它们的值合并到一块,这个过程叫reduce也叫combine。但MapReduce的术语中,reduce只值reduce端执行从多个map task取数据做计算的过程。除reduce外,非正式地合并数据只能算作combine了。其实大家知道的,MapReduce中将Combiner等同于Reducer。-mapreduce生成文件命令
如果client设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。-mapreduce生成文件命令
9 每次溢写会在磁盘上生成一个溢写文件,如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在。当map task真正完成时,内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫Merge。Merge是怎样的?如前面的例子,“aaa”从某个map task读取过来时值是5,从另外一个map读取时值是8,因为他们有相同的key,所以要merge成group。-mapreduce生成文件命令
什么是group:对于“aaa”就是像真阳的:{“aaa”,[5,8,2,...]},数组中的值就是从不同的溢写文件中读取出来的,然后再把这些值加起来。请注意,因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中,如果client设置过Combiner,也会使用Combiner来合并相同的key。-mapreduce生成文件命令
至此,map端的所有工作都已经结束,最终生成的这个文件也存放在TaskTracker够得到的某个本地目录中。每个reduce task不断地通过RPC从JobTRacker那获取map task是否完成的信息,如果reduce task得到通知,获知某台TaskTracker上的map task执行完成,Shuffle的后半段过程开始启动。-mapreduce生成文件命令
Reduce端的shuffle过程:
1 copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过http方式请求map task所在的TaskTracker获取map task的输出文件。因为map task早已结束,这些文件就归TaskTracker管理在本地磁盘中。-mapreduce生成文件命令
2 Merge阶段。这里的merge和map端的merge动作相同,只是数组中存放的是不同map端copy来的数值。copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端更为灵活,它基于JVM的heap size设置,因为Shuffle阶段Reducer不运行,所以应该把绝大部分的内存都给Shuffle使用。-mapreduce生成文件命令
3 Merge有三种形式:1、内存到内存;2、内存到磁盘;3、磁盘到磁盘。默认情况下第一种形式不启用,让人比较困惑。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map端类似,这也是溢写的过程,在这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。-mapreduce生成文件命令
Map端流程分析
1 每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(默认64M)为一个分片,当然我们也可以设置块的大小。map输出的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。-mapreduce生成文件命令
2 在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combianer操作,这样做的目的是让尽可能少的数据写入到磁盘。-mapreduce生成文件命令
3 当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和combiner操作,目的有两个:1、尽量减少每次写入磁盘的数据量;2、尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将mapred.compress.map.out设置为true就可以。-mapreduce生成文件命令
数据压缩:Gzip、Lzo、snappy。
4 将分区中的数据拷贝给相对应的reduce任务。有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和obTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就OK了。-mapreduce生成文件命令
reduce端流程分析
1 reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接收的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merg.percent决定),则对数据合并后溢写到磁盘中。-mapreduce生成文件命令
2 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省空间。其实不管在map端还是在reduce端,MapReduce都是反复地执行排序,合并操作,现在终于明白了有些人为什么会说:排序是hadoop的灵魂。-mapreduce生成文件命令
3 合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。
4 Reducer的输入文件。不断地merge后,最后会生成一个“最终文件”。为什么加引号?因为这个文件可能存在于磁盘上,也可能存在于内存中。对我们来说,希望它存放于内存中,直接作为Reducer的输入,但默认情况下,这个文件是存放于磁盘中的。当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果放到HDSF上。-mapreduce生成文件命令
注意:对MapReduce的调优在很大程度上就是对MapReduce Shuffle的性能的调优。
三、内存缓冲区:MapOutputBuffer
两级索引结构:
环形缓冲区:
1 kvoffsets缓冲区:也叫偏移量索引数组,用于保存key/value信息在位置索引kvindices中的偏移量。当kvoffsets的使用率超过io.sort.spill.percent(默认为80%)后,便会触发一次SpillThread线程的“溢写”操作,也就是开始一次spill阶段的操作。-mapreduce生成文件命令
2 kvindices缓冲区:也叫位置索引数组,用于保存key/value在数据缓冲区kvbuffer中的起始位置。
3 kvbuffer数据缓冲区:用于保存实际的key/value的值。默认情况下该缓冲区最多可以使用io.sort.mb的95%,当kvbuffer使用率超过io.sort.spill.percent(默认80%)后,便会触发一次SpillThread线程的“溢写”操作,也就是开始一次spill阶段的操作。-mapreduce生成文件命令
在Hadoop中,使用put命令,在test中生成文件myfile,可以直接创建吗?命令是什么呢?
1. 创建本地的示例数据文件:
依次进入【Home】-【hadoop】-【hadoop-1.2.1】创建一个文件夹file用来存储本地原始数据。
并在这个目录下创建2个文件分别命名为【myTest1.txt】和【myTest2.txt】或者你想要的任何文件名。
分别在这2个文件中输入下列示例语句:
2. 在HDFS上创建输入文件夹
呼出终端,输入下面指令:
bin/hadoop fs -mkdir hdfsInput
执行这个命令时可能会提示类似安全的问题,如果提示了,请使用
bin/hadoop dfsadmin -safemode leave
来退出安全模式。
当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结 束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入 安全模式。-mapreduce生成文件命令
意思是在HDFS远程创建一个输入目录,我们以后的文件需要上载到这个目录里面才能执行。
3. 上传本地file中文件到集群的hdfsInput目录下
在终端依次输入下面指令:
cd hadoop-1.2.1
bin/hadoop fs -put file/myTest*.txt hdfsInput
4. 运行例子:
在终端输入下面指令:
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount hdfsInput hdfsOutput
注意,这里的示例程序是1.2.1版本的,可能每个机器有所不一致,那么请用*通配符代替版本号
bin/hadoop jar hadoop-examples-*.jar wordcount hdfsInput hdfsOutput
应该出现下面结果:
Hadoop命令会启动一个JVM来运行这个MapReduce程序,并自动获得Hadoop的配置,同时把类的路径(及其依赖关系)加入到Hadoop的库中。以上就是Hadoop Job的运行记录,从这里可以看到,这个Job被赋予了一个ID号:job_201202292213_0002,而且得知输入文件有两个(Total input paths to process : 2),同时还可以了解map的输入输出记录(record数及字节数)-mapreduce生成文件命令
如何在hadoop2.5.2使用命令行编译打包运行自己的mapreduce程序
网上的 MapReduce WordCount 教程对于如何编译 WordCount.Java 几乎是一笔带过… 而有写到的,大多又是 0.20 等旧版本版本的做法,即 javac -classpath /usr/local/Hadoop/hadoop-1.0.1/hadoop-core-1.0.1.jar WordCount.java,但较新的 2.X 版本中,已经没有 hadoop-core*.jar 这个文件,因此编辑和打包自己的 MapReduce 程序与旧版本有所不同。-mapreduce生成文件命令
本文以 Hadoop 2.7.2 环境下的 WordCount 实例来介绍 2.x 版本中如何编辑自己的 MapReduce 程序。
编译、打包 Hadoop MapReduce 程序
我们将 Hadoop 的 classhpath 信息添加到 CLASSPATH 变量中,在 ~/.bashrc 中增加如下几行:
[html] view plain copy
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
别忘了执行 source ~/.bashrc 使变量生效,接着就可以通过 javac 命令编译 WordCount.java 了(使用的是 Hadoop 源码中的 WordCount.java,源码在文本最后面):javac WordCount.java-mapreduce生成文件命令
编译时会有警告,可以忽略。编译后可以看到生成了几个 .class 文件。
接着把 .class 文件打包成 jar,才能在 Hadoop 中运行:
[html] view plain copy
jar -cvf WordCount.jar ./WordCount*.class
开始运行:
[html] view plain copy
hadoop jar WordCount.jar WordCount input output//hdfs上的input文件夹,命令执行所在位置为WordCount.jar同一目录
因为程序中声明了
package ,所以在命令中也要 org.apache.hadoop.examples 写完整:
[html] view plain copy
hadoop jar WordCount.jar org.apache.hadoop.examples.WordCount input output
查看:
[html] view plain copy
hadoop fs -cat /output/part-r-00000
WordCount.java 源码
package org.apache.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
public static class TokenizerMapper
extends MapperObject, Text, Text, IntWritable{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends ReducerText,IntWritable,Text,IntWritable {
private IntWritable result = new IntWritable();
public void reduce(Text key, IterableIntWritable values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount in out");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
如何用mapreduce生成html文件
第一种方法:使用MultipleOutputFormat
MultipleOutputFormat 只是一个抽象的类,MultipleTextOutputFormat 和MultpleSequenceFileOutputFormat 是它的两个具体实现。顾名思义,MultipleTextOutputFormat 的多个文件输出都是TextOutputFormat,即一行一对的文本格式,而MultpleSequenceFileOutputFormat 的多个文件输出都是SequenceFile,即二进制文件格式。-mapreduce生成文件命令
具体实现方法如下:
实现方式可以直接继承MultipleOutputFormat 抽象累,也可直接继承MultipleTextOutputFormat类重写generateFileNameForKeyValue方法,如果输出文件为二进制格式则直接继承MultpleSequenceFileOutputFormat 类。我这里输出为text格式,所以直接继承MultipleTextOutputFormat类,代码如下:-mapreduce生成文件命令
static class MyMultipleOutputFormat extends MultipleTextOutputFormatText, Text{
@Override
protected String generateFileNameForKeyValue(Text key,Text value,String name){
// 相同key值的放在同一个文件夹下
return new Path(key.toString(), name).toString();
}
最后在jobconfig中配置输出格式:
JobConf job = new JobConf();
// 设置输出格式。
job.setOutputFormat(MyMultipleOutputFormat.class);
这种方式实现其实是通过实现输出文件指定目录,如果直接按照key输出在同一个文件,则generateFileNameForKeyValue 返回值直接修改为return key。
第二种方法:使用MultipleOutputs
MultipleOutputs 是在job 指定的output 输出的基础上,新增加一些额外的输出,与MulitpleOutputFormat 相比,它才是真正意义上的多文件输出。分两种情况:
附加单个输出文件,调用MultipleOutputs 的addNamedOutput 方法, 则是添加一个附加文件OutputFormat 格式及key, value 类型都可以自定义;代码实现如下:-mapreduce生成文件命令
JobConf job = new JobConf();
MultipleOutputs.addNamedOutput(job, "myfile", TextOutputFormat.class, NullWritable.class, Text.class);-mapreduce生成文件命令
另一种方式是多个文件输出,在reduce阶段增加一些输出:
blockquotepublic static class Reduce extends ReducerText,Text,Text,Text{
eclipse中mapreduce没有文件
hadoop三节点配置方案
pass
eclipse配置mapreduce
配置前的准备
下载相关文件
注意:箭头所指的ppt可下载下来进行对照配置,方框所指的文件为后续所需要的文件。
启动eclipse并添加mapreduce插件
1.在Windows中解压eclipse-java-2019-03-R-linux-gtk-x86_64.tar.gz
并确定文件内容是否完整
2.将eclipse文件夹拖入centos中(最好放在桌面)并确认文件夹内容是否完整
注意:之所以.eclipseproduct没看到,是因为以.开头的文件为隐藏文件
3.将事先下载好的hadoop-eclipse-plugin-2.6.0.jar文件拖入eclipse文件夹的dropins文件夹中
4.运行eclipse
[root@master eclipse]# ./eclipse
登录后复制
注意:箭头所指的地方,用默认已出现的路径就ok
5.添加mapreduce插件
并添加hadoop的路径
注意:/usr/local/src/hadoop为个人hadoop路径
6.添加mapreduce项目
双击下方图像中箭头所指的插件名称
下方箭头所指的文件名可以随便取
7.打开mapreduce的窗口
可以看到mapreduce窗口
8.启动master节点(一个就好)
注意:记得用root账户执行该命令
jps查看运行结果
9.使用eclipse连接节点
添加前,首先关闭hadoop里面关于hdfs的安全检查
修改为下列代码
接下来,便是添加连接
1:随便写的名字
2:主机的名字,也可以写127.0.0.1
3:固定写50070
4:参考hadoop目录下etc/hadoop/目录下的core-site.xml文件中的valuehdfs://master:9000/value
5:user name为hadoop运行时的权限用户
10.加载完后,my hadoop会加载出之前创建的input、output文件夹
如果没有,建议打开终端执行以下两条命令(记得用root执行命令)
[root@master hadoop]# hdfs dfs -mkdir /input
[root@master hadoop]# hdfs dfs -mkdir /output
登录后复制
之所以这里报错,是因为我已经创建了这个文件夹
创建wordcount项目
前提:Windows中的文件能够直接复制粘贴到centos中
点击WordCount.java,右击复制
返回centos中,进入eclipse,进行粘贴
修改WordCount.java
1.删除该串代码
2.修改该串代码
修改后:
上传dream.txt
将事先下载到windows中的dream.txt复制到centos桌面
使用终端上传至hadoop中
[root@master Desktop]# hdfs dfs -put dream.txt /input/dream.txt
登录后复制
刷新eclipse的my Hadoop节点,查看文件
运行WordCount.java
点击进入WordCount.java,并进行下图操作
配置输入输出文件
将log4j.properties复制到src中
完成
复制hadoop路径下的etc/hadoop路径下的core-site.xml、hdfs-site.xml到src中
运行WordCount.java
完成
检验是否成功,可查看output文件是否生成对应的文档
hadoop
mapreduce
0套路,限时0元领,105G绝版通用流量卡,资费永久29
中国联通
广告
eclipse运行mapreduce的插件
5下载·0评论
2018年6月14日
eclipse配置mapreduce全教程
2294阅读·0评论·4点赞
2019年10月31日
MapReduce编程入门--用eclipse创建MapReduce工程
2804阅读·0评论·1点赞
2021年10月22日
Mac下eclipse的Hadoop开发环境配置中以及windows->preferences下看不到Hadoop/MapReduce的配置项问题解决
1077阅读·0评论·4点赞
2021年10月23日
eclipse开发MapReduce
804阅读·0评论·1点赞
2018年12月22日
Hadoop——MapReduce相关eclipse配置及Api调用(图文超详细版)(内含遇到错误的解决方法)
2888阅读·4评论·9点赞
2021年11月10日
Hadoop+eclipse运行MapReduce程序
1342阅读·0评论·0点赞
2015年11月24日
hadoop-eclipse-plugin-2.2.0.jar放到eclipse的plugins文件夹后,eclipse中没有map/reduce项
5359阅读·0评论·1点赞
2014年6月26日
无需安装虚拟机,Windows本地环境下使用Eclipse通过Hadoop进行MapReduce
867阅读·0评论·1点赞
2022年5月6日
Eclipse下编写hadoop的MapReduce程序
672阅读·0评论·0点赞
2019年4月28日
在Eclipse中实现MapReduce过程
870阅读·0评论·1点赞
2019年6月14日
调用MapReduce对文件中各个单词出现次数进行统计
864阅读·0评论·5点赞
2020年12月6日
Eclipse开发mapreduce程序环境搭建
3007阅读·1评论·4点赞
2019年8月30日
在Eclipse中运行第一个MapReduce程序
1736阅读·0评论·0点赞
2011年12月12日
Eclipse本地运行MapReduce
650阅读·0评论·0点赞
2018年6月3日
使用eclipse写mapreduce程序,然后打包程序到集群运行
259阅读·0评论·1点赞
2021年12月1日
使用Hadoop以及Eclipse平台,创建Hadoop项目——编写简单MapReduce程序,运行MapReduce词频统计程序,查看词频统计程序的结果。
2873阅读·0评论·0点赞
2022年4月29日
eclipse+MapReduce
41阅读·0评论·0点赞
2016年8月26日
Hadoop(MapReduce)入门 使用Eclipse开发
1.0W阅读·1评论·5点赞
2017年2月9日
在eclipse上搭建mapreduce开发环境及运行wordcount
9853阅读·0评论·0点赞
2017年2月8日
去首页
看看更多热门内容