Hadoop: ошибка при запуске примера ShowFileStatusTest - PullRequest
0 голосов
/ 05 мая 2018

каждый. Я новичок в hadoop и очень заинтересован в нем. Я прочитал книгу "Hadoop: Полное руководство". И я думаю, что столкнулся с проблемой, когда пытался запустить пример ShowFileStatusTest примерно на страницах 60 , Проблема в том, что он всегда имеет тест на сбой для функции fileStatusForFile. Ни один файл не был создан ни в файловой системе hdfs, ни в локальной файловой системе. Поэтому он выдает сообщение «Файл не существует» Ну, вот я показываю некоторые сообщения журнала, которые я получаю

> fileStatusForFile(ShowFileStatusTest)
> java.io.FileNotFoundException: File does not exist:
> /home/hadoop/setenv.sh    at
> org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1122)
>   at
> org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1114)
>   at
> org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
>   at
> org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1114

и я пытаюсь выяснить сообщения, но мне не удалось. Почему он использует fs.defaultFS? И почему это hdfs: //127.0.0.1: 0. Это действительно смущает меня, так как я проверил два файла, core- site.xml и core-default.xml. Он устанавливает для fs.defaultFS значение file: // и для fs.name.default значение hdfs: // master: 9000:

   18/04/30 18:40:40 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
18/04/30 18:40:40 INFO namenode.NameNode: createNameNode []
18/04/30 18:40:40 INFO impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
18/04/30 18:40:40 INFO impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
18/04/30 18:40:40 INFO impl.MetricsSystemImpl: NameNode metrics system started
18/04/30 18:40:40 INFO namenode.NameNode: fs.defaultFS is hdfs://127.0.0.1:0

вот мой код:

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
//import static org.hamcrest.*;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;


import java.io.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.fs.Path;
public class ShowFileStatusTest{
    private MiniDFSCluster cluster;
    private FileSystem fs;  
    @Before
    public void setUp() throws IOException {
        Configuration conf = new Configuration();
//      conf.set("fs.default.name","hdfs://master:9000");
        if(System.getProperty("test.build.data")==null) {
            System.setProperty("test.build.data","/tmp");
        }
        cluster = new MiniDFSCluster(conf, 1, true, null);
        fs = cluster.getFileSystem();
        OutputStream out = fs.create(new Path("/dir/file"));
        out.write("content".getBytes("UTF-8"));
        out.close();    

    }
    @After
    public void tearDown() throws IOException{
        if( fs!=null ){fs.close();}
        if( cluster!=null ) {cluster.shutdown();}
    }

    @Test(expected=FileNotFoundException.class)
    public void throwsFileNotFoundForNonExistentFile() throws IOException{
        fs.getFileStatus(new Path("no-such-file"));
    }

    @Test
    public void fileStatusForFile() throws IOException{
        Path file = new Path("/home/hadoop/setenv.sh");
        FileStatus stat = fs.getFileStatus(file);
        assertThat(stat.getPath().toUri().getPath(),is("/home/hadoop/setenv.sh"));
        assertThat(stat.isDir(),is(false));
        assertThat(stat.getLen(),is(7L));
//      assertThat(stat.getModificationTime(),
//          is(lessThanOrEqualTo(System.currentTimeMillis()))
//          );
        assertThat(stat.getReplication(),is((short)1) );
        assertThat(stat.getBlockSize(),is(64*124*1024));
        assertThat(stat.getOwner(),is("hadoop"));
        assertThat(stat.getGroup(),is("supergroup"));
        assertThat(stat.getPermission().toString(),is("rw-r--r--"));
    }

}

Уххххх, не носитель языка, поэтому я прошу прощения за мой плохой английский. Но я постараюсь, чтобы вы поняли. Спасибо

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

я думаю, что решил свою проблему. Вот мой окончательный код.

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
//import static org.hamcrest.*;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;


import java.io.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.fs.Path;
public class ShowFileStatusTest{
    private MiniDFSCluster cluster;
    private FileSystem fs;  
    @Before
    public void setUp() throws IOException {
        Configuration conf = new Configuration();
//      conf.set("fs.default.name","hdfs://master:9000");
        if(System.getProperty("test.build.data")==null) {
            System.setProperty("test.build.data","/tmp");
        }
        cluster = new MiniDFSCluster(conf, 1, true, null);
        fs = cluster.getFileSystem();
        OutputStream out = fs.create(new Path("/dir/file"));
        out.write("content".getBytes("UTF-8"));
        out.close();    

    }
    @After
    public void tearDown() throws IOException{
        if( fs!=null ){fs.close();}
        if( cluster!=null ) {cluster.shutdown();}
    }

    @Test(expected=FileNotFoundException.class)
    public void throwsFileNotFoundForNonExistentFile() throws IOException{
        fs.getFileStatus(new Path("no-such-file"));
    }

    @Test
    public void fileStatusForFile() throws IOException{
        Path file = new Path("/dir/file");
        FileStatus stat = fs.getFileStatus(file);
        assertThat(stat.getPath().toUri().getPath(),is("/dir/file"));
        assertThat(stat.isDir(),is(false));
        assertThat(stat.getLen(),is(7L));
//      assertThat(stat.getModificationTime(),
//          is(lessThanOrEqualTo(System.currentTimeMillis()))
//          );
        assertThat(stat.getReplication(),is((short)1) );
        assertThat(stat.getBlockSize(),is(128*1024*1024L));
        assertThat(stat.getOwner(),is("hadoop"));
        assertThat(stat.getGroup(),is("supergroup"));
        assertThat(stat.getPermission().toString(),is("rw-r--r--"));
    }
    @Test
    public void fileStatusForDirectory() throws IOException{
        Path dir = new Path("/dir");
        FileStatus stat = fs.getFileStatus(dir);
        assertThat(stat.getPath().toUri().getPath(),is("/dir"));
        assertThat(stat.isDir(),is(true));
        assertThat(stat.getLen(),is(0L));
    //  assertThat(stat.getModificationTime());
        assertThat(stat.getReplication(),is((short)0));
        assertThat(stat.getBlockSize(),is(0L));
        assertThat(stat.getOwner(),is("hadoop"));
        assertThat(stat.getGroup(),is("supergroup"));
        assertThat(stat.getPermission().toString(),is("rwxr-xr-x"));    
    }
}

Спасибо за Джагрут Шарма. Я изменил код ключа assertThat(stat.getBlockSize(),is(64*124*1024)); на assertThat(stat.getBlockSize(),is(128*1024*1024L)); и моя проблема решена без провала теста. В этом примере я думаю, что главная проблема в том, что я всегда неправильно понимаю сообщение в журнале. Когда я использую свой старый код с assertThat(stat.getBlockSize(),is(64*124*1024));, я всегда получаю сообщение журнала, которое объявляет ошибку:

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V

Сообщение действительно смущает меня. Я понятия не имел, что это подразумевает утверждение моей ошибки. Однако, я неправильно понимаю это, и я принимаю это как ошибку моего неправильного использования некоторых функций. Более того, я считаю само собой разумеющимся, что должен быть файл "/ dir / file" либо в локальной файловой системе, либо в формате hdf, так как я не имею представления об использовании MiniDFSCluster в этом примере. Во всяком случае, я должен сделать узнать больше ...

0 голосов
/ 06 мая 2018

Попробуйте внести эти изменения в свой код и снова запустить тест:

Строка 27: OutputStream out = fs.create(new Path("/dir/file")); до OutputStream out = fs.create(new Path("/home/hadoop/setenv.sh"));

Строка 54: assertThat(stat.getBlockSize(),is(64*124*1024)); до assertThat(stat.getBlockSize(),is(128*1024*1024L));

(Если проверка не пройдена из-за владельца) Строка 55: assertThat(stat.getOwner(),is("hadoop")); до assertThat(stat.getOwner(),is("<os-user-running-the-test>"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...