Я пытаюсь воспроизвести пример Bloom Filtering из книги Шаблон проектирования MapReduce.
Далее я покажу только интересующий код:
public static class BloomFilteringMapper extends Mapper<Object, Text, Text, NullWritable>
{
private BloomFilter filter = new BloomFilter();
protected void setup( Context context ) throws IOException
{
URI[] files = DistributedCache.getCacheFiles( context.getConfiguration() );
String path = files[0].getPath();
System.out.println( "Reading Bloom Filter from: " + path );
DataInputStream strm = new DataInputStream( new FileInputStream( path ) );
filter.readFields( strm );
strm.close();
}
//...
}
public static void main( String[] args ) throws Exception
{
Job job = new Job( new Configuration(), "description" );
URI uri = new URI("hdfs://localhost:9000/user/draxent/comment.bloomfilter");
DistributedCache.addCacheFile( uri, job.getConfiguration() );
//...
}
Когда я пытаюсь выполнить его, я получаю следующую ошибку:
java.io.FileNotFoundException: /user/draxent/comment.bloomfilter
Но выполнение команды:
bin/hadoop fs -ls
Я вижу файл:
-rw-r--r-- 1 draxent supergroup 405 2015-11-25 17:12 /user/draxent/comment.bloomfilter
Так что я совершенно уверен, что проблема в линии:
URI uri = new URI("hdfs://localhost:9000/user/draxent/comment.bloomfilter");
Но я пробовал несколько разных конфигураций, например:
"hdfs://user/draxent/comment.bloomfilter"
"/user/draxent/comment.bloomfilter "
"comment.bloomfilter"
И никто не работает.
Я попытался найти реализация cfeduke, но не смог решить свою проблему.
Ответить на комментарии:
- ravindra: URI files[0] содержит строковый элемент, переданный в main;
- Манджунат Баллур: да, вы правы. Но поскольку файл существует (вы можете увидеть его из bin/hadoop fs -ls), это означает, что проблема связана со строкой path, переданной в FileInputStream. Но я передаю строку этому, как всегда. Я проверил, значение пути: comment.bloomfilter... значит, оно должно быть правильным.