精华内容
下载资源
问答
  • Hadoop 任务分解

    千次阅读 2011-04-22 10:38:00
    jobtracker是一个Java应用,它的主类是JobTracker - tasktrackers,运行被分割的任务。tasktrackers是一个Java应用,它的主类是TaskTracker - 分布式文件系统(通常是HDFS),用来在其它实体之间共享文件...

    从高层看,有四个独立的实体:

     

    - 客户端,提交MapReduce任务

    - jobtracker,协调任务的运行。jobtracker是一个Java应用,它的主类是JobTracker

    - tasktrackers,运行被分割的任务。tasktrackers是一个Java应用,它的主类是TaskTracker

    - 分布式文件系统(通常是HDFS),用来在其它实体之间共享文件

     

    Job提交

     

    JobClient中的runjob()方法是一个创建JobClient实例并调用它的submitJob()方法,在提交job之后,runJob()一秒钟获取一次任务执行进度的报告,并且在与上次报告不同的情况下,像控制台发送进度信息。当任务完成,如果是成功的,job计数器显示出来。否则,任务中引发错误的原因被记录到控制台上。

     

    JobClient的submitJob()方法实现了任务提交过程,它做了如下的工作:

     

    - 向jobtracker询问一个新的job ID(通过调用JobTracker上的getNewJobId())

    - 检查job的输出明细。比如,输出目录不存在或者指定的输出目录是否已经存,这样,这个任务就不会被提交并返回一个错误给   MapReduce程序。

    - 计算任务的输入分割。如果不能计算分割,比如,没有指定输入路径,然后这个任务就不会被提交并返回一个错误给MapReduce   程序

    - 拷贝这个任务运行所需要的资源——包括任务的jar文件,配置文件,还有计算出的输入分割——到jobtracker的一个目录下,这   个目录以这个job ID开始。任务jar以一个高的复制因子被复制(通过mapred.submit.replication属性来设置,默认是10),   这样当它们为这个job运行tasks的时候,在集群中就有很多的拷贝。

    - 告诉jobtracker,任务已经准备好运行(通过调用JobTracker的submitJob())

     

    Job初始化

     

    当JobTracker的submitJob()方法被调用后,它将它放在一个内部队列里,job计划会提取它并初始化它。初始化涉及创建一个代表正在运行的job的对象,这个对象封装了它的tasks,并获取相关信息来跟踪tasks的状态和进度。

     

    创建一个要运行的tasks列表,job计划首先取出JobClient从共享文件系统中计算出来的输入分割。然后为每个分割创建一个map。reduce task的个数是由JonConf的mapred.reduce.tasks属性设定的,通过setNumReducetasks()方法来设定,然后计划就简单地创建这个数量的reduce task。tasks这个时候就被分配ID了。

     

    Task分配

     

    TaskTrackers运行一个循环,周期性的向jobtracker发送心跳。心跳向jobtracker证明这个tasktracker是活着的,但是它们也作为信息的一个通道。作为心跳的一部分,一个tasktracker说明是否为一个新的task的运行做好了准备,如果做好了,jobtracker将安排一个task,并且通过心跳的返回值来和tasktracker通信。

     

    jobtracker在能够选择一个任务给一个tasktracker之前,jobtracker必须选择一个job来提取task。有很多的计划算法,默认的是简单地维护一个优先级的job列表。选择一个job之后,jobtracker就开始选择这个job的task。

     

    Tasktrackers有固定数量的map和reduce槽:比如,一个tasktracker可能能并行运行两个map任务和2个reduce任务。默认的计划是在reduce任务槽填满之前填满map task槽,所以如果tasktracker有至少一个map任务槽,jobtracker将选择一个map任务;否则,将选择一个reduce任务。

     

    要选择一个reduce任务,jobtracker简单的从它的准备好执行的reduce任务列表中抽取下一个,因为这里没有数据位置的考虑。然而,对于一个map任务,要考虑tasktracker的网络位置并选择一个与tasktracker最近的输入分割。乐观情况下,任务是rack-local的:和这个分割在同一个rack上,但是不是同样的节点。一些task既不是data-local也不是rack-local,而是从不同的任务在运行的rack上获取数据。你可以通过查看一个job的counters读到每种类型task的比例。

     

    任务执行

     

    现在这个tasktracker已经被分配了task,下一步它就要运行这个task了。首先,它通过将job jar包从共享文件系统拷贝到tasktracker

    的文件系统上。它也从分布式缓存拷贝任何这个应用需要的文件到本地磁盘;第二,它为这个task创建一个本地工作目录,解压jar的内容到这个

    目录下;第三,创建一个TaskRunner实例来运行这个task。

     

    TaskRunner载入一个新的java虚拟机来运行每个task,所以用户定义的map和reduce中有任何的bug都不会影响到tasktracker。然而

    ,可以在task间重用JVM。

     

    子进程和父进程通过umbilical接口通信。通过这种方式它每隔几秒钟告诉父进程这个task的进度,直到task完毕。

    展开全文
  • 通过JavaHadoop集群提交MapReduce任务 服务器的hadoop配置拷到本地,设置hosts指向namenode和resourcemanager,本地执行hadoop jar 任务做成schedule,定时调用shell脚本运行java任务 Eclipse的hadoop插件

    Hadoop运行计算任务,大概有以下几种方式

    1. 把MapReduce任务打包到jar里,上传到服务器,用命令行启动
    2. 通过Java向Hadoop集群提交MapReduce任务
    3. 服务器的hadoop配置拷到本地,设置hosts指向namenode和resourcemanager,本地执行hadoop jar
    4. 任务做成schedule,定时调用shell脚本运行java任务
    5. Eclipse的hadoop插件

    本文介绍第2种方式

    展开全文
  • 但是java作为hadoop的原生语言,无论是性能效率、规范性、输出工具的易用性和完整性上,都是python无法比拟的,因此学习如何采用java进行编写MR任务。第一个WordCount任务就遇到了麻烦,单纯的进行词频统计是非常...

    由于之前写MR任务都是采用Streamming方式,以python语言编写,因此对于整个MR的过程细节要求不高,也不需要理解。但是java作为hadoop的原生语言,无论是性能效率、规范性、输出工具的易用性和完整性上,都是python无法比拟的,因此学习如何采用java进行编写MR任务。

    第一个WordCount任务就遇到了麻烦,单纯的进行词频统计是非常简单的,但是如果要将最后的结果按照频次排序倒序输出,就比较麻烦了。查阅资料发现解决方案是,再写一个MR任务,利用hadoop自带的key-value互换Map(Invert),进行键值对互换,再根据hadoop的map阶段根据键值排序的机制,进行排序,当然,要修改比较器为倒序排序。这样的方法是可行的,但是需要2个MR任务,虽然中间结果可以使用Sequcen方式存储与读取,但还是略微繁杂,因此考虑以将数据全部读入一个reducer,处理时利用hashtable进行存储,在reducer清理阶段,进行排序,拿到FileSystem将结果写入HDFS。

    整体上看,这个程序是很简洁的,但是也有缺点,就是在数据量非常大的时候,1个reducer进行排序会对内存和cpu造成很大的压力。

    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapred.*;
    
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.util.*;
    
    /**
     * Created by yuanye8 on 2016/10/10.
     */
    public class WordCountExample {
    
        public static class WordCountMapper implements Mapper<LongWritable, Text, Text, IntWritable> {
            private Text key = new Text();
            private IntWritable value = new IntWritable();
    
            public void configure(JobConf jobConf) {
    
            }
    
            public void map(LongWritable longWritable, Text text, OutputCollector<Text, IntWritable> outputCollector, Reporter reporter) throws IOException {
                String[] words = text.toString().trim().split(" ");
                key = new Text();
                for (String word : words) {
                    key.set(word);
                    value.set(1);
                    outputCollector.collect(key, value);
                }
            }
    
            public void close() throws IOException {
    
            }
        }
    
        public static class WordCountReducer implements Reducer<Text, IntWritable, Text, IntWritable> {
            private IntWritable value = new IntWritable();
            private Hashtable<String, Integer> hashtable = new Hashtable<String, Integer>();
            private String output_path = null;
    
            public void configure(JobConf jobConf) {
                this.output_path = jobConf.get("output_path");
            }
    
            public void reduce(Text text, Iterator<IntWritable> iterator, OutputCollector<Text, IntWritable> outputCollector, Reporter reporter) throws IOException {
                int sum = 0;
                while (iterator.hasNext()) {
                    int tmp = iterator.next().get();
                    sum += tmp;
                }
                value.set(sum);
                hashtable.put(text.toString(), sum);
                outputCollector.collect(text, value);
    
            }
    
            public void close() throws IOException {
                outputSortResult();
            }
    
            public void outputSortResult() {
                FileSystem hdfs = null;
                BufferedWriter bw = null;
                try {
                    hdfs = FileSystem.get(new JobConf());
                    bw = new BufferedWriter(
                            new OutputStreamWriter(
                                    hdfs.create(new Path(output_path + "_sort"), true)));
    
                    Set<Map.Entry<String, Integer>> set = this.hashtable.entrySet();
                    Map.Entry[] entries = set.toArray(new Map.Entry[set.size()]);
                    Arrays.sort(entries, new Comparator<Map.Entry>() {
                        public int compare(Map.Entry o1, Map.Entry o2) {
                            int v1 = (Integer) o1.getValue();
                            int v2 = (Integer) o2.getValue();
                            return v2 - v1;
                        }
                    });
    
                    for (Map.Entry<String, Integer> entry : entries) {
                        String key = entry.getKey();
                        int value = entry.getValue();
                        bw.write(key + "\t" + value + "\n");
                    }
                    bw.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    FileTool.close(bw);
                }
            }
        }
    
        public static void main(String[] args) throws IOException {
            if (args.length < 2) {
                System.out.println("Usage : WordCountExample <input> <output>");
                System.exit(-1);
            }
            Path input_path = new Path(args[0]);
            Path output_path = new Path(args[1]);
    
            JobConf conf = new JobConf();
            conf.set("output_path", args[1]);
            conf.setJobName("WordCount");
            conf.setJarByClass(WordCountExample.class);
            conf.setMapperClass(WordCountMapper.class);
            conf.setReducerClass(WordCountReducer.class);
            conf.setInputFormat(TextInputFormat.class);
            conf.setOutputFormat(TextOutputFormat.class);
            TextInputFormat.addInputPath(conf, input_path);
            FileOutputFormat.setOutputPath(conf, output_path);
            conf.setCombinerClass(WordCountReducer.class);
            conf.setMapOutputKeyClass(Text.class);
            conf.setMapOutputValueClass(IntWritable.class);
            conf.setOutputKeyClass(Text.class);
            conf.setOutputValueClass(IntWritable.class);
            conf.setNumReduceTasks(1);
    
            RunningJob runningJob = JobClient.runJob(conf);
            runningJob.waitForCompletion();
        }
    }
    

    最后,记录一个未解决的疑问:
    在关闭打开文件读取流时 FileTool.close(bw);
    原来是FileTool.close(bw,hdfs);
    但是会报错,报错内容为map阶段报 FileSystem Closed这个错误。
    可我关闭是在reduce的清理阶段,即close()时进行的,不应该报这个错误。

    1. 那么,我猜想,是reduce清理阶段关闭文件系统时, 整个任务还未结束, map阶段可能也需要再次使用文件系统进行一些操作。
    2. 阅读其他源码, 对于主程序里打开的文件系统 FileSystem , 最后也没有关闭的操作,难道MR任务完成后会自动关闭文件系统么?不需要程序员自动关闭吗?

    如有大神清晰理解我的问题,请评论留言指教,谢谢!

    展开全文
  • 10020 failed java.lang.OutOfMemoryError GC overhead limit exceeded Java heap space

    Hadoop任务运行中java.net.ConnectException: to 0.0.0.0:10020 failed

    在执行Hive 语句的任务时,最近频繁的发生如下的报错:

    java.io.IOException: java.net.ConnectException: Call From hadoop-001/192.168.1.101 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectExcep
    tion: 拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
            at org.apache.hadoop.mapred.ClientServiceDelegate.invoke(ClientServiceDelegate.java:334)
            at org.apache.hadoop.mapred.ClientServiceDelegate.getJobStatus(ClientServiceDelegate.java:419)
            at org.apache.hadoop.mapred.YARNRunner.getJobStatus(YARNRunner.java:532)
            at org.apache.hadoop.mapreduce.Cluster.getJob(Cluster.java:183)
            at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:580)
            at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:578)
            at java.security.AccessController.doPrivileged(Native Method)
            at javax.security.auth.Subject.doAs(Subject.java:415)
            at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
            at org.apache.hadoop.mapred.JobClient.getJobUsingCluster(JobClient.java:578)
            at org.apache.hadoop.mapred.JobClient.getJob(JobClient.java:596)
            at org.apache.hadoop.hive.ql.exec.mr.HadoopJobExecHelper.progress(HadoopJobExecHelper.java:288)
            at org.apache.hadoop.hive.ql.exec.mr.HadoopJobExecHelper.progress(HadoopJobExecHelper.java:547)
            at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:426)
            at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:136)
            at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:153)
            at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:85)
            at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1503)
            at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1270)
            at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1088)
            at org.apache.hadoop.hive.ql.Driver.run(Driver.java:911)
            at org.apache.hadoop.hive.ql.Driver.run(Driver.java:901)
            at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:268)
            at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:220)
            at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:423)
            at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:359)
            at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:742)
            at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:686)
            at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:625)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:606)
            at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

    报错信息提示,在访问端口 100020的时候出错,这表示DataNode 需要访问 MapReduce JobHistory Server,而默认值是: 0.0.0.0:10020 。

    修改配置文件

    找到{HADOOP_HOME}/etc/hadoop/mapred-site.xml配置文件 ,增加如下配置:
    
    <property>
        <name>mapreduce.jobhistory.address</name>
        <!-- 配置实际的主机名和端口-->
        <value>{namenode}:10020</value>
    </property>

    启动 JobHistory 服务

    在namenode上执行命令

    {hadoop_dir}/sbin/mr-jobhistory-daemon.sh start historyserver

    之后就可以在 historyserver 的日志中,查看job的运行情况了。

    错误处理

    启动服务不久报了如下的错误:

    2016-07-29 14:36:44,418 ERROR org.apache.hadoop.mapreduce.v2.hs.HistoryFileManager: Error while trying to scan the directory hdfs://namenode:9000/tmp/had
    oop-yarn/staging/history/done_intermediate/hadoop
    java.io.IOException: com.google.protobuf.ServiceException: java.lang.OutOfMemoryError: Java heap space
       ......
    Caused by: com.google.protobuf.ServiceException: java.lang.OutOfMemoryError: Java heap space
            at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:242)
        ......
    2016-07-29 14:40:07,068 ERROR org.apache.hadoop.mapreduce.v2.hs.HistoryFileManager: Error while trying to scan the directory hdfs://namenode:9000/tmp/had
    oop-yarn/staging/history/done_intermediate/hadoop
    java.io.IOException: com.google.protobuf.ServiceException: java.lang.OutOfMemoryError: GC overhead limit exceeded

    接着我修改了配置文件,增加heap 的大小
    ${HADOOP_DIR}/etc/hadoop/mapred-env.sh

    export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=2000

    重新启动 JobHistory 服务,问题解决。


    [1] hadoop 0.0.0.0/0.0.0.0:10020 connection refused
    [2] hadoop运行mapreduce作业无法连接0.0.0.0/0.0.0.0:10020

    展开全文
  • 三、项目下新建lib文件夹,导入hadoop相关jar,jar在源码中有 四、项目下建包,写如下三个类 1、WorldCountMapper.java package com.zjt.mapreducer.data; import java.io.IOException; import org.apache.had
  • 1、下载hadoop并设置环境变量 HADOOP_HOME=F:\path_to\hadoop 在Path环境变量后追加 ;%HADOOP_HOME%\bin 2、下载winutil,并把winutils.exe和hadoop.dll文件复制到bin目录下 3、在idea中新建一个项目,导入hadoop...
  • hadoop任务提交过程

    千次阅读 2015-06-14 22:30:01
    用JVisualVM监视Eclipse hadoop插件的Hadoop任务提交 打开JVisualVM准备着,运行一个Job. 运行后立即就可以看到一个Java进程. 用JVisualVM打开这个进程查看,如图: 我打开我电脑上的目录 F:\...
  • hadoop任务运行报错记录

    千次阅读 2013-11-29 18:17:40
    org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /order_closed_compress/_temporary/_attempt_201311152318_5890_m_000065_0/part-m-0006
  • virtualbox hadoop
  • Java/Web调用Hadoop进行MapReduce示例

    万次阅读 多人点赞 2017-05-13 10:35:43
    使用Java或JavaWeb封装Hadoop进行远程调用Hadoop MapReduce任务
  • 问题:Hadoop集群在运行mapreduce任务的时候报错:Error: Java heap space 问题分析:这个错误,首先一看到,便猜测是jvm的堆内存不够,于是便查询了hadoop运行mapreduce的时候jvm的默认值(我之前在搭建集群的时候...
  • hadoophadoop集群上执行java程序

    千次阅读 2019-03-04 14:07:11
    1、将java项目打包成jar文件 具体过程这里不解释,在我的另一篇博客 将java程序打包成jar 里,有win系统通过idea打包...2、打开hadoop集群,start-all.sh 3、将jar包传到linux平台上,删除jar包里的.SF .RSA *SF文件
  • Hadoop执行任务过程

    千次阅读 2018-01-16 09:48:18
    用户从client端提交一个任务,此任务指定了运行的jar包,除java jre外依赖的jar包,待处理的数据文件以及输出文件夹的位置和名称client端首先检查此任务输出的文件夹是否存在,然后向JobTracker为此任务申请一个id...
  • 最近在研究Mahout开源代码时尝试利用MapReduce加载本地训练好的机器学习模型至集群并进行分布式预测,整个程序通过Hadoop jar XXXX.jar来执行, 期间由于需要在本地进行模型训练同时训练数据集条目较多模型规模比较...
  • 通过java api提交自定义hadoop 作业

    千次阅读 2015-02-11 15:52:03
    一、hadoop的基本数据类型和java的基本数据类型是不一样的,但是都存在对应的关系 如下图 如果需要定义自己的数据类型,则必须实现Writable hadoop的数据类型可以通过get方法获得对应的java数据类型 而java的数据...
  • 通过JavaHadoop集群提交MapReduce任务 服务器的hadoop配置拷到本地,设置hosts指向namenode和resourcemanager,本地执行hadoop jar 任务做成schedule,定时调用shell脚本运行java任务 Eclipse的hadoop插件
  • 你可以在一个专用的本地模式配置下,使用一台单机执行这些样例程序,你不需要启动Hadoop核心框架。对于调试和单元测试,单机模式配置也是最理想的。你能够从Apress网站(http://www.apress.com)上这本书所在的页面...
  • 这节我们来学习如何将HadoopJava相结合进行开发,这也是大家学习大数据最后打交道最多的内容,毕竟Hadoop环境的搭建虽然复杂,但是一旦搭建好之后我们的任务便是在这个架构的基础上进行java代码的开发。...
  • hadoop jar命令调用的java类地址 #hadoop jar 短命令格式 hadoop jar 要执行的jar包 要执行的任务名 输入目录 输出目录 #hadoop jar 长命令格式 hadoop jar 要执行的jar包 要执行的类全名 [要执行的任务名] ...
  • yarn-site.xml文件中加上 &lt;property&gt;  &lt;name&gt;yarn.app.mapreduce.am.resource.mb&lt;...原因:yarn默认是设置1.5G内存来运行任务,但是虚拟机内存太小,没有1....
  • 错误原文分析文件操作超租期,实际上就是data stream操作过程中文件被删掉了。通常是因为Mapred多个task操作...这个是datanode同时处理请求的任务上限,总默认值是 4096,该参数取值范围[1 to 8192]hadoop docs hdfs-si
  • 我想试一下wordcount的任务,但是任务提交后可以下发到slave上创建任务去执行,但是中间不知道出现什么错误,slave上的ssh会闪断一次,并且该台slave上面的datanode和nodeManager会被杀掉。换一台slave会出现同样的...
  • Java及Web程序调用hadoop2.6

    千次阅读 2015-01-11 01:11:42
    1. hadoop集群:1.1 系统及硬件配置: hadoop版本:2.6 ;三台虚拟机:node101(192.168.0.101)、node102(192.168.0.102)、node103(192.168.0.103); 每台机器2G内存、1个CPU核; node101: NodeManager、 ...
  • 大数据:Hadoop入门经典案例wordcount单词统计Java代码实现,Windows 10环境,IntelliJ IDEA集成开发环境。 附1通过命令行形式实现大数据平台Hadoop下单词统计功能。现在通过自己编写Java代码实现。本例基于Hadoop ...
  • 关于hadoop及相关模块的安装,自己下载模块安装的话较为麻烦,有配置、版本对应的些许问题,使用cloudera集成好的平台也不错,但如果跑的任务多的话,机器配置要好一点,模糊的记得是最低需要8G内存?下面先记录下...
  • 使用HadoopJava API操作HDFS

    千次阅读 2017-08-13 11:14:49
    本文介绍Java API访问HDFS,实现文件的读写,文件系统的操作等。开发环境为eclipse,开发时所依赖的jar包,可在Hadoop安装目录下找到。Demopackage com.test.hdfs;import org.apache.hadoop.conf.Configuration; ...
  • 学习Hadoop第八课(利用Java接口来操作Hadoop

    万次阅读 多人点赞 2016-09-09 18:48:11
    这节我们来学习如何将HadoopJava相结合进行开发,这也是大家学习大数据最后打交道最多的内容,毕竟Hadoop环境的搭建虽然复杂,但是一旦搭建好之后我们的任务便是在这个架构的基础上进行java代码的开发。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,010
精华内容 30,404
关键字:

java起hadoop任务

java 订阅