hadoop dfs -copyFromLocal src dest

Мой вопрос в том, почему нам нужно указывать 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>

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


person Apurv    schedule 04.01.2012    source источник


Ответы (2)


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

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

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 будут внутри вашего conf.

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

person Thomas Jungblut    schedule 05.01.2012

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

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

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

person Praveen Sripati    schedule 05.01.2012
comment
Спасибо, я понял это. Это работает так, потому что hdfs — независимая файловая система, которой мне не хватало. - person Apurv; 31.01.2012