Статьи

Apache Hadoop HDFS Data Node Apache Mesos Framework

вступление

Этот проект позволяет запускать HDFS на Mesos. Вы должны быть знакомы с основами HDFS и Mesos:

Проект требует:

  • Mesos 0.23.0+
  • JDK 1.7.x
  • Hadoop 1.2.x или 2.7.x

Мезос в Бродяге

Проект включает в себя бродячую среду , которая позволяет запускать кластер Mesos локально. Если вы собираетесь использовать внешний кластер Mesos, вы можете пропустить этот раздел.

1. Запустите бродячие узлы:

1
2
# cd hdfs-mesos/vagrant
# vagrant up

Создает главные и подчиненные узлы мезо.

2. Добавьте имена бродячих узлов в /etc/hosts

Теперь Месос в Бродяге должен быть запущен. Вы можете продолжить запуск планировщика. Для более подробной информации о vagrant окружающей среде, пожалуйста, прочитайте vagrant / README.md

Запущенный планировщик

1. Скачайте hdfs-mesos\*.jar ИЛИ hdfs-mesos\*.jar проект:

Скачать банку:

1
2
3
# mkdir hdfs-mesos
# cd hdfs-mesos
# wget https://github.com/elodina/hdfs-mesos/releases/download/0.0.1.0/hdfs-mesos-0.0.1.0.jar

ИЛИ клонировать и построить:

1
2
3
# git clone https://github.com/elodina/hdfs-mesos.git
# cd hdfs-mesos
# ./gradlew jar

2. Загрузите tarball hadoop:

1
# wget https://archive.apache.org/dist/hadoop/core/hadoop-2.7.2/hadoop-2.7.2.tar.gz

3. Запустите планировщик:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
# ./hdfs-mesos.sh scheduler --api=http://$scheduler:7000 --master=zk://$master:2181/mesos --user=vagrant
2016-03-18 15:04:48,785 [main] INFO hdfs.Scheduler - Starting Scheduler:
api: http://$scheduler:7000
files: jar:./hdfs-mesos-0.0.1.0.jar, hadoop:./hadoop-1.2.1.tar.gz
mesos: master:master:5050, user:vagrant, principal:<none>, secret:<none>
framework: name:hdfs, role:*, timeout:30d
2016-03-18 15:04:48,916 [main] INFO hdfs.HttpServer - started on port 7000
I0318 15:04:49.008314 19123 sched.cpp:164] Version: 0.25.0
I0318 15:04:49.017160 19155 sched.cpp:262] New master detected at master@192.168.3.5:5050
I0318 15:04:49.019287 19155 sched.cpp:272] No credentials provided. Attempting to register without authentication
I0318 15:04:49.029218 19155 sched.cpp:641] Framework registered with 20160310-141004-84125888-5050-10895-0006
2016-03-18 15:04:49,044 [Thread-17] INFO hdfs.Scheduler - [registered] framework:#-0006 master:#326bb pid:master@192.168.3.5:5050 hostname:master
2016-03-18 15:04:49,078 [Thread-18] INFO hdfs.Scheduler - [resourceOffers]
slave0#-O761 cpus:1.00; mem:2500.00; disk:35164.00; ports:[5000..32000]
master#-O762 cpus:1.00; mem:2500.00; disk:35164.00; ports:[5000..32000]
...
2016-03-18 15:04:49,078 [Thread-18] INFO hdfs.Scheduler - [resourceOffers]

где:

  • $scheduler — адрес планировщика, доступный из подчиненных узлов;
  • $master мастер-адрес, доступный с узла планировщика;

Планировщик должен зарегистрироваться и начать получать предложения ресурсов. Если планировщик не получает предложения, может потребоваться указать LIBPROCESS_IP:

1
# export LIBPROCESS_IP=$scheduler_ip

Теперь планировщик должен быть запущен, и вы можете приступить к запуску узлов HDFS.

Запуск HDFS кластера

Проект предоставляет CLI & REST API для управления узлами HDFS. Сначала мы сосредоточимся на CLI.

1. Добавить наменоде и датоде:

01
02
03
04
05
06
07
08
09
10
11
12
13
# ./hdfs-mesos.sh node add nn --type=namenode
node added:
  id: nn
  type: namenode
  state: idle
  resources: cpus:0.5, mem:512
 
# ./hdfs-mesos.sh node add dn0 --type=datanode
node added:
  id: dn0
  type: datanode
  state: idle
  resources: cpus:0.5, mem:512

2. Начальные узлы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
# ./hdfs-mesos.sh node start \*
nodes started:
  id: nn
  type: namenode
  state: running
  resources: cpus:0.5, mem:512
  reservation: cpus:0.5, mem:512, ports:http=5000,ipc=5001
  runtime:
    task: 383aaab9-982b-400e-aa35-463e66cdcb3b
    executor: 19065e07-a006-49a4-8f2b-636d8b1f2ad6
    slave: 241be3a2-39bc-417c-a967-82b4018a0762-S0 (master)
 
  id: dn0
  type: datanode
  state: running
  resources: cpus:0.5, mem:512
  reservation: cpus:0.5, mem:512, ports:http=5002,ipc=5003,data=5004
  runtime:
    task: 37f3bcbb-10a5-4323-96d2-aef8846aa281
    executor: 088463c9-5f2e-4d1d-8195-56427168b86f
    slave: 241be3a2-39bc-417c-a967-82b4018a0762-S0 (master)

Узлы работают и работают сейчас.

Примечание: запуск может занять некоторое время. Вы можете просматривать прогресс через Mesos UI.

3. Выполните несколько операций с ФС:

1
2
3
4
# hadoop fs -mkdir hdfs://master:5001/dir
# hadoop fs -ls hdfs://master:5001/
Found 1 items
drwxr-xr-x   - vagrant supergroup          0 2016-03-17 12:46 /dir

Примечание: в fs url используется хост namenode и порт ipc.

Использование CLI

Проект обеспечивает CLI следующей структурой:

1
2
3
4
5
6
7
# ./hdfs-mesos.sh help
Usage: <cmd> ...
 
Commands:
  help [cmd [cmd]] - print general or command-specific help
  scheduler        - start scheduler
  node             - node management

Помощь предоставляется для каждой команды и подкоманды:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# ./hdfs-mesos.sh help node
Node management commands
Usage: node <cmd>
 
Commands:
  list       - list nodes
  add        - add node
  update     - update node
  start      - start node
  stop       - stop node
  remove     - remove node
 
Run `help node <cmd>` to see details of specific command
 
# ./hdfs-mesos.sh help node add
Add node
Usage: node add <ids> [options]
 
Option (* = required)  Description
---------------------  -----------
--core-site-opts       Hadoop core-site.xml options.
--cpus <Double>        CPU amount (0.5, 1, 2).
--executor-jvm-opts    Executor JVM options.
--hadoop-jvm-opts      Hadoop JVM options.
--hdfs-site-opts       Hadoop hdfs-site.xml options.
--mem <Long>           Mem amount in Mb.
* --type               node type (name_node, data_node).
 
Generic Options
Option  Description
------  -----------
--api   REST api url (same as --api option for
          scheduler).

Все связанные с узлами команды поддерживают массовые операции с использованием выражений id узла. Примеры:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# ./hdfs-mesos.sh node add dn0..1 --type=datanode
nodes added:
  id: dn0
  type: datanode
  ...
 
  id: dn1
  type: datanode
  ...
 
# ./hdfs-mesos.sh node update dn* --cpus=1
nodes updated:
  id: dn0
  ...
  resources: cpus:1.0, mem:512
 
  id: dn1
  ...
  resources: cpus:1.0, mem:512
 
# ./hdfs-mesos.sh node start dn0,dn1
nodes started:
  id: dn0
  ...
 
  id: dn0
  ...

Примеры выражения Id:

  • nn — сопоставляет узел с идентификатором nn
  • * — соответствует любому узлу (должен быть экранирован в слэше)
  • dn* — сопоставляет узел с идентификатором, начинающимся с dn
  • dn0..2 — соответствует узлам dn0, dn1, dn2

Использование REST

Планировщик использует встроенный HTTP-сервер. Сервер выполняет две функции:

  • распространение двоичных файлов Hadoop, JRE и исполнителя;
  • обслуживание REST API, вызванного CLI;

Большинство команд CLI отображаются на вызов API REST. Примеры:

Команда CLI REST call
node add nn --type=namenode --cpus=2 /api/node/add?node=nn&type=namenode&cpus=2
node start dn* --timeout=3m- /api/node/start?node=dn*&timeout=3m
node remove dn5 /api/node/remove?node=dn5

Вызовы REST принимают простые HTTP-параметры и возвращают ответы JSON. Примеры:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# curl http://$scheduler:7000/api/node/list
[
    {
        "id": "nn",
        "type": "namenode",
        ...
    },
    {
        "id": "dn0",
        "type": "datanode",
        ...
    }
]
 
# curl http://$scheduler:7000/api/node/start?node=nn,dn0
{
    "status": "started",
    "nodes": [
        {
            "id": "nn",
            "state": "running",
            ...
        },
        {
            "id": "dn0",
            "state": "running",
            ...
        }
    ]
}

Параметры CLI преобразуют один-к-одному в параметры REST. Параметры CLI используют пунктирный стиль, а параметры REST используют случай верблюда. Пример отображений:

CLI param REST param
<id> (узел добавить | обновить |…) node
timeout (начало узла | остановка) timeout
core-site-opts (узел добавить | обновить) coreSiteOpts
executor-jvm-opts (узел добавить | обновить) executorJvmOpts

В некоторых случаях вызов API REST может вернуть ошибку. Ошибки помечаются кодом состояния, отличным от 200. Ответ об ошибке возвращается в формате JSON.

Пример:

1
2
3
4
5
# curl -v http://192.168.3.1:7000/api/node/start?node=unknown
...
HTTP/1.1 400 node not found
...
{"error":"node not found","code":400}

Для более подробной информации о REST API, пожалуйста, обратитесь к источникам.

Ссылка: Apache Hadoop Узел данных HDFS Apache Mesos Framework от нашего партнера по JCG Джо Стейна в блоге All Things Hadoop .