hadoop dfs -copyFromLocal src dest - PullRequest
       8

hadoop dfs -copyFromLocal src dest

3 голосов
/ 05 января 2012

У меня вопрос: зачем нам нужно указывать dest. Файл, который я помещаю в hdfs, не обязательно лежит целиком на локальной машине, так что толку от указания dest в команде.

Когда я запускаю команду с помощью команды lie, а затем выполняю hadoop dfs -ls, я вижу, что мой файл занесен в список в hdfs, но когда я создаю файл программно, используя

FileSystem fs      = FileSystem.get(conf);
Path filenamePath  = new Path("hello.txt");
fs.create(filenamePath);

, а затем выполните hadoop dfs -ls. Я не могу найти этот файл.

В моем core-site.xml есть следующее ...

<!-- In: conf/core-site.xml -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/apurv/hadoop/hdfs</value>
  <description>A base for other temporary directories.</description>
</property>

<property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:54310</value>
  <description>The name of the default file system.  A URI whose
  scheme and authority determine the FileSystem implementation.  The
  uri's scheme determines the config property (fs.SCHEME.impl) naming
  the FileSystem implementation class.  The uri's authority is used to
  determine the host, port, etc. for a filesystem.</description>
</property>

Интуитивно понятно, что для меня не имеет смысла, где находится скопированный файл, так как он может быть достаточно большим для размещения на одной машине.

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Мы поговорили на Talk об этом, и у меня есть немного больше времени, чтобы объяснить это вам.

Если вы используете этот фрагмент в вашем коде:

FileSystem fs      = FileSystem.get(conf);
// stuff to create

тогда важно, что находится внутри conf объекта. Если вы ничего не добавляете, то FileSystem возвращается всегда локально.

Если вы добавите это в свой конф:

conf.set("fs.default.name", "hdfs://localhost:54310");

тогда вы должны быть подключены к вашей HDFS через namenode на этом "сервере", и вы сможете писать в HDFS.

Если вы хотите, чтобы конфигурация считывала XML, вам нужно использовать методы #addResource().

Посмотрите документацию здесь: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/conf/Configuration.html

Пример использования может быть:

Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/hdfs-site.xml"));

Тогда все ваши hdfs-site.xml отображения будут внутри вашей конф.

Немного поиграйте с ним, это действительно кажется интуитивным. По крайней мере для меня;)

1 голос
/ 05 января 2012

FileSystem # Create (Path) открывает поток по указанному пути. Поток должен быть закрыт до того, как файл станет видимым.

Мой вопрос таков: зачем нам нужно указывать dest. Файл, который я помещаю в hdfs, не обязательно лежит целиком на локальной машине, так что толку от указания dest в команде.

Не знаю точно, что вы имеете в виду, но пункт назначения указывает целевое местоположение.

...