1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zhzhenqin-jetty-yarn

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 02:42 d00431f

Jetty On Yarn

Разработка

В условиях, когда крупные компании повсеместно практикуют эластичное развёртывание, автор, изучив некоторые функции Mesos и Yarn, вдохновился принципами работы Yarn и создал этот проект. Его цель — запустить WebServer на Hadoop Yarn для динамического развёртывания: одна команда позволяет массово развернуть или массово закрыть развёртывание, обеспечивая динамическое управление веб-средой выполнения.

Сценарий использования: в некоторых веб-проектах с недостаточным пониманием системной нагрузки или в бизнес-среде с эффектом толпы посетителей. Например, при небольшом количестве времени наблюдается большой объём посещений, которые имеют всплесковый характер. Конечно, если рассматривать Hadoop Yarn как облачную операционную систему, можно развернуть любое веб-приложение, что позволит сократить вложения в оборудование.

Среда развёртывания

  • JDK: jdk 1.6 или jdk1.7. На jdk1.8 тестирование не проводилось.
  • Jetty: jetty-8.1.17.
  • Hadoop: 2.2.0.
  • Операционная система: Linux, Mac. В системе Mac JettyAppMaster нельзя убить Web Instance, это связано с правилами генерации PID в Linux и Mac системах.

Развёртывание

  1. Распакуйте jetty-on-yarn-0.1.0.tar.gz в любое место в системе Linux.
  2. Поместите jetty-8.1.17.zip в каталог /lib/jetty/ в HDFS.
  3. Разместите соответствующие war-файлы в любом каталоге HDFS. В примере они помещаются в каталог /lib/jetty/.

Команды, поддерживаемые Jetty-On-Yarn

Используйте jetty-on-yarn help, чтобы просмотреть список поддерживаемых команд.

Если в командной строке возникает ошибка, добавьте «-s» для вывода полного стека исключений.

Запустите или остановите Jetty-Yarn.

usage: yarn
jetty on yarn, start/shutdown app master
 -appid,--appid <arg>   App Id, JettyOnYarn ApplicationMaster ID 
 -m,--memory            ApplicationMaster Memory, default 512M // данная память WebInstance, по умолчанию 512
 -n,--appname           App Name, JettyOnYarn  // Jetty-On-Yarn регистрирует имя приложения в Yarn, по умолчанию
 -q,--queue             Hadoop Yarn Queue, default  // очередь задач Jetty-On-Yarn в Yarn, по умолчанию default
 -s                     print exception
 -shutdown,--shutdown   App Name, shutdown JettyOnYarn  // используется вместе с appid для остановки JettyAppMaster, остановка AppMaster останавливает все запущенные им Jetty Instance.
 -z,--zip               Jetty Zip Location, default /lib/jetty/jetty-{version}.zip

Для запуска Jetty-On-Yarn введите «Y», когда будет предложено ввести «./jetty-on-yarn yarn».

Эластичное развёртывание для увеличения количества экземпляров веб-выполнения.

usage: yarn-add
jetty on yarn, add jetty instance
 -appid,--appid <arg>   App Id, JettyOnYarn ApplicationMaster ID. // обязательный параметр
 -c,--core              Jetty Instance Cores, default 1
 -m,--memory            Jetty Instance Memory, default 512M
 -s                     print exception
 -wars,--wars <arg>     JavaEE War Location, HDFS direction.  // обязательный параметр
 -x,--xml               Jetty XML, default conf/jetty.xml
 -z,--zip               Jetty Zip Location, default /lib/jetty/jetty-{version}.zip

Перечислите информацию о запущенных веб-серверах на указанном приложении yarn.

usage: yarn-list  
jetty on yarn, list jetty instance
 -appid,--appid <arg>   App Id, JettyOnYarn ApplicationMaster ID 
 -s                     print exception

Остановите запущенный экземпляр Jetty-Instance (экземпляр Jetty-Instance — это работающий экземпляр Jetty WebServer, чем больше экземпляров запущено, тем выше теоретическая параллельная обработка).

usage: yarn-stop
jetty on yarn, stop jetty instance
 -a,--all                 Stop All Jetty Instance, --all
 -appid,--appid <arg>     App Id, JettyOnYarn ApplicationMaster ID
 -c,--containerid <arg>   Jetty Container Id, JettyOnYarn yarn-list
 -n,--nodeid <arg>        Jetty Instance NodeId, JettyOnYarn yarn-stop
 -s                       print exception

Конфигурация:

  1. Конфигурацию Hadoop см. в core-site.xml, hdfs-site.xml и yarn-site.xml.
  2. Jetty требует наличия файлов jetty.xml и webdefault.xml по умолчанию.
  3. jetty.yarn.properties управляет поведением JettyAppMaster.

jetty.yarn.properties

yarn.appmaster.avro.port=40880  # порт, открытый JettyAppMaster для выполнения команд клиентом
master.heartbeat.interval.millis=10000  # частота, с которой JettyAppMaster сообщает Yarn о прогрессе, сердцебиение
# уровень приоритета контейнера по умолчанию для мастера
yarn.master.container.priority=0
# видимость zip-файла Jetty
jetty.zip.visibility=PUBLIC
jetty.yarn.app.master.opts=-server  # параметры оптимизации запуска AppMaster
jetty.yarn.instance.jvm.opts=-server  # параметры оптимизации запуска экземпляра Jetty
# издатель по умолчанию — LoggerJettyPublisher, вы можете зарегистрировать информацию о запуске в ZooKeeper, Socket, базе данных и других способах
jetty.yarn.publisher.class=com.ivyft.jetty.yarn.ZookeeperJettyPublisher
jetty.yarn.zookeeper.root=/jetty
jetty.yarn.publisher.zookeeper.server=192.168.102.10:2181
jetty.yarn.publisher.zookeeper.connectionTimeout=60000
jetty.yarn.publisher.zookeeper.sessionTimeout=6000 ### О проблеме с Context Path веб-сервера

Для развёртывания одного экземпляра Web, нужен только один war-пакет. Можно развернуть большинство стандартных war-пакетов JavaEE. Например, для развёртывания одной копии достаточно выполнить команду: ./jetty-on-yarn yarn-add -appid application_1449726747657_0010 -wars /lib/jetty/hellp.war Если нет XML-файла описания контекста Jetty, то ContextPath этого веб-сервера будет автоматически сопоставлен с адресом: http://host:port/hellp.war. Это происходит потому, что Jetty автоматически разворачивает war-пакеты без XML-описания. Конечно, Jetty также поддерживает XML-описание.

JettyOnYarn в нерабочее время автоматически сканирует каталог /lib/jetty/hellp.war на наличие одноимённого XML-файла /lib/jetty/hellp.xml. Если такой файл существует, то используется его описание для развёртывания.

Например, конфигурация <SystemProperty name="hostContext" default="/solr"/> позволяет указать любой путь или "/". Также обратите внимание на /conf/webdefault.xml.

Регистрация в ZooKeeper и последующие идеи

JettyPublisher

    public void init(JettyConfiguration jettyConf);
    public void publish(String host, int port);
}```

#### ZookeeperJettyPublisher

```@Override
public void init(JettyConfiguration jettyConf) {
    String zookeeperServer = jettyConf.getString("jetty.yarn.publisher.zookeeper.server");
    LOG.info("connect to " + zookeeperServer);
    zkClient = new ZkClient(zookeeperServer,
            jettyConf.getInt("jetty.yarn.publisher.zookeeper.sessionTimeout", 6000),
            jettyConf.getInt("jetty.yarn.publisher.zookeeper.connectionTimeout", 60000));
    rootPath = jettyConf.getProperty("jetty.yarn.zookeeper.root", "/jetty");
    LOG.info("register to zookeeper path " + rootPath);
    if(!zkClient.exists(rootPath)) {
        zkClient.createPersistent(rootPath);
    }
}
@Override
public void publish(String host, int port) {
    String path = rootPath + "/" + host + ":" + port;
    LOG.info("jetty server published zookeeper at: " + path);
    zkClient.createEphemeral(path); //создание временного узла ZooKeeper, который исчезает после завершения сеанса.
}```

Каждый веб-экземпляр, запущенный на YARN, регистрирует свой серверный хост и порт в определённом месте. Существует несколько способов регистрации. Один из них — регистрация в ZooKeeper.

Чтобы запустить несколько серверов Jetty подряд, можно использовать следующую команду:
```./jetty-on-yarn yarn-add -appid application_1449726747657_0010 -wars /lib/jetty/hellp.war```
Информация о регистрации в ZooKeeper выглядит следующим образом:

```[zk: localhost:2181(CONNECTED) 2] ls /jetty
[nowledge data-n9:8080, nowledge data-n9:8082]```

Это приводит к идее создания прокси-серверов, таких как Nginx и Apache, которые поддерживают ZooKeeper. Например, Nginx:

```upstream 192.168.1.105 {
    #weight 参数表示权值,权值越高被分配到的几率越大
    server 192.168.1.105:8090 max_fails=2 fail_timeout=60s weight=2;
    server 192.168.1.105:8080 max_fails=2 fail_timeout=60s weight=1;       
}```

Nginx в настоящее время поддерживает только статические прокси, которые записываются в конфигурационный файл. Если бы он мог поддерживать динамические прокси, это значительно улучшило бы гибкость развёртывания веб-серверов.

На GitHub уже есть примеры реализации поддержки Nignx ZooKeeper, но неизвестно, насколько они полезны.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/zhzhenqin-jetty-yarn.git
git@api.gitlife.ru:oschina-mirror/zhzhenqin-jetty-yarn.git
oschina-mirror
zhzhenqin-jetty-yarn
zhzhenqin-jetty-yarn
master