迭代的 MapReduce 作业出现 NumberFormatException 错误
Iterated MapReduce job has NumberFormatException error
我的程序运行有多个 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 函数读取第 3 个参数,即存储在 HDFS 中的参数文件,并为它 运行s 的每个 MapReduce 作业传递 1 个参数字符串。
或者至少那是我想要它做的。我不是 100% 确定这是否完全正确。
我的 Mapper 的设置如下所示:
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, Single, Male, 3|40, 25000, Single, Male, 2|67, 16668, Single, Male, 3
即由“|”分隔的 3 组输入。
我得到的 运行 时间错误是这样的:
Error: java.lang.NumberFormatException: For input string: "/KNN/PARAMS/paramFinal.txt"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.parseInt(Integer.java:615)
at KnnPattern$KnnMapper.setup(KnnPattern.java:168)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Container killed by the ApplicationMaster. Container killed on
request. Exit code is 143 Container exited with a non-zero exit code
143
据我所知,这看起来像是一个类型转换错误(?),我不确定这是怎么发生的以及为什么会发生。
这段代码主要是我从这里得到的 - https://github.com/matt-hicks/MapReduce-KNN/blob/master/KnnPattern.java
它 运行 只适用于一组参数,但我需要它 运行 同时用于多个参数或测试用例以供进一步应用。
有什么方法可以解决这个问题,或者至少知道为什么我会收到这个错误?
很感谢任何形式的帮助。谢谢。
我明白了为什么会收到 NumberFormatException。
问题是我将第三个参数 (args[2]) 读取为字符串而不是 HDFS 中的文件位置,这就是错误日志显示的原因:
对于输入字符串:"/KNN/PARAMS/paramFinal.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
希望这对以后遇到此问题的任何人有所帮助。干杯。
我的程序运行有多个 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 函数读取第 3 个参数,即存储在 HDFS 中的参数文件,并为它 运行s 的每个 MapReduce 作业传递 1 个参数字符串。 或者至少那是我想要它做的。我不是 100% 确定这是否完全正确。
我的 Mapper 的设置如下所示:
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, Single, Male, 3|40, 25000, Single, Male, 2|67, 16668, Single, Male, 3
即由“|”分隔的 3 组输入。
我得到的 运行 时间错误是这样的:
Error: java.lang.NumberFormatException: For input string: "/KNN/PARAMS/paramFinal.txt" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:569) at java.lang.Integer.parseInt(Integer.java:615) at KnnPattern$KnnMapper.setup(KnnPattern.java:168) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Container killed by the ApplicationMaster. Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143
据我所知,这看起来像是一个类型转换错误(?),我不确定这是怎么发生的以及为什么会发生。
这段代码主要是我从这里得到的 - https://github.com/matt-hicks/MapReduce-KNN/blob/master/KnnPattern.java
它 运行 只适用于一组参数,但我需要它 运行 同时用于多个参数或测试用例以供进一步应用。
有什么方法可以解决这个问题,或者至少知道为什么我会收到这个错误? 很感谢任何形式的帮助。谢谢。
我明白了为什么会收到 NumberFormatException。
问题是我将第三个参数 (args[2]) 读取为字符串而不是 HDFS 中的文件位置,这就是错误日志显示的原因:
对于输入字符串:"/KNN/PARAMS/paramFinal.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
希望这对以后遇到此问题的任何人有所帮助。干杯。