我的程序运行多个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
它只运行一组参数,但我需要它运行几个参数或测试用例一次为进一步的应用。
有没有办法解决这个问题,或者至少知道我为什么会犯这个错误?非常感谢您的帮助。谢谢您。
1条答案
按热度按时间q35jwt9p1#
我明白了为什么我会有数字格式异常。
问题是,我将第三个参数(args[2])读取为字符串,而不是hdfs中的文件位置,这就是为什么错误日志会显示:
对于输入字符串:“/knn/params/paramfail.txt”
出于测试的目的,我现在所做的不是给出文件位置,而是直接传递输入文本作为第三个参数。这帮助我摆脱了这个特定的错误。
希望这有助于任何人谁有这个问题在未来。干杯。