В предыдущем посте я показал, как выполнить простую работу с помощью AWS Elastic MapReduce (EMR) . В этом примере мы продолжаем использовать EMR, но теперь запускаем задание Hive . Hive — это система хранения данных для Hadoop, которая упрощает обобщение данных, специальные запросы и анализ больших наборов данных, хранящихся в файловых системах, совместимых с Hadoop.
Для создания задания в EMR я все еще буду использовать CLI (написанный на Ruby), поставляемый с EMR (для установки см. Здесь ). Работа, которую я собираюсь создать, более подробно описана в «Руководстве по началу работы по анализу больших данных с помощью AWS» .
Создать кластер EMR
elastic-mapreduce-ruby$ ./elastic-mapreduce --create --name "My Job Flow" --hive-interactive --key-pair-file ../../../4synergy_palma.pem --enable-debugging --alive Created job flow j-2CC8Q43IWSQ42
Я включил отладку и, как я показал здесь, я определил каталог журналирования как параметр в моем файле credentials.json.
Во время выполнения задания и создания кластера вы можете увидеть прогресс, перечислив сведения о задании:
elastic-mapreduce-ruby$ ./elastic-mapreduce --list -j j-2CC8Q43IWSQ42 j-2CC8Q43IWSQ42 STARTING My Job Flow PENDING Setup Hadoop Debugging PENDING Setup Hive
Через несколько минут:
elastic-mapreduce-ruby$ ./elastic-mapreduce --list -j j-2CC8Q43IWSQ42 j-2CC8Q43IWSQ42 STARTING ec2-54-228-55-226.eu-west-1.compute.amazonaws.com My Job Flow PENDING Setup Hadoop Debugging PENDING Setup Hive
Мы видим, что для главного узла предоставляется общедоступный DNS, но установка все еще выполняется, поэтому мы немного подождем, пока не увидим это:
elastic-mapreduce-ruby$ ./elastic-mapreduce --list -j j-2CC8Q43IWSQ42 j-2CC8Q43IWSQ42 WAITING ec2-54-228-55-226.eu-west-1.compute.amazonaws.com My Job Flow COMPLETED Setup Hadoop Debugging COMPLETED Setup Hive
Теперь мы можем ssh [email protected] -i 4synergy_palma.pem
подключиться по ssh к главному узлу, введя следующую команду: Вам может потребоваться сделать файл pem читаемым для пользователя, с которым вы используете ssh. Вы можете сделать это, запустив chmod og-rwx ~/mykeypair.pem
Добавьте хост в список известных хостов, и мы получим следующий стартовый экран:
Linux (none) 3.2.30-49.59.amzn1.i686 #1 SMP Wed Oct 3 19:55:00 UTC 2012 i686 -------------------------------------------------------------------------------- Welcome to Amazon Elastic MapReduce running Hadoop and Debian/Squeeze. Hadoop is installed in /home/hadoop. Log files are in /mnt/var/log/hadoop. Check /mnt/var/log/hadoop/steps for diagnosing step failures. The Hadoop UI can be accessed via the following commands: JobTracker lynx http://localhost:9100/ NameNode lynx http://localhost:9101/ -------------------------------------------------------------------------------- hadoop@ip-10-48-206-175:~$
Затем мы запускаем консоль куста на этом узле, чтобы мы могли добавить библиотеку Jar во время выполнения Hives. Эта библиотека Jar используется, например, для легкого доступа к корзинам S3:
hadoop@ip-10-48-206-175:~$ hive Logging initialized using configuration in file:/home/hadoop/.versions/hive-0.8.1/conf/hive-log4j.properties Hive history file=/mnt/var/lib/hive_081/tmp/history/hive_job_log_hadoop_201305261845_2098337447.txt hive> add jar /home/hadoop/hive/lib/hive_contrib.jar; Added /home/hadoop/hive/lib/hive_contrib.jar to class path Added resource: /home/hadoop/hive/lib/hive_contrib.jar hive>
Теперь давайте создадим таблицу Hive и представим в ней файлы журнала Apache, которые находятся в корзине S3.
Выполните следующую команду в консоли Hive, чтобы создать таблицу:
hive> CREATE TABLE serde_regex( > host STRING, > identity STRING, > user STRING, > time STRING, > request STRING, > status STRING, > size STRING, > referer STRING, > agent STRING) > ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' > WITH SERDEPROPERTIES ( > "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ > \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ > \"]*|\"[^\"]*\"))?", > "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s" > ) > LOCATION 's3://elasticmapreduce/samples/pig-apache/input/'; OK Time taken: 17.146 seconds hive>
Теперь мы можем запускать запросы Hive в этой таблице. Чтобы запустить задание для подсчета всех записей в файлах журнала Apache:
hive> select count(1) from serde_regex; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks determined at compile time: 1 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer= In order to limit the maximum number of reducers: set hive.exec.reducers.max= In order to set a constant number of reducers: set mapred.reduce.tasks= Starting Job = job_201305261839_0001, Tracking URL = http://ip-10-48-206-175.eu-west-1.compute.internal:9100/jobdetails.jsp?jobid=job_201305261839_0001 Kill Command = /home/hadoop/bin/hadoop job -Dmapred.job.tracker=10.48.206.175:9001 -kill job_201305261839_0001 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 2013-05-26 19:06:46,442 Stage-1 map = 0%, reduce = 0% 2013-05-26 19:07:02,857 Stage-1 map = 16%, reduce = 0%, Cumulative CPU 4.03 sec 2013-05-26 19:07:03,871 Stage-1 map = 16%, reduce = 0%, Cumulative CPU 4.03 sec ... break .... 2013-05-26 19:07:59,677 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 11.06 sec 2013-05-26 19:08:00,709 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 11.06 sec MapReduce Total cumulative CPU time: 11 seconds 60 msec Ended Job = job_201305261839_0001 Counters: MapReduce Jobs Launched: Job 0: Map: 1 Reduce: 1 Accumulative CPU: 11.06 sec HDFS Read: 593 HDFS Write: 7 SUCCESS Total MapReduce CPU Time Spent: 11 seconds 60 msec OK 239344 Time taken: 111.722 seconds hive>
Чтобы показать все поля строки:
hive> select * from serde_regex limit 1; OK 66.249.67.3 - - [20/Jul/2009:20:12:22 -0700] "GET /gallery/main.php?g2_controller=exif.SwitchDetailMode&g2_mode=detailed&g2_return=%2Fgallery%2Fmain.php%3Fg2_itemId%3D15741&g2_returnName=photo HTTP/1.1" 302 5 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" Time taken: 2.335 seconds
После игры мы должны прекратить кластер (таким образом, затраты сведены к минимуму). Поскольку мы начали работу в «интерактивном» режиме, чтобы мы могли войти на сервер и выполнить наши «специальные» запросы, мы должны завершить его самостоятельно:
elastic-mapreduce-ruby$ ./elastic-mapreduce --terminate j-2CC8Q43IWSQ42 Terminated job flow j-2CC8Q43IWSQ42 elastic-mapreduce-ruby$ ./elastic-mapreduce --list -j j-2CC8Q43IWSQ42 j-2CC8Q43IWSQ42 SHUTTING_DOWN ec2-54-228-55-226.eu-west-1.compute.amazonaws.com My Job Flow COMPLETED Setup Hadoop Debugging COMPLETED Setup Hive elastic-mapreduce-ruby$
После завершения у нас все еще есть доступ к созданным файлам журнала в нашем определенном сегменте S3: хотя это может быть не очень полезно в этом случае, потому что мы запустили кластер в интерактивном режиме, этот параметр может быть полезен при загрузке кластера. В этом случае запросы выполняются автоматически, и кластер завершает работу после его завершения (вместе с файлами журналов). Один из способов просмотра этой регистрации — использование средства отладки EMR . Перейдите в Консоль управления и выберите сервис EMR. На начальном экране выберите поток работ, на который вы подали иск для этого примера, и нажмите кнопку «Отладка»: теперь мы видим шаги нашего предыдущего потока работ. Шаг, в котором мы заинтересованы, это интерактивные вакансии. Нажмите на ссылку Просмотр вакансий в этой строке:
Теперь мы просматриваем задания, для которых мы можем «Просмотреть задачи», нажав соответствующую ссылку. Наконец, нажмите «Просмотреть попытки» задачи уменьшения или сопоставления, и вы получите доступ к скопированным файлам журнала:
Более подробную информацию об использовании Hive с EMR смотрите здесь .