R i ekosystem Hadoop... czyli integracja środowiska R z technologiami big data Marek Wiewiórka Instytut Informatyki, Politechnika Warszawska 19 lutego 2016
Plan prezentacji 1 Wstęp 2 Architektura big data Hadoop ekosystem Big data 1.0 vs 2.0 3 Sposoby integracji R i narzędzi big data Wyzwania, antywzorce i wzorce R i Hadoop streaming SparkR Inne projekty RHadoop RPresto RStudio i inne notebooki Przykładowa architektura big data i R 4 Podsumowanie Marek Wiewiórka Wstęp 2 / 38
Plan prezentacji 1 Wstęp 2 Architektura big data Hadoop ekosystem Big data 1.0 vs 2.0 3 Sposoby integracji R i narzędzi big data Wyzwania, antywzorce i wzorce R i Hadoop streaming SparkR Inne projekty RHadoop RPresto RStudio i inne notebooki Przykładowa architektura big data i R 4 Podsumowanie Marek Wiewiórka Architektura big data 3 / 38
Big data główne komponenty 1/3 Hadoop Ecosystem często główne komponenty architektury, narzędzia określa się zbiorczo mianem ekosystemu Hadoop od nazwy głównych projektów: HDFS Hadoop Distributed File System, czy Hadoop MapRedue/YARN, które są wersjonowane i wydawane wspólnie. rozproszony system plików, np. HDFS, LustreFS zapewniający redundancję danych i równoległy dostęp, rozproszone i równoległe silniki obliczeniowe, np. Hadoop MapRedue, Apache Spark, Apache Flink czy Tez odporne na awarie, wirtualizacja na różnych poziomach i wykorzystanie chmur obliczeniowych, Marek Wiewiórka Architektura big data 4 / 38
Big data główne komponenty 2/3 rozproszone bazy danych optymalizowane pod szybki odczyt losowy (np. Apache HBase, Cassandra) oraz infrastruktura analityczna (np. Apache Hive, Impala) szybka serializacja danych, np. Kryo, Avro, szybka kompresja danych, np. LZO, Snappy, niekoniecznie gzip, efektywne pod względem zajętości dyskowej i czasu dostępu formaty plików z układem kolumnowo-wierszowym (np. Parquet,ORCFile) z kompresją danych, narzędzia do szybkiego przenoszenia danych z systemów źródłowych do klastrów big data, np. Sqoop, Marek Wiewiórka Architektura big data 5 / 38
Big data główne komponenty 3/3 resource managery zarządzanie przydziałem zasobów obliczeniowych uwzględniających różne klasy zadań od bliskich czasu rzeczywistego do typowego przetwarzania wsadowego, np. Apache Mesos, Hadoop YARN, narzędzia do monitoringu klastrów obliczeniowych, np. Nagios, Ganglia, narzędzia do automatyzacji zarządzania klastrami obliczeniowymi do łatwego dodawania/usuwania węzłów, aktualizacji oprogramowania, czy rotacyjnych restartów, np. Ambari bezpieczeństwo i kontrola dostępu do składowanych danych: efektywne szyfrowanie i filtrowanie zgodnie z politykami bezpieczeństwa (Apache Ranger, Knox czy szyfrowanie w HDFS od wersji 2.6). Marek Wiewiórka Architektura big data 6 / 38
Big data architektura na przykładzie HDP 2.3 Rysunek: Źródło: http://hortonworks.com/ Marek Wiewiórka Architektura big data 7 / 38
Big data 1.0 vs 2.0 architektura optymalizowana głównie pod ciągłe przetwarzania wsadowe, a nie pod kątem analiz ad hoc i iteracyjnych algorytmów duże narzuty uruchomieniowe i nieefektywne wykorzystanie pamięci operacyjnej, nacisk na zapewnienie odporności na awarie i dużej skalowalności, niskopoziomowe interfejsy programistyczne, przekazywanie wyników pracy jobów za pośrednictwem dysków, a nie pamięci. Rysunek: Źródło: http://www.slideshare.net/hadoop_summit/spark-and-shark Marek Wiewiórka Architektura big data 8 / 38
Plan prezentacji 1 Wstęp 2 Architektura big data Hadoop ekosystem Big data 1.0 vs 2.0 3 Sposoby integracji R i narzędzi big data Wyzwania, antywzorce i wzorce R i Hadoop streaming SparkR Inne projekty RHadoop RPresto RStudio i inne notebooki Przykładowa architektura big data i R 4 Podsumowanie Marek Wiewiórka Sposoby integracji R i narzędzi big data 9 / 38
Wyzwania, antywzorce i wzorce 1/2 Don t use Hadoop - your data isn t that big 1, Hive, SparkSQL, Phoenix, Kylin, itd. posiadają interfejs SQL (różne dialekty), ale nie oznacza to, że są RDBMS, query-driven design, lokalność obliczeń oraz wykorzystanie obliczeń rozproszonych w obrębie klastra, jdbc/odbc nie służą do transferu danych, a jedynie zapytań i ich końcowych wyników, nie ma rozwiązań ogólnego przeznaczenia tyczy się to zwłaszcza technologii przechowywania danych. 1 https://www.chrisstucchio.com/blog/2013/hadoop_hatred.html Marek Wiewiórka Sposoby integracji R i narzędzi big data 10 / 38
Wyzwania, antywzorce i wzorce 2/2 R jako interfejs użytkownika i wizualizacja przy użyciu jdbc/odbc (często nadużywane do pobierania całości danych i wtedy antywzorzec!), R jako część przetwarzań wywoływany przez inne narzędzia (Hadoop streaming/apache Spark pipe()), R jako interfejs do wykonywania operacji na HDFS (RHadoop), R jako interfejs do do rozproszonych DataFrame ow (SparkR i RPresto). Marek Wiewiórka Sposoby integracji R i narzędzi big data 11 / 38
R i Hadoop streaming 1/7 interfejs programistyczny i zestaw narzędzi 2, które umożliwiają uruchamianie przetwarzań MapReduce przy wykorzystaniu innych zewnętrznych programów, mogą to być dowolne programy np. skrypty shell, standardowe narzędzia linux (sed, tr, awk, itd.) lub narzędzia napisane w Python, Perl czy R, wykorzystywane narzędzia muszą czytać ze standardowego wejścia (stdin) i zwracać wynik na standardowe wyjście (stdout) analogia do przetwarzania potokowego w linii poleceń linux, programy muszą być dostępne na wszystkich węzłach klastra Hadoop streaming może je sam dystrybuować. 2 https: //hadoop.apache.org/docs/current/hadoop-streaming/hadoopstreaming.html Marek Wiewiórka Sposoby integracji R i narzędzi big data 12 / 38
R i Hadoop streaming 2/7 Rysunek: Źródło: http://www.edureka.co/big-data-and-hadoop Marek Wiewiórka Sposoby integracji R i narzędzi big data 13 / 38
R i Hadoop streaming 3/7 można uruchamiać z linii poleceń: hadoop jar hadoop-streaming-2.7.2.jar \ -input myinputdirs \ -output myoutputdir \ -mapper /home/mw/rscripts/scriptmap.r \ -reducer /home/mw/rscripts/scriptreduce.r ale wygodniej jest np. z interfejsu Hive a i poziomu HQL : ADD FILE home/mw/rscripts/scriptmap.r; SELECT TRANSFORM(col1) USING scriptmap.r AS (col2) FROM tablex limit 10; Marek Wiewiórka Sposoby integracji R i narzędzi big data 14 / 38
R i Hadoop streaming 4/7 Przykład (nieco sztuczny i niespecjalnie big :-) ): załóżmy, że chcemy sprawdzić zgodność rozkładu pokrycia dla 1 10 6 regionów na genomie z rozkładem normalnym dla zadanej populacji próbek (kilkadziesiąt tysięcy), dane wejściowe to tabela faktów 5 10 9 rekordów w Hive, po kompresji 50GB, przesłanie danych zagregowanych wymagałoby przesłania wierszy zawierających 1 10 6 tabel o rozmiarze 3 5000, może to być oznaczać nawet kilka GB Marek Wiewiórka Sposoby integracji R i narzędzi big data 15 / 38
R i Hadoop streaming 5/7 #!/usr/bin/env Rscript f <- file("stdin") open(f) while(length(line <- readlines(f,n=1)) > 0) { intab<-unlist(strsplit(line,"\t")) tempvect <- as.numeric(unlist(strsplit(gsub(" ","",gsub("\\[","",gsub("\\]","",intab[3]) ) fixed=true) ) ) #write(tempvect,stderr()) pvalue = 0.0 stats = 0.0 result<-trycatch( { stest <- shapiro.test(tempvect) pvalue = stest$p.value stats = stest$statistic out<-c(pvalue,stats) }, error=function(err){ pvalue=-1.0 stats=-1.0 write("test failed",stderr()) out<- c(pvalue,stats) } ) write(paste(c(intab[1],intab[2],result[1],result[2]),collapse= \t ),stdout() ) } Marek Wiewiórka Sposoby integracji R i narzędzi big data 16 / 38
R i Hadoop streaming 6/7 beeline -u jdbc:hive2://zsibio001.zgm.net:10000 ADD FILE /home/hive/rscripts/rnorm_test.r; SELECT Transform(f_chr,f_ensembl_gp_id,depth_array) using rnorm_test.r AS (chr,ensembl_gp_id,p_value,test_stat) FROM ( SELECT f_chr, f_ensembl_gp_id, collect_list(f_total_depth) AS depth_array FROM dwh.fact_new_orc WHERE f_chr= chr6 GROUP BY f_chr, f_ensembl_gp_id HAVING size(collect_list(f_total_depth))> 2 AND size(collect_list(f_total_depth))<100 limit 5)sq; +-------+----------------+---------------------+--------------------+--+ chr ensembl_gp_id p_value test_stat +-------+----------------+---------------------+--------------------+--+ chr6 241317 0.169003582285344 0.853837003835197 chr6 241468 0.0943829499389926 0.960620909512074 chr6 241485 0.387228355493184 0.930666349489524 chr6 242456 0.0636154838613883 0.962672444245203 chr6 242580 0.115041979497625 0.90059311112547 +-------+----------------+---------------------+--------------------+--+ Marek Wiewiórka Sposoby integracji R i narzędzi big data 17 / 38
R i Hadoop streaming 7/7 Wnioski: można łatwo rozszerzać funkcjonalność Hive a o metody statystyczne bez konieczności pisania kodu w Javie i Scali i tworzenia własnych UDF (user-defined functions), umożliwia wykonywanie kodu R w sposób rozproszony na klastrze Hadoop, jest dodatkowy narzut na serializację i deserializację danych przy wymianie z Hive em, wymaga parse owania ciągów znakowych na wejściu i odpowiedniego formatowania wyników, przydaje się gdy kod R wykonuje się wolno i/lub dane wejściowe są naprawdę duże. Marek Wiewiórka Sposoby integracji R i narzędzi big data 18 / 38
Apache Spark krótka historia silnik analityczny rozwijany od 2009 r. w laboratorium AMPLab na Uniwersytecie Kalifornijskim w Berkley, początkowo przez Matei Zaharia, od 2010 r. udostępniony na licencji BSD, od 2013 r. wspierany przez Apache Software Foundation, początkowo w inkubatorze, a od lutego 2014 r. jako tzw. top-level project, firma Databricks przy użyciu Apache Spark ustanowiła rekord świata w tera-sort w 2014 r., ze względu na swoją wydajność, jak i dużą elastyczność zdobywa coraz większą popularność i powoli znajduje zastosowanie dziedzinach, w których dotychczas wykorzystanie narzędzi big data było niewielkie, jak np. bioinformatyka. Marek Wiewiórka Sposoby integracji R i narzędzi big data 19 / 38
Apache Spark główne cechy efektywne wykorzystanie pamięci do przechowywania wyników pośrednich przetwarzania, wydajny silnik obliczeniowy wykorzystujący DAG, rozproszone kolekcje obiektów RDD Resilient Distributed Dataset (dodatkowe interfejsy to DataFrame oraz Datasets - nowość 1.6), ponad 80 wbudowanych operatów, wsparcie dla Scali, Java i Pythona i R! spark-shell Scala REPL w rozproszonym wydaniu. Marek Wiewiórka Sposoby integracji R i narzędzi big data 20 / 38
RDD bliższe spojrzenie Marek Wiewiórka Sposoby integracji R i narzędzi big data 21 / 38
Apache Spark+ R = SparkR 1/7 zapoczątkowany jako poboczny projekt 2013/2014 w Amplab jako bardzo ograniczony interfejs do Sparkowych RDD (RRDD lub R2D2), przepisany niemalże od podstaw w 2015 ze wsparciem dla Spark DataFrame API po raz pierwszy wypuszczony w dystrybucji Sparka w czerwcu 2015, dodano w końcu wsparcie dla YARNa oraz okrojone dla Spark Mlib we wrześniu 2015. Marek Wiewiórka Sposoby integracji R i narzędzi big data 22 / 38
Apache Spark+ R = SparkR 2/7 Rysunek: Źródło: https://amplab.cs.berkeley.edu/ Marek Wiewiórka Sposoby integracji R i narzędzi big data 23 / 38
Apache Spark+ R = SparkR 3/7 if (nchar(sys.getenv("spark_home")) < 1) { Sys.setenv(SPARK_HOME = "/opt/spark-1.6.0-bin-hadoop2.6") } if (nchar(sys.getenv("hadoop_conf_dir")) < 1) { Sys.setenv(HADOOP_CONF_DIR = "/etc/hadoop/conf") } if (nchar(sys.getenv("java_home")) < 1) { Sys.setenv(JAVA_HOME = "/usr/lib/jvm/java-7-oracle/") } library(sparkr, lib.loc = c(file.path(sys.getenv("spark_home"), "R", "lib"))) #launch sparkr with 20 executors (100executors with 1 core each) sc <- sparkr.init(master = "yarn-client", sparkenvir = list(spark.executor.memory="2g",spark.executor.instances="20")) hc <- sparkrhive.init(sc) df<-sql(hc,"select * from dwh.fact_new_orc") agg<-summarize(groupby(df,df$f_chr),count=n(df$f_chr) ) head(agg,5) f_chr count 1 chr10 169300682 2 chr11 323127699 3 chr12 217532018 4 chr13 59592658 5 chr14 163960764 sparkr.stop() Marek Wiewiórka Sposoby integracji R i narzędzi big data 24 / 38
Apache Spark+ R = SparkR 4/7 Podstawowe operacje na DataFrame ach: #tworzymy Hive context i czytamy z tabeli >hc <- sparkrhive.init(sc) >df<-sql(hc,"select * from marek.fact_variant") >nrow(df) [1] 1e+06 >colnames(df) [1] "f_sample_id" "f_geo_id" "f_d_id" "f_ensembl_gp_id" [5] "f_refseq_gp_id" "f_v_id" "f_variant_name" "f_chr" [9] "f_pos" "f_ref" "f_alt" "f_alter_depth" [13] "f_total_depth" "f_genotype" > first(df) f_sample_id f_geo_id f_d_id f_ensembl_gp_id f_refseq_gp_id f_v_id 1 23625 643 0 395475 NA 338445658 f_variant_name f_chr f_pos f_ref f_alt f_alter_depth f_total_depth 1 chr1:157509025_c/t chr1 157509025 C T 19 38 f_genotype 1 0/1 > printschema(df) root -- f_sample_id: long (nullable = true) -- f_geo_id: long (nullable = true) -- f_d_id: long (nullable = true) -- f_ensembl_gp_id: long (nullable = true) -- f_refseq_gp_id: long (nullable = true) -- f_v_id: long (nullable = true) (...) Marek Wiewiórka Sposoby integracji R i narzędzi big data 25 / 38
Apache Spark+ R = SparkR 5/7 >islocal(df) [1] FALSE > dim(df) [1] 1000000 14 >dflocal<-collect(limit(df,100) ) #roznica w klasach > class(df) [1] "DataFrame" attr(,"package") [1] "SparkR" > class(dflocal) [1] "data.frame" #Spark DataFrame z R DataFrame dfdist<-createdataframe(hc,dflocal) >islocal(dfdist) [1] FALSE #zapisywanie DataFrame a na HDFS write.df(dfdist,"/user/mwiewior/testparquet","parquet","overwrite") write.df(dfdist,"/user/mwiewior/testorc","orc","overwrite") [hive@zsibio001 rscripts]$ hadoop fs -ls -R /user/mwiewior/test[op]* -rw-r--r-- 1 mwiewior mwiewior 0 2016-02-17 20:56 /user/mwiewior/testorc/_success -rw-r--r-- 1 mwiewior mwiewior 3255 2016-02-17 20:56 /user/mwiewior/testorc/part-r-00000-03fdda37-01e0- -rw-r--r-- 1 mwiewior mwiewior 0 2016-02-17 20:52 /user/mwiewior/testparquet/_success -rw-r--r-- 1 mwiewior mwiewior 1325 2016-02-17 20:52 /user/mwiewior/testparquet/_common_metadata -rw-r--r-- 1 mwiewior mwiewior 3023 2016-02-17 20:52 /user/mwiewior/testparquet/_metadata -rw-r--r-- 1 mwiewior mwiewior 5122 2016-02-17 20:52 /user/mwiewior/testparquet/part-r-00000-b8aef255-f Marek Wiewiórka Sposoby integracji R i narzędzi big data 26 / 38
Apache Spark+ R = SparkR 6/7 #transformacje sa leniwe #projekcja >samples<-select(df,df$f_sample_id) >head(samples) #selekcja i projekcja >oddsamples<-select(filter(df,"f_sample_id%2=1"),"f_sample_id","f_geo_id") f_sample_id f_geo_id 1 23625 643 2 3337 643 3 24363 356 4 3055 170 5 23113 156 6 6859 818 #aggregacje countsamples<-summarize(groupby(filter(df,"f_sample_id%2=1"),"f_geo_id"),count=n(df$f_geo_id)) >head(countsamples) f_geo_id count 1 31 471 2 231 7469 3 32 3225 4 232 215 5 233 465 6 634 124 Marek Wiewiórka Sposoby integracji R i narzędzi big data 27 / 38
Apache Spark+ R = SparkR 7/7 bindingi do biblioteki Apache Spark MLib dodane w Sparku 1.5 (wrzesień 2015) wsparcie dla podstawowych operatorów z funkcji R glm(), póki co wsparcie dla rozkładów normalnego i dwumianowego. df <- createdataframe(hc, iris) model <- glm(sepal_length ~ Sepal_Width + Species, data = df, family = "gaussian") summary(model) $devianceresiduals Min Max -1.307112 1.412532 $coefficients Estimate Std. Error t value Pr(> t ) (Intercept) 2.251393 0.3697543 6.08889 9.568102e-09 Sepal_Width 0.8035609 0.106339 7.556598 4.187317e-12 Species_versicolor 1.458743 0.1121079 13.01195 0 Species_virginica 1.946817 0.100015 19.46525 0 Marek Wiewiórka Sposoby integracji R i narzędzi big data 28 / 38
ggplot2.sparkr 3 1/2 ggplot2 jest jednym z najpopularniejszych pakietów do wizualizacji danych w R, ale nie wspiera DataFrame ow Sparka (chyba, że pobierzemy cały zbiór danych za pomocą collect lub jego podzbiór - take, sample) jest ograniczony dostępną pamięcią i nie potrafi wykorzystywać obliczeń równoległych i rozproszonych do przygotowania danych (np. histogramy, czy boxploty) ggplot2.sparkr udostępnia ten sam interfejs zarówno dla zwykłych DataFrame ów jaki i Sparkowych przy wywołaniu sprawdza i odpowiednio wykonuje obliczenia lokalnie lub na klastrze za pomocą Apache Spark. Instalacja: install.packages("devtools") devtools::install_github("papl-skku/ggplot2.sparkr") 3 https://spark-summit.org/east-2016/events/ ggplot2sparkr-rebooting-ggplot2-for-scalable-big-data-visualization/ Marek Wiewiórka Sposoby integracji R i narzędzi big data 29 / 38
ggplot2.sparkr 2/2 library(ggplot2.sparkr) pdf("/home/mw/ggplot.pdf",width=7,height=5) hc <- sparkrhive.init(sc) df<-createdataframe(hc,iris) ggplot(df, aes(species,sepal_length)) + geom_boxplot() dev.off() wspierane typy wykresów (http://papl-skku.github.io/ggplot2.sparkr/plot-types) wersja developerska: nie udało się uruchomić w RStudio i nie działa na każdym zbiorze, ale... :), Rysunek: Źródło: opracowanie własne Marek Wiewiórka Sposoby integracji R i narzędzi big data 30 / 38
rdd.pipe()... czyli Hadoop streaming w Apache Spark #!/usr/bin/env Rscript f <- file("stdin") open(f) while(length(line <- readlines(f,n=1)) > 0) { vect<-as.numeric(unlist(strsplit(line,",") ) ) write(sum(vect), stdout()) } val test = sc.parallelize((1 to 100).map(r=>Array(r,r,r) ).map(_.mkstring(",") ) ) test.pipe("/home/mwiewior/sum.r").take(3) res8: Array[String] = Array(3, 6, 9) Marek Wiewiórka Sposoby integracji R i narzędzi big data 31 / 38
RHadoop zestaw pakietów rozwijanych przez Revolution Analytics (obecnie Microsoft?) służacych do pracy z różnymi komponentami architektury Hadoop: rhdfs praca z HDFS - projekt nieaktualizowany - ostatni commit ponad 2 lata temu, rmr2 pakiet ułatwiający pisanie jobów MapReduce w R bazuje na mechanizmie Hadoop streaming (również mało aktywny projekt - ostatni commit ok. rok temu), rhbase pakiet służący do podłączania się do HBase a - aktywność jak powyżej. ravro pakiet służący do odczytu plików w formacie Avro Ogólnie projekt pomimo chwytliwej nazwy wydaje się dalej nierozwijany po przejęciu przez Microsoft... Marek Wiewiórka Sposoby integracji R i narzędzi big data 32 / 38
RPresto Presto to rozproszony silnik zapytań z interfejsem SQL rozwijany przez Facebooka 4, zoptymalizowana pod interaktywne zapytania architektura - bardzo szybki w przypadku zapytań do zdenormalizowanch tabel, możliwość łączenia danych z wielu źródeł w jednym zapytaniu (np. MySQL z Hive em), mechanizm connectorów umożliwia dodawanie nowych źródeł danych, dosyć słaby optymalizator zapytań, konieczność ręcznego strojenia (np. kolejność złączeń tabel), pakiet rpresto 5 4 https://prestodb.io/ 5 https://github.com/prestodb/rpresto Marek Wiewiórka Sposoby integracji R i narzędzi big data 33 / 38
R a Notebooki RStudio (https://www.rstudio.com/), HUE + Livy server (http://gethue.com/ spark-notebook-and-livy-rest-job-server-improvements/), rzeppelin - Zeppelin ze wsparciem dla SparkR i knitr (https://github.com/elbamos/zeppelin-with-r), SparkR shell można użyć kontenerów Dockera (np. projekt Rocker 6 ) żeby przetestować najwygodniejsze podejście. 6 https://github.com/rocker-org/rocker Marek Wiewiórka Sposoby integracji R i narzędzi big data 34 / 38
Architektura big data i R Rysunek: Źródło: opracowanie własne Marek Wiewiórka Sposoby integracji R i narzędzi big data 35 / 38
Plan prezentacji 1 Wstęp 2 Architektura big data Hadoop ekosystem Big data 1.0 vs 2.0 3 Sposoby integracji R i narzędzi big data Wyzwania, antywzorce i wzorce R i Hadoop streaming SparkR Inne projekty RHadoop RPresto RStudio i inne notebooki Przykładowa architektura big data i R 4 Podsumowanie Marek Wiewiórka Podsumowanie 36 / 38
Podsumowanie środowisko R powoli staje się (powoli:-)) składnikiem architektury big data, Hadoop streaming API (Spark rdd.pipe()) oraz SparkR wydają się póki co rozwiązaniami komplementarnymi, wizualizacja dużych zbiorów danych za pomocą ggplot2.sparkr, należy oczekiwać kolejnych rozwiązań wykorzystujących model rozproszonych DataFrame ów a la SparkR. Marek Wiewiórka Podsumowanie 37 / 38
Dziękuję za uwagę. Marek Wiewiórka http://zsibio.ii.pw.edu.pl marek.wiewiorka@gmail.com Marek Wiewiórka Podsumowanie 38 / 38
Dziękuję za uwagę. Marek Wiewiórka http://zsibio.ii.pw.edu.pl marek.wiewiorka@gmail.com Marek Wiewiórka Podsumowanie 38 / 38