我正在尝试运行alex holmes书中提供的示例 https://github.com/alexholmes/hadoop-book/blob/master/src/main/java/com/manning/hip/ch4/sort/total/TotalSortMapReduce.java
然而,当我作为一个jar后运行相同的程序时,我得到一个例外:
线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:1 在 org.apache.hadoop.mapred.lib.InputSampler.writePartitionFile(InputSampler.java:338) 在 com.manning.hip.ch4.sort.total.TotalSortMapReduce.runSortJob(TotalSortMapReduce.java:44)at at com.manning.hip.ch4.sort.total.TotalSortMapReduce.main(TotalSortMapReduce.java:12)
有人可以帮助我了解如何运行代码。我提供了以下论点。 args [0] - > names.txt的输入路径(需要排序的文件)。它在hadoop。
ARGS [1] - >应该生成的样本分区文件。 hadoop的路径。
ARGS [2] - >排序文件应该生成的输出目录。
请指导我运行此代码的方式。
答案 0 :(得分:2)
该问题的原因可能是输入数据文件非常小,但在代码中:
InputSampler.Sampler<Text, Text> sampler =
new InputSampler.RandomSampler<Text,Text>
(0.1,
10000,
10);
您在maxSplitsSampled
中将RandomSampler<Text,Text> (double freq, int numSamples, int maxSplitsSampled)
设置为 10
您可以通过将该参数设置为 1 来解决问题,或者只是确保它不大于您输入文件的拆分号。
答案 1 :(得分:1)
因此,我知道此线程已有5年以上的历史了,但是直到今天我才遇到相同的问题,而Mike的答案对我不起作用。 (我认为到目前为止,hadoop在内部也可以确保您不超过可用拆分的数量。)
但是,我发现了导致我的问题的原因,因此我发布了此希望,希望它将对其他因谷歌搜索导致他们陷入真正古老的hadoop线索的人有所帮助。
在我的情况下,问题是我指定的输入文件的样本太少并且采样频率太低。在这种情况下,可能会生成样本(少于您指定的减速器数量)(并非每次都提醒您,只是有时有时确实使您发疯)。每当发生这种情况时,我的系统就会因以下错误消息而崩溃:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9
at org.apache.hadoop.mapreduce.lib.partition.InputSampler.writePartitionFile(InputSampler.java:336)
at ...
例如,在这种情况下,仅生成了9个样本,我尝试使用9个以上的reducer。