Hadoop: Как выполнить модульное тестирование FileSystem - PullRequest
11 голосов
/ 29 ноября 2011

Я хочу запустить модульный тест, но мне нужен экземпляр org.apache.hadoop.fs.FileSystem. Есть ли какие-либо макеты или другие решения для создания файловой системы?

Ответы [ 10 ]

17 голосов
/ 05 февраля 2015

Если вы используете hadoop 2.0.0 и выше - рассмотрите возможность использования hadoop-minicluster

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-minicluster</artifactId>
    <version>2.5.0</version>
    <scope>test</scope>
</dependency>

С его помощью вы можете создавать временные файлы hdf на локальном компьютере и запускать на нем свои тесты. Метод setUp может выглядеть так:

baseDir = Files.createTempDirectory("test_hdfs").toFile().getAbsoluteFile();
Configuration conf = new Configuration();
conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, baseDir.getAbsolutePath());
MiniDFSCluster.Builder builder = new MiniDFSCluster.Builder(conf);
hdfsCluster = builder.build();

String hdfsURI = "hdfs://localhost:"+ hdfsCluster.getNameNodePort() + "/";
DistributedFileSystem fileSystem = hdfsCluster.getFileSystem();

А в методе tearDown вы должны выключить мини-кластер hdfs и удалить временный каталог.

hdfsCluster.shutdown();
FileUtil.fullyDelete(baseDir);
7 голосов
/ 30 ноября 2011

Посмотрите на тестовую банку hadoop

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-test</artifactId>
    <version>0.20.205.0</version>
</dependency>

, которая классифицируется для настройки MiniDFSCluster и MiniMRCluster, чтобы вы могли тестировать без hadoop

5 голосов
/ 29 ноября 2011

Почему бы не использовать фальшивый фреймворк, такой как Mockito или PowerMock, чтобы высмеивать ваши взаимодействия с FileSystem?Ваши модульные тесты не должны зависеть от реальной файловой системы, а должны просто проверять поведение вашего кода при взаимодействии с файловой системой.

2 голосов
/ 29 ноября 2011

Один из возможных способов - использовать TemporaryFolder в Junit 4.7.

См .: http://www.infoq.com/news/2009/07/junit-4.7-rules или http://weblogs.java.net/blog/johnsmart/archive/2009/09/29/working-temporary-files-junit-47.

1 голос
/ 29 ноября 2011

Что я сделал (пока не найду лучшего решения), я расширил файловую систему.

0 голосов
/ 27 ноября 2018

Я попробовал решения Thirupathi Chavati и Alexander Tokarev с sbt, и:

import org.apache.hadoop.hdfs.MiniDFSCluster

будет работать только путем добавления:

libraryDependencies += "org.apache.hadoop" % "hadoop-hdfs" % "2.8.1" classifier "tests" libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "2.8.1" classifier "tests"

0 голосов
/ 30 сентября 2018

Мое решение - создать DummyFileSystem, который расширяет абстрактную файловую систему Hadoop, поэтому я могу подделать, если файл существует или нет ...

Пример «существует весь файл»:

@Override
public FileStatus getFileStatus(Path f) throws IOException {
        return new FileStatus(10, false, 3, 128*1024*1024,1,1, null, null, null, f);
}

Мне легче контролировать ложные данные.

0 голосов
/ 13 августа 2018

добавить ниже зависимости

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-minicluster</artifactId>
        <version>2.7.3</version>
       <!-- <scope>test</scope>-->
    </dependency>

Добавьте приведенный ниже код, он создаст FileSysetm.

import java.nio.file.{Files, Paths}


import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.hdfs.MiniDFSCluster


object MiniClusterDemo extends App {
  def sysDir: String = System.getProperty("user.dir")

  if(miniCluster!=null) println("Cluster created and active") else println("something went wrong")

  def miniCluster: FileSystem = {
    val basePath = Paths.get(s"$sysDir")

    val baseDir = Files.createTempDirectory(basePath,"hdfs_test").toFile.getAbsoluteFile
    val conf = new Configuration()
   conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, baseDir.getAbsolutePath)
    val hdfsCluster = new MiniDFSCluster.Builder(conf).build()
    val hdfsURI = s"hdfs://localhost:${hdfsCluster.getNameNodePort}/"
    val fileSystem = hdfsCluster.getFileSystem
    //hdfsCluster.shutdown();
    //FileUtil.fullyDelete(baseDir);
    fileSystem
  }

}

См. Примеры журналов после создания MiniCluster

enter image description here

0 голосов
/ 02 октября 2017

Вы можете использовать HBaseTestingUtility :

public class SomeTest {
    private HBaseTestingUtility testingUtil = new HBaseTestingUtility();

    @Before
    public void setup() throws Exception {
        testingUtil.startMiniDFSCluster(1);
    }

    @After
    public void tearDown() throws IOException {
        testingUtil.shutdownMiniDFSCluster();
    }

    @Test
    public void test() throws Exception {
        DistributedFileSystem fs = testingUtil.getDFSCluster().getFileSystem();
        final Path dstPath = new Path("/your/path/file.txt);
        final Path srcPath = new Path(SomeTest.class.getResource("file.txt").toURI());
        fs.copyFromLocalFile(srcPath, dstPath);
        ...
    }
}
0 голосов
/ 06 апреля 2017

Возможно, вы захотите взглянуть на RawLocalFileSystem.Хотя я думаю, тебе лучше просто посмеяться над этим.

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