Загрузка данных в Hadoop с помощью spring xd

Я пытаюсь создать поток между источником HTTP и приемником HDFS. Мои springXD и HDFS установлены на разных машинах**, но я могу успешно запустить команду hadoop fs ls /.

После создания и развертывания потока, когда я публикую данные, используя:

http post --target http://{ipaddressofhdfsmachine:8020} -- data"hello"

Выдает ошибку:

не удалось отправить данные в конечную точку http http://{ipaddressofhdfsmachine:8020}

Когда я использовал localhost with port 9000, он успешно завершился, но в hdfs ничего не появилось.

Нужно ли иметь hdfs и spring на одной машине для создания потока?


person user3819405    schedule 14.07.2014    source источник


Ответы (2)


Немного сложно понять, что не так, но я попытаюсь сделать обоснованное предположение. Я не знаю, используете ли вы один узел XD или распределенный режим, изменили ли вы конфигурацию по умолчанию и как вы создали поток. Справочный документ можно найти в Spring XD.

Я использую свою установку. Я запускаю XD на своей основной ОС (localhost) и HDFS на своем vm (node1).

Поскольку по умолчанию адрес hdfs namenode считается hdfs://localhost:8020, его необходимо изменить. Для этого используйте файл servers.yml и замените fsUri (обратите внимание на пробелы в этом формате файла yaml).

config/servers.yml:

# Hadoop properties
spring:
  hadoop:
    fsUri: hdfs://node1:8020

Я запускаю один узел XD:

./xd-singlenode

Затем запускаем потоковые команды, пишем что-нибудь и проверяем, что написано:

xd:>hadoop config fs --namenode hdfs://node1:8020

xd:>hadoop fs ls --recursive true --dir /xd
lsr: `/xd': No such file or directory

xd:>stream create --name test --definition "http|hdfs" --deploy
Created and deployed new stream 'test'

xd:>http post --data "hello" http://localhost:9000
> POST (text/plain;Charset=UTF-8) http://localhost:9000 hello
> 200 OK

xd:>hadoop fs ls --recursive true --dir /xd
drwxr-xr-x   - jvalkealahti supergroup          0 2014-07-14 21:33 /xd/test
-rw-r--r--   3 jvalkealahti supergroup          0 2014-07-14 21:33 /xd/test/test-0.txt.tmp

xd:>stream destroy --name test 
Destroyed stream 'test'

xd:>hadoop fs ls --recursive true --dir /xd
drwxr-xr-x   - jvalkealahti supergroup          0 2014-07-14 21:33 /xd/test
-rw-r--r--   3 jvalkealahti supergroup          6 2014-07-14 21:33 /xd/test/test-0.txt

xd:>hadoop fs cat --path /xd/test/test-0.txt
hello
person Janne Valkealahti    schedule 14.07.2014
comment
Спасибо Янне за ответ. Я сделал то, что вы предложили, но пришел к тому же результату. Я успешно отправил данные, используя http post, но когда я сделал hadoop fs -ls recursive true --dir /xd, он дал: lsr: DEPRECATED: вместо этого используйте «ls-R». & lsr: '/ xd' нет такого файла или каталога. - person user3819405; 15.07.2014
comment
Тогда я почти уверен, что журналы для одиночного узла XD должны показывать некоторые ошибки. Если вы запустили его с одиночным узлом, то администратор/контейнер XD выполняется в том же jvm, поэтому вы увидите, что ведение журнала для администратора/контейнера — это одна и та же оболочка. - person Janne Valkealahti; 15.07.2014
comment
Я бы еще раз проверил настройку spring.hadoop.fsUri в server.yml. Формат Yaml очень чувствителен к правильному отступу и использованию пробелов, а не вкладок. В любом случае, если вы допустили ошибку или что-то еще пошло не так, журналы должны показать, не может ли приемник hdfs записать в hdfs. - person Janne Valkealahti; 15.07.2014
comment
Еще одна проблема, которую я видел, заключается в том, что по умолчанию приемник hdfs пытается записать в /xd/‹streamname›. Если у приемника нет прав на создание этого каталога, вы можете изменить его с помощью параметра конфигурации --directory. - person Janne Valkealahti; 15.07.2014
comment
Привет, Янн, я проверил журналы и обнаружил ошибку MessageDeliveryException, говорящую о том, что у Dispatcher нет подписчиков. Любые предложения по этому поводу. Я пытаюсь исправить это со своей стороны. - person user3819405; 16.07.2014

Вы должны отправлять сообщения на свой компьютер XD, а не на компьютер Hadoop HDFS.

Получатель XD HTTP получит POST и направит его в HDFS для вас.

Убедитесь, что ваш узел настроен для вашего Hadoop, и ваша оболочка тоже.

если вы используете Pivotal PHD 2.0, например:

xd-singlenode --hadoopDistro phd20

xd-shell --hadoopDistro phd20

xd:> had config fs --namenode hdfs://MyPivotalHDServer:8020

Ознакомьтесь с документацией Spring-XD на Github, чтобы узнать последние новости, и получите текущую версию Spring XD, которая постоянно улучшается. https://github.com/spring-projects/spring-xd/wiki/Sources#http

Чтобы создать определение потока на сервере с помощью оболочки XD

xd:> stream create --name httptest --definition "http | hdfs" --deploy

Отправьте некоторые данные на http-сервер через порт по умолчанию 9000.

xd:> http post --target http://localhost:9000 --data "hello world to hadoop from springxd"

Это видео на YouTube познакомит вас с примером: http://youtu.be/41sIhawjHE0?t=37m6s

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

Сначала отправьте данные в журнал, чтобы вы могли увидеть их в выходных журналах XD. Хорошо подходит для отладки.

person Tim Spann    schedule 23.07.2014
comment
убедитесь, что вы создали свой основной каталог /xd и предоставили ему соответствующие разрешения, обычно 777 для тестирования, чтобы убедиться, что все в порядке, и протестируйте его из обычной HDFS и из команд XD в HDFS. - person Tim Spann; 23.07.2014