迭代的mapreduce作业具有numberformatexception错误

qjp7pelc  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(319)

我的程序运行多个map reduce作业,在传递给它的参数文件中,每行参数对应一个作业。
主要功能如下:

public static void main(String[] args) throws Exception {
        // Create configuration
        Configuration conf = new Configuration();

        if (args.length != 3) 
        {
            System.err.println("Usage: KnnPattern <in> <out> <parameter file>");
            System.exit(2);
        }

        //Reading argument using Hadoop API now
        conf.set ("params", (args[2]));
        String param = conf.get("params");
        StringTokenizer inputLine = new StringTokenizer(param, "|");

        int n = 1;
        while(inputLine.hasMoreTokens())
        {

            conf.set("passedVal", inputLine.nextToken());

            //Job Configuration here

            ++n;
        }}

main函数读取第三个参数,即存储在hdfs中的参数文件,并为它运行的每个mapreduce作业传递一个参数字符串。或者至少这是我想要它做的。我不能百分之百肯定这是否完全正确。
Map器的设置如下所示:

protected void setup(Context context) throws IOException, InterruptedException
    {
            // Read parameter file using alias established in main()
            Configuration conf = context.getConfiguration();
            String knnParams = conf.get("passedVal");

            StringTokenizer st = new StringTokenizer(knnParams, ",");

            // Using the variables declared earlier, values are assigned to K and to the test dataset, S.
            // These values will remain unchanged throughout the mapper
            K = Integer.parseInt(st.nextToken());
            normalisedSAge = normalisedDouble(st.nextToken(), minAge, maxAge);
            normalisedSIncome = normalisedDouble(st.nextToken(), minIncome, maxIncome);
            sStatus = st.nextToken();
            sGender = st.nextToken();
            normalisedSChildren = normalisedDouble(st.nextToken(), minChildren, maxChildren);

    }

我的参数文件包含以下内容:
67,16668,单身,男,3 | 40,25000,单身,男,2 | 67,16668,单身,男,3
这是3组由“|”分隔的输入。
我得到的运行时错误如下:
错误:java.lang.numberformatexception:对于输入字符串:java.lang.numberformatexception.forinputstring(numberformatexception)处的“/knn/params/paramfail.txt”。java:65)在java.lang.integer.parseint(integer。java:569)在java.lang.integer.parseint(integer。java:615)在knnpattern$knnmapper.setup(knnpattern。java:168)在org.apache.hadoop.mapreduce.mapper.run(mapper。java:143)在org.apache.hadoop.mapred.maptask.runnewmapper(maptask。java:787)在org.apache.hadoop.mapred.maptask.run(maptask。java:341)在org.apache.hadoop.mapred.yarnchild$2.run(yarnchild。java:164)位于java.security.accesscontroller.doprivileged(本机方法)javax.security.auth.subject.doas(主题。java:422)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1762)在org.apache.hadoop.mapred.yarnchild.main(yarnchild。java:158)
容器被应用程序管理员杀死。按要求杀死集装箱。出口代码为143,集装箱出口代码为非零143
据我所知,这看起来像是一个打字错误(?),我不知道是怎么发生的,为什么会发生。
这些代码主要是我从这里得到的-https://github.com/matt-hicks/mapreduce-knn/blob/master/knnpattern.java
它只运行一组参数,但我需要它运行几个参数或测试用例一次为进一步的应用。
有没有办法解决这个问题,或者至少知道我为什么会犯这个错误?非常感谢您的帮助。谢谢您。

q35jwt9p

q35jwt9p1#

我明白了为什么我会有数字格式异常。
问题是,我将第三个参数(args[2])读取为字符串,而不是hdfs中的文件位置,这就是为什么错误日志会显示:
对于输入字符串:“/knn/params/paramfail.txt”
出于测试的目的,我现在所做的不是给出文件位置,而是直接传递输入文本作为第三个参数。这帮助我摆脱了这个特定的错误。

$ hadoop jar poker00.jar KnnPokerhand /Poker/train.txt /PokerOutputs/Output00 1,1,1,13,2,4,2,3,1,12,0/3,12,3,2,3,11,4,5,2,5,1/1,9,4,6,1,4,3,2,3,9,1

希望这有助于任何人谁有这个问题在未来。干杯。

相关问题