Chef<\/em>) b\u0119dzie trzyma\u0107 receptury oraz role do instalacji. Poni\u017csze komendy nie wymagaj\u0105 uprawnie\u0144 super u\u017cytkownika.<\/p>\n\r\nmkdir -p \/home\/administrator\/chef-solo\r\nmkdir -p \/home\/administrator\/chef-repo\/.chef\r\nmkdir -p \/home\/administrator\/chef-repo\/cookbooks\r\nmkdir -p \/home\/administrator\/chef-repo\/roles\r\n<\/pre>\nNast\u0119pnie potrzebujemy zainstalowa\u0107 naszego Kucharza<\/em> czyli oprogramowanie Chef<\/strong> kt\u00f3re zrobi za nas 99% trudnej pracy przy konfiguracji. \nStartujemy od zaktualizowania listy dost\u0119pnych w Ubuntu<\/strong> pakiet\u00f3w (komenda apt-get update<\/em>), opieraj\u0105c si\u0119 na najnowszych dla danej dystrubucji. Potrzebujemy do tego uprawnie\u0144 superu\u017cytkownika (komenda sudo -s<\/em>).<\/p>\n\r\nsudo -s\r\napt-get update\r\n<\/pre>\nZe spraw kosmetycznych specyficznych dla Ubuntu<\/strong>, musimy wy\u0142\u0105czy\u0107 czyszczenie katalogu \/tmp po restarcie – poniewa\u017c nasz Hadoop<\/strong> sporo rzeczy b\u0119dzie tam przechowywa\u0142. Dla uproszczenia \u015brodowiska nie modyfikujemy tego zachowania, a jedynie wy\u0142\u0105czamy czyszczenie \/tmp. Edytujemy plik \/etc\/default\/rcS i dopisujemy poni\u017csz\u0105 lini\u0119:<\/p>\n\r\nTMPTIME=-1\r\n<\/pre>\nInstalacj\u0119 Chef\u2019a<\/strong> wykona za nas automatyczny skrypt, kolejny raz upraszczaj\u0105c ca\u0142y proces. Wykonujemy poni\u017csz\u0105 komend\u0119 ju\u017c z uprawnieniami administratora przyznanymi przez sudo<\/em><\/p>\n\r\ncurl -L https:\/\/www.opscode.com\/chef\/install.sh | bash\r\n<\/pre>\nW tym momencie mamy zainstalowane oprogramowanie do automatyzowania naszej instalacji.<\/p>\n
Konfiguracja Chef\u2019a<\/h3>\n Tworzymy katalog z konfiguracj\u0105 Chef\u2019a<\/strong> oraz edytujemy plik \/etc\/chef\/solo.rb przy pomocy ulubionego edytora (u mnie vi)<\/p>\n\r\nmkdir \/etc\/chef\r\nvi \/etc\/chef\/solo.rb\r\n<\/pre>\nZawarto\u015b\u0107 pliku \/etc\/chef\/solo.rb<\/strong><\/p>\n\r\nfile_cache_path "\/home\/administrator\/chef-solo"\r\nrepo = '\/home\/administrator\/chef-repo'\r\n\r\ncookbook_path repo + '\/cookbooks'\r\ndata_bag_path repo + '\/data_bags'\r\nrole_path repo + '\/roles'\r\n\r\nlog_location STDOUT\r\n<\/pre>\nPotrzebujemy jeszcze tylko skonfigurowa\u0107 automagiczny mened\u017cer receptur Knife<\/strong>, kt\u00f3ry pobierze dla nas to co b\u0119dzie dalej wymagane, czyli receptury dla apt<\/em>, yum<\/em>, java<\/em> oraz hadoop<\/em>. Przechodzimy do katalogu repozytorium Chef\u2019a<\/strong> i edytujemy plik \/home\/administrator\/chef-repo\/.chef\/knife.rb<\/p>\n\r\ncd \/home\/administrator\/chef-repo\r\nvi \/home\/administrator\/chef-repo\/.chef\/knife.rb\r\n<\/pre>\nZawarto\u015b\u0107 pliku \/home\/administrator\/chef-repo\/.chef\/knife.rb<\/strong><\/p>\n\r\ncookbook_path [ '\/root\/chef-repo\/cookbooks' ]\r\n<\/pre>\nPrzygotowanie receptur<\/h3>\n Powoli pozwalamy magii dzia\u0142a\u0107, czyli pobieramy nasze receptury dla \u015brodowiska narz\u0119dziem Knife<\/strong>, pozostaj\u0105c w katalogu \/home\/administrator\/chef-repo<\/p>\n\r\nknife cookbook site download apt\r\nknife cookbook site download yum\r\nknife cookbook site download java\r\nknife cookbook site download hadoop\r\nknife cookbook site download selinux\r\nknife cookbook site download sysctl\r\nknife cookbook site download ohai\r\nknife cookbook site download ulimit\r\n<\/pre>\nWchodzimy do katalogu z recepturami (cookbooks) aby je rozpakowa\u0107<\/p>\n
\r\ncd \/home\/administrator\/chef-repo\/cookbooks\r\nfind .. -name "*.gz" -exec tar zxvf "{}" \\;\r\n<\/pre>\nPozostaje nam przygotowa\u0107 role dla Chef\u2019a<\/strong> czyli wybra\u0107 wersje oprogramowania kt\u00f3re maj\u0105 zosta\u0107 zainstalowane – dostawc\u0119 Java<\/strong> (Oracle, OpenJDK) oraz dostawc\u0119 stacka Hadoop<\/strong>. Edytujemy kolejno pliki \/home\/administrator\/chef-repo\/roles\/java.rb oraz \/home\/administrator\/chef-repo\/roles\/hadoop.rb<\/p>\nZawarto\u015b\u0107 pliku \/home\/administrator\/chef-repo\/roles\/java.rb<\/strong><\/p>\n\r\nname "java"\r\ndescription "Install Oracle Java"\r\ndefault_attributes(\r\n "java" => {\r\n "install_flavor" => "oracle",\r\n "jdk_version" => "7",\r\n "set_etc_environment" => true,\r\n "oracle" => {\r\n "accept_oracle_download_terms" => true\r\n }\r\n }\r\n)\r\nrun_list(\r\n "recipe[ java]"\r\n)\r\n<\/pre>\nZawarto\u015b\u0107 pliku \/home\/administrator\/chef-repo\/roles\/hadoop.rb<\/strong><\/p>\n\r\nname "hadoop"\r\ndescription "set Hadoop attributes"\r\ndefault_attributes(\r\n "hadoop" => {\r\n "distribution" => "bigtop",\r\n "core_site" => {\r\n "fs.defaultFS" => "hdfs:\/\/hadoop"\r\n },\r\n "yarn_site" => {\r\n "yarn.resourcemanager.hostname" => "hadoop"\r\n }\r\n }\r\n)\r\nrun_list(\r\n "recipe[hadoop]"\r\n)\r\n<\/pre>\nGdy konfiguracja Chef\u2019a<\/strong> jest gotowa, wskazujemy kt\u00f3re role oraz receptury maj\u0105 zosta\u0107 wykonane w celu przygotowania naszego \u015brodowiska Hadoop<\/strong>. W tym celu przygotowujemy ostatni plik, niejako nasz\u0105 receptur\u0119<\/em> instalacji komponent\u00f3w. Edytujemy plik vi \/home\/administrator\/chef-repo\/hadoop.json.<\/p>\nZawarto\u015b\u0107 pliku vi \/home\/administrator\/chef-repo\/hadoop.json<\/strong><\/p>\n\r\n{\r\n "run_list": [\r\n "role[ java]",\r\n "recipe[ java]",\r\n "role[hadoop]",\r\n "recipe[hadoop::hadoop_hdfs_namenode]",\r\n "recipe[hadoop::hadoop_yarn_nodemanager]",\r\n "recipe[hadoop::hadoop_yarn_resourcemanager]",\r\n "recipe[hadoop::hadoop_hdfs_datanode]",\r\n "recipe[hadoop::hbase]",\r\n "recipe[hadoop::hive]",\r\n "recipe[hadoop::hive_metastore]",\r\n "recipe[hadoop::oozie]",\r\n "recipe[hadoop::pig]",\r\n "recipe[hadoop::zookeeper]" ]\r\n}\r\n<\/pre>\nSi\u0142a szefa kuchni<\/h3>\n Pozostaj\u0105c w katalogu \/home\/administrator\/chef-repo i posiadaj\u0105c nadal uprawnienia administratora, pozwalamy na przygotowanie naszego \u015brodowiska. Chef<\/strong> zajmie si\u0119 wszystkim od pobrania pakiet\u00f3w, przez ich konfiguracj\u0119, integracj\u0119 ze sob\u0105, utworzenie i uruchomienie niezb\u0119dnych serwis\u00f3w. MAGIC!<\/strong><\/p>\n\r\nchef-solo -c \/etc\/chef\/solo.rb -j hadoop.json\r\n<\/pre>\nNale\u017cy teraz zainicjalizowa\u0107 naszego Hadoop NameNode<\/strong><\/p>\n\r\nsu -l hdfs\r\nhadoop namenode -format\r\nexit\r\n<\/pre>\nUruchamiamy NameNode<\/strong> oraz DataNode<\/strong><\/p>\n\r\nservice hadoop-hdfs-namenode start\r\nservice hadoop-hdfs-datanode start\r\n<\/pre>\nFormatujemy HDFS<\/strong> i przygotowujemy katalogi dla us\u0142ug<\/p>\n\r\n\/usr\/lib\/hadoop\/libexec\/init-hdfs.sh\r\n<\/pre>\nUruchamiamy Hive Metastore<\/strong><\/p>\n\r\nservice hive-metastore start\r\n<\/pre>\nJe\u017celi nie pomylili\u015bmy si\u0119 i wszystkie komendy i wklejki zosta\u0142y wykonane poprawnie, po kilku minutach otrzymujemy w pe\u0142ni skonfigurowane \u015brodowisko z dost\u0119pnymi Hadoop<\/strong>, Hive<\/strong>, Pig<\/strong>, YARN<\/strong>, Oozie<\/strong> i Zookeeper<\/strong>.<\/p>\nTesty<\/h3>\n Na potrzeby test\u00f3w wykorzystam przyk\u0142ad z HDP<\/strong> polegaj\u0105cy na pobraniu archiw\u00f3w meczy baseball\u2019owych, wrzuceniu ich na HDFS<\/strong>, import do Hive<\/strong> i wykorzystanie MapReduce<\/strong> do wykonania kilku Select\u2019\u00f3w<\/strong>.<\/p>\nZ uprawnieniami superu\u017cytkownika doinstalowujemy unzip<\/em> i tworzymy katalog dla danych \/home\/administrator\/data nast\u0119pnie przechodz\u0105c do niego.<\/p>\n\r\napt-get install unzip\r\nmkdir \/home\/administrator\/data\r\ncd \/home\/administrator\/data\r\n<\/pre>\nPobieramy plik z danymi i rozpakowujemy go<\/p>\n
\r\nwget http:\/\/seanlahman.com\/files\/database\/lahman591-csv.zip\r\nunzip lahman591-csv.zip\r\n<\/pre>\nUmieszczamy kopi\u0119 pliku na HDFS<\/strong>, tak aby w\u0119z\u0142y (w naszym przypadku jeden) mia\u0142y dost\u0119p do tych danych, jednocze\u015bnie udost\u0119pniaj\u0105c je dla us\u0142ug np Hive<\/strong>.<\/p>\n\r\nhdfs dfs -copyFromLocal Batting.csv \/user\/root\/\r\n<\/pre>\nUruchamiamy Hive<\/strong>, kt\u00f3ry pozwoli na potraktowanie danych CSV<\/strong> prostymi zapytaniami SQL<\/strong> wykorzystuj\u0105c mechanizmy Hadoop<\/strong> i MapReduce<\/strong>. Je\u017celi wszystko jest dobrze skonfigurowane, powinni\u015bmy zosta\u0107 przywitani promptem Hive<\/strong> czyli hive><\/em>.<\/p>\n\r\nroot@hadoop:~\/data# hive\r\nLogging initialized using configuration in jar:file:\/usr\/lib\/hive\/lib\/hive-common-0.13.0.jar!\/hive-log4j.properties\r\nhive>\r\n<\/pre>\nKolejne komendy wpisujemy w prompcie Hive<\/strong>. Tworzymy tabel\u0119 tymczasow\u0105 temp_batting<\/em> do kt\u00f3rej przypisujemy nasz plik z HDFS<\/strong> \/user\/root\/Batting.csv. Na jego podstawie utworzymy docelow\u0105 tabel\u0119 z danymi batting<\/em> kt\u00f3re zostan\u0105 wyodr\u0119bnione przy pomocy Regexp\u2019\u00f3w. Nie przejmuj si\u0119 komunikatami Warning<\/em> – m\u00f3wi\u0105 one o tym \u017ce dzia\u0142amy na pojedynczym w\u0119\u017ale i pewne zmienne dotycz\u0105ce podzia\u0142u zada\u0144 pomi\u0119dzy wi\u0119ksz\u0105 ilo\u015b\u0107 w\u0119z\u0142\u00f3w poprostu nie s\u0105 skonfigurowane, w naszych przyk\u0142adach nie jest to \u017cadnym problemem.<\/p>\n\r\nCREATE TABLE temp_batting (col_value STRING);\r\n\r\nLOAD DATA INPATH '\/user\/root\/Batting.csv' OVERWRITE INTO TABLE temp_batting;\r\n\r\nCREATE TABLE batting (player_id STRING, year INT, runs INT);\r\n\r\nINSERT OVERWRITE TABLE batting \r\nSELECT \r\n regexp_extract(col_value, '^(?:([^,]*)\\,?){1}', 1) player_id, \r\n regexp_extract(col_value, '^(?:([^,]*)\\,?){2}', 1) year, \r\n regexp_extract(col_value, '^(?:([^,]*)\\,?){9}', 1) run \r\nFROM temp_batting;\r\n<\/pre>\nEfekt powy\u017cszych komend powinien wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n
\r\nhive> CREATE TABLE temp_batting (col_value STRING);\r\nOK\r\nTime taken: 0.215 seconds\r\n\r\nhive> LOAD DATA INPATH '\/user\/root\/Batting.csv' OVERWRITE INTO TABLE temp_batting;\r\nLoading data to table default.temp_batting\r\nTable default.temp_batting stats: [numFiles=1, numRows=0, totalSize=6398990, rawDataSize=0]\r\nOK\r\nTime taken: 1.017 seconds\r\n\r\nhive> INSERT OVERWRITE TABLE batting\r\n > SELECT\r\n > regexp_extract(col_value, '^(?:([^,]*)\\,?){1}', 1) player_id,\r\n > regexp_extract(col_value, '^(?:([^,]*)\\,?){2}', 1) year,\r\n > regexp_extract(col_value, '^(?:([^,]*)\\,?){9}', 1) run\r\n > FROM temp_batting;\r\nTotal jobs = 3\r\nLaunching Job 1 out of 3\r\nNumber of reduce tasks is set to 0 since theres no reduce operator\r\nExecution log at: \/tmp\/root\/root_20150219105353_aa0aabfe-3589-48d7-a047-6b0987fe20c3.log\r\nJob running in-process (local Hadoop)\r\nHadoop job information for null: number of mappers: 0; number of reducers: 0\r\n2015-02-19 10:53:04,269 null map = 0%, reduce = 0%\r\n2015-02-19 10:53:05,287 null map = 100%, reduce = 0%\r\nEnded Job = job_local592960733_0001\r\nExecution completed successfully\r\nMapredLocal task succeeded\r\nStage-4 is selected by condition resolver.\r\nStage-3 is filtered out by condition resolver.\r\nStage-5 is filtered out by condition resolver.\r\nMoving data to: hdfs:\/\/hadoop\/tmp\/hive-root\/hive_2015-02-19_10-53-00_203_7795567368711574116-1\/-ext-10000\r\nLoading data to table default.batting\r\nrmr: DEPRECATED: Please use 'rm -r' instead.\r\nDeleted hdfs:\/\/hadoop\/user\/hive\/warehouse\/batting\r\nTable default.batting stats: [numFiles=1, numRows=95196, totalSize=1653324, rawDataSize=1558128]\r\nOK\r\nTime taken: 5.89 seconds\r\n<\/pre>\nTak przygotowane tabele zawieraj\u0105 ju\u017c dane kt\u00f3re mog\u0105 nas zainteresowa\u0107. Mo\u017cemy teraz wyszukiwa\u0107 zapytaniami SQL<\/strong> szczeg\u00f3\u0142owe informacje.<\/p>\n\r\nhive> SELECT year, max(runs) FROM batting GROUP BY year;\r\nTotal jobs = 1\r\nLaunching Job 1 out of 1\r\nNumber of reduce tasks not specified. Estimated from input data size: 1\r\nExecution log at: \/tmp\/root\/root_20150219105454_01e4848f-b71c-4e12-88c3-ed4e9360ace6.log\r\nJob running in-process (local Hadoop)\r\nHadoop job information for null: number of mappers: 0; number of reducers: 0\r\n2015-02-19 10:54:09,113 null map = 100%, reduce = 100%\r\nEnded Job = job_local2006606267_0001\r\nExecution completed successfully\r\nMapredLocal task succeeded\r\nOK\r\nNULL NULL\r\n1871 66\r\n1872 94\r\n...\r\n2010 115\r\n2011 136\r\nTime taken: 4.689 seconds, Fetched: 142 row(s)\r\n<\/pre>\n\r\nhive> SELECT a.year, a.player_id, a.runs from batting a\r\n > JOIN (SELECT year, max(runs) runs FROM batting GROUP BY year ) b\r\n > ON (a.year = b.year AND a.runs = b.runs) ;\r\nTotal jobs = 2\r\nLaunching Job 1 out of 2\r\nNumber of reduce tasks not specified. Estimated from input data size: 1\r\nExecution log at: \/tmp\/root\/root_20150219105555_a44780bc-4cbc-4d07-b65e-775f58325789.log\r\nJob running in-process (local Hadoop)\r\nHadoop job information for null: number of mappers: 0; number of reducers: 0\r\n2015-02-19 10:55:41,842 null map = 100%, reduce = 100%\r\nEnded Job = job_local1016279659_0001\r\nExecution completed successfully\r\nMapredLocal task succeeded\r\nExecution log at: \/tmp\/root\/root_20150219105555_a44780bc-4cbc-4d07-b65e-775f58325789.log\r\n2015-02-19 10:55:44 Starting to launch local task to process map join; maximum memory = 932184064\r\n2015-02-19 10:55:45 Dump the side-table into file: file:\/tmp\/root\/hive_2015-02-19_10-55-37_776_592556185375942408-1\/-local-10004\/HashTable-Stage-4\/MapJoin-mapfile00--.hashtable\r\n2015-02-19 10:55:45 Uploaded 1 File to: file:\/tmp\/root\/hive_2015-02-19_10-55-37_776_592556185375942408-1\/-local-10004\/HashTable-Stage-4\/MapJoin-mapfile00--.hashtable (2033677 bytes)\r\n2015-02-19 10:55:45 End of local task; Time Taken: 0.93 sec.\r\nExecution completed successfully\r\nMapredLocal task succeeded\r\nLaunching Job 2 out of 2\r\nNumber of reduce tasks is set to 0 since there's no reduce operator\r\nExecution log at: \/tmp\/root\/root_20150219105555_a44780bc-4cbc-4d07-b65e-775f58325789.log\r\nJob running in-process (local Hadoop)\r\nHadoop job information for null: number of mappers: 0; number of reducers: 0\r\n2015-02-19 10:55:50,002 null map = 100%, reduce = 0%\r\nEnded Job = job_local1075503958_0001\r\nExecution completed successfully\r\nMapredLocal task succeeded\r\nOK\r\n1871 barnero01 66\r\n1872 eggleda01 94\r\n...\r\n2010 pujolal01 115\r\n2011 grandcu01 136\r\nTime taken: 12.746 seconds, Fetched: 151 row(s)\r\n<\/pre>\nProste prawda? Pomy\u015bl teraz jak wiele r\u00f3\u017cnych danych m\u00f3g\u0142by\u015b w ten spos\u00f3b przetwarza\u0107. Jest to tylko bardzo ma\u0142y wycinek tego co mo\u017cemy uzyska\u0107 dzi\u0119ki zestawom aplikacji Hadoop<\/strong>. Zach\u0119cam do wrzucenia swoich zestaw\u00f3w danych i eksperymentowania.<\/p>\n","protected":false},"excerpt":{"rendered":"Przedstawi\u0119 Wam dzisiaj jak mo\u017ce wygl\u0105da\u0107 ekspresowa instalacja\u00a0Hadoop na potrzeby rozpoznania\/test\u00f3w\/zabawy. Wykorzystam do tego oprogramowanie do automatyzacji proces\u00f3w administracyjnych Chef.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[11,22,15,20,21,23],"class_list":["post-106","post","type-post","status-publish","format-standard","hentry","category-bigdata","tag-bigdata","tag-chef","tag-hadoop","tag-hive","tag-pig","tag-ubuntu"],"yoast_head":"\n
Ekspresowa instalacja Hadoop + Hive + Pig - Flexray<\/title>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n