Hadoop Tutorial 2013.2 정재화 Copyright 2013 그루터. All Rights Reserved. 이문서는 그루터의지적자산이므로 그루터의승인없이이문서를임의로배포하거나다른용도로임의변경하여사용할수없습니다.
ABOUT ME 현 ) 그루터책임개발자 (http://www.gruter.com ) 전 ) 큐릭스, NHN, 엔씨소프트 E-mail: jhjung@gruter.com Homepage: http://blrunner.com Twitter: @blrunner78 저서 : 시작하세요! 하둡프로그래밍 : 기초부터실무까지하둡의모든것 (2012.10 출간 ) 2
목차 1. Hadoop 2. HDFS 3. MapReduce 4. Hive 5. Demo 3
1. Hadoop 4
1.1 하둡개요 하둡은대용량데이터를분산처리할수있는자바기반의오픈소스프레임워크이다. 1 Distributed File System 분산 / 병렬처리에적합한구조로파일저장 2 Distributed/Parallel Computing framework Map&Reduce 기반의컴퓨팅플랫폼제공 3 Open Source Project http://hadoop.apache.org Java 기반 4,000 node 이상단일클러스터구성가능 5
1.2 하둡히스토리 Feb 2003 First MapReduce library by Google Dec 2004 Google GFS file system paper Feb 2006 Hadoop becomes Apache Lucene project Apr 2007 Yahoo! runs Hadoop on 1000-node cluster Feb 2008 Yahoo! generate production search index with Hadoop July 2008 Hadoop Wins Terabyte Sort Benchmark sorted 1 terabyte of data in 209 seconds July 2009 Hadoop is getting bigger Hadoop Common, MapReduce, Hadoop Distributed File System(HDFS) Dec 2011 Release 1.0.0 May 2012 Release 2.0.0 alpha 6
1.3 하둡에코시스템 프로젝트 Avro Cassandra Chukwa Hama HBase Hive Impala Mahout Oozie Pig ZooKeeper 설명 멀티플랫폼간데이터호환 Serialization 도구 DHT 기반의분산데이터관리시스템. Hadoop 은사용하지않고로컬디스크이용 분산환경에서로그를수집하기위한시스템, 저장소로 HDFS 를이용하고로그분석을위해 MapReduce 이용 Map/Reduce 방식이아닌 BSP(Bulk Synchronous Parallel) 방식의컴퓨팅플랫폼 HDFS 에데이터파일을저장하는분산데이터관리시스템 SQL 과비슷한스크립트질의를이용해 HDFS 에저장된데이터를 MapReduce 로분석하는도구 Hive 질의문법을지원하는준실시간질의실행플랫폼 Hadoop 기반 Machine library Hadoop Workflow 엔진 Hive 와유사하게스크립트질의를이용해 HDFS 에저장된데이터를맵리듀스로분석하는도구단순스크립트가아닌반복문, 제어문, 변수등사용가능 분산환경을관리하는분산코디네이터 7
2. HDFS 8
2.1 대용량파일시스템 파일시스템 DAS (Direct-attached storage) NAS (Network-attached storage) SAN (storage area network) 특징 - 서버에직접연결된스토리지 (storage) - 여러개의하드디스크를장착할수있는외장케이스를이용하는방식 - 일종의파일서버 - 별도의운영체제를사용하며, 파일시스템을안정적으로공유할수있음. - 주로첨부파일이나이미지같은데이터를저장하는데많이사용 - 수십에서수백대의 SAN 스토리지를데이터서버에연결해총괄적으로관리해주는네트워크를의미함 - DAS 의단점을극복하기위해개발됐으며, 현재 SAN 기법이시장의절반이상을차지 - DBMS 와같이안정적이고빠른접근이필요한데이터를저장하는데사용 9
2.2 GFS (Google File System) 개요 1 Google 에서개발된파일시스템으로 Google 의많은서비스에서사용 2 소프트웨어는공개하지않고논문만공개 http://www.cs.rochester.edu/meetings/sosp2003/papers/p125-ghemawat.pdf 3 다음과같은설계원칙 저가형서버로구성된환경으로서버의고장이빈번히발생할수있다고가정 대부분의파일은대용량파일로가정 작업부하는연속적으로많은데이터를읽는연산이거나임의의영역에서적은데이터를읽는연산 파일에대한쓰기연산은주로순차적으로데이터를추가하는연산, 파일에대한수정은드물게발생 여러클라이언트에서동시에동일한파일에데이터를추가하는환경에서동기화오버헤드를최소화할수있는방법필요 낮은응답지연시간보다높은처리율이좀더중요 10
2.3 HDFS(Hadoop Distributed File System) 개요 1 2 3 4 Very Large Scale Distributed File System 10K nodes, 100 million files, 10 PB Use Commodity Hardware self-healing: failover, recovery, backup 서버장애를일반적인상황이라고가정 Optimized for batch processing 주로저장후읽기위주의데이터저장 1 file = n개의 64MB size block으로 split 각 block은서로다른 node에분산저장 POSIX 표준 API는지원하지않음 자체 API 지원 (Java, C) File lock, Random write 미지원 append는제한된기능으로제공 일반적인응용애플리케이션 (DB 등 ) 의저장소로활용불가 11
2.4 HDFS 시스템구성 Secondary NameNode NameNode 의메모리에로딩 File Namespace Client Request Meta Operation NameNode /foo/bar 블록1 File Read/Write Server Status Block Management File Block 복제 DataNode #1 DataNode #2 DataNode #3 DataNode #4 DataNode #5 랙 (rack)1 랙 (rack)2 12
2.5 HDFS 컴포넌트 1 NameNode 파일시스템의 inode namespace 관리 ( 메모리 ) DataNode 클러스터멤버쉽관리및장애시장애복구 File Block에대한복제수, 볼륨밸런싱등에대한제어 2 Secondary NameNode NameNode 의 namespace 정보를주기적 (1 시간 ) 으로 rolling 하여다시 NameNode 로전달하는기능 3 DataNode 실제 File Block 을저장 File Block 은운영체제 (Linux) 의파일시스템내에하나의파일로저장 4 Client Library 파일연산을위한 API 제공 파일저장시 NameNode, DataNode 와연동 13
2.6 블록기반구조 320MB 파일 블록1 블록2 블록3 블록4 블록5 파일저장 HDFS 블록 1 블록 2 블록 1 블록 3 블록 3 블록 3 블록 4 블록 4 블록 5 블록 2 블록 4 블록 5 블록 1 블록 2 블록 5
2.7 파일저장과정 Application HDFS Client 7. 추가블록요청 4. 데이터전송 1. /foo/bar 생성 3. 데이터노드목록 NameNode Host 2. /foo/bar lock NameNode 8. 네임스페이스등록 edits file Secondary NameNode /foo/bar fsimage file 9. fsimage 병합 ( 주기 ) namespace DataNode DataNode DataNode 5. 데이터 6. 데이터 복제 복제 File Block File Block File Block
2.8 파일조회과정 Application HDFS Client 1. /foo/bar open 3. 데이터노드목록 NameNode Host NameNode 2. 네임스페이스조회 /foo/bar namespace 4. 전송받은목록중임의의서버로부터파일요청 5. 데이터전송 6. 서버장애시자동으로 HDFS Client 가다른서버의 Block read DataNode DataNode DataNode File Block File Block File Block
2.9 HDFS 특징 1 2 3 4 5 6 7 하나의파일을여러개의 block으로분리하여분산저장별도의외부스토리지가아닌 x86 장비내부의로컬디스크이용특정서버장애발생시자동감지및복구서버추가 / 제거시별도의작업불필요저장가능한파일수한계 NameNode가 SPOF(Single Point Of Failure) 범용스토리지로사용하기는기능적제약이있음
3. MapReduce 18
3.1 대용량데이터처리의어려움 1 2 3 1대장비에서의자원의제약 CPU 갯수, 메모리용량 Scale Up 방식의확장은비용증가및최대확장가능자원제약데이터읽기속도 디스크읽기속도가 100MB/sec 라고가정하면 1TB = 10,485 sec = 7일소요성능을높이기위해서는분산처리가필수 프로그램복잡도증가 컴퓨팅도중일부장비, 네트워크장애발생가능성이높아짐 대부분의분산컴퓨팅플랫폼은컴퓨팅만분산
3.2 MapReduce 개념 map (k1,v1) list(k2,v2) reduce (k2, list (v2)) list(v2) 분리 입력데이터 This is a book. That book is on the desk. I like that book. This is a book. That book is on the desk. I like that book. map() (I,1) (like, 1) (that, 1) (book, 1) map() (This,1) (is, 1) (a, 1) (book, 1) (That, 1) (book, 1) Partition Merge sort 결과데이터 (book, 3) (is, 2) (This,1) (book, [1,1,1]) (is, [1,1]) (This,[1]) reduce() MapReduce Platform
3.3 Google MapReduce 1 MapReduce 개념을대규모분산환경에구현 2 논문으로만외부에공개 2004년 http://research.google.com/archive/mapreduce.html
3.4 Hadoop MapReduce 1 2 3 4 5 MapReduce 를쉽게구현, 실행할수있는프레임워크 MapReduce 관련라이브러리 MapReduce 프로그램실행환경제공 HDFS 와연동 입력 / 출력데이터파일저장소로사용 작업수행시데이터파일을네트워크를거쳐읽는것이아니라입력블록이있는서버에서수행되도록스케줄링 프로그램수행에필요한설정파일, 사용자프로그램등의저장소로활용 스케줄러 기본은 FIFO, 추가로 Fair, Capacity 스케줄러제공 작업실행도중특정태스크에장애또는서버에장애발생시다른서버로재할당 작업단위 Job: 사용자가실행시키는작업 Task: 하나의작업은 n 개의 Task(Map or Reduce) 로분리되어각노드에서분산되어실행 다양한실행 / 프로그램옵션제공 MapReduce 프로그램은기본은자바로개발해야하지만다양한프로그램언어로구현가능 인터페이스기반으로다양한사용자정의기능구현가능
3.5 Hadoop MapReduce 아키텍처 User Application runjob Hadoop Library Store job info heartbeat TaskTracker #1 fork JobTracker TaskTracker #2 fork Read job info Download Job file job.split job.xml job.jar Hadoop file system Read job info Task Task Task Task User defined Map/Reduce Task
3.6 MapReduce 시스템콤포넌트 1 2 3 JobTracker 작업을관리하는마스터서버 주로 NameNode와동일한서버사용 사용자의작업은 JobTracker로요청됨 작업에대한스케줄링관리 Single Point Of Failure TaskTracker Task가수행하는서버 주로 DataNode와동일한서버사용 하나의 TaskTracker 서버에는동시에 N 개의 Task 수행가능 ClientAPI Hadoop의 MapReduce 프로그램모델및프레임워크 클러스터상황에대한간단한 API
3.7 데이터흐름 하나의 Map Task Process 하나의 Reduce Task Process Map1 파일 1-1 파일 1-2 파일 1-1 파일 2-1 Block-1 Block-2 Block-3 Block-4 Block-5 Hadoop File Map2 Map3 Map4 Map5 파일 2-1 파일 2-2 파일 3-1 파일 3-2 파일 4-1 파일 4-2 파일 5-1 파일 5-2 network (http) 파일 3-1 파일 4-1 파일 5-1 파일 1-1 파일 2-1 파일 3-1 파일 4-1 파일 5-1 Reduce1 Reduce2 결과파일 1 결과파일 2 Partitioner Local temp file map result file Merge&Sort
4. Hive 26
4.1 Hive 개요 배경 Facebook 이만들기시작했으며현재 Top level ASF project Facebook 은 2008 년 0.2T(per day) 에서 2010 년 12+TB(per day) 으로데이터가폭발적으로증가 Hive 질의를수행하는 cron job 으로 Oracle DB 에저장 Python code 로 ETL 처리 MapReduce MapReduce 프로그램의어려움 Pig/Cascading Metadata 관리문제 (Hcatalog 는 2012년 incubator) 27
4.1 Hive 개요 Hadoop 기반의 Data warehouse system Hive 는데이터를구조화하고복잡한 MR 프로그램을 HQL 을사용하여쉽게분석할수있다. SQL-Like Query Language HDFS 를스토리지로사용 MapReduce 사용으로분산처리 RDB 를이용한 Metadata 관리 확장성 (format, function, scripts..) Hive 는 Hadoop 기반에서 MapReduce 를실행하기때문에 batch 성데이터를처리하기에적합 작고간단한테이블조회시에도많은단계를거치기때문에온라인트랜잭션작업이나 row 단위업데이트는불가능. 28
4.2 Hive 컴포넌트 1 2 3 4 5 Driver: session, fetch, execute Compiler: parse, plan, optimize Metastore: schema, location in HDFS, serializers and deserializers Execution engine: Compiler 에서생성된 plan 을실행하며, stages 간의 dependency 관리 관리도구 Interactive console, hadoop streaming 형태로실행됨 간단한 WEB UI 제공 29
4.3 Hive 아키텍처 CLI WEB UI Thrift API JDBC/ODBC DDL, Queries Metadata Thrift API MetaStore Database (Derby, Mysql..) Driver Session (Compiler) Parser Planner Optimizer Execution Engine Execute Jobs Result Hadoop Source Data Intermediate Result Data SerDe InputFormat OutputForamt Result library Data jars 30
4.4 데이터모델 : 테이블 1 2 3 4 Location 테이블을만들면 DFS 의 /user/hive/warehouse/{db}/{tablename} 으로 directory 가생성된다. e.g) CREATE TABLE invites (foo INT, bar STRING); External Table : 다른위치에있는 data 로생성가능, drop 시지워지지않는다. e.g) CREATE EXTERNAL TABLE invites (foo INT, bar STRING) location /tmp/hive/data' Delimiter Column 과 row 를구분하기위해사용한다. 그러나 row 는 hadoop 이결정하여변경할수없다. Data Types Primitive, complex 등을지원한다. https://cwiki.apache.org/confluence/display/hive/languagemanual+types File format: SEQUENCEFILE, TEXTFILE, RCFILE, INPUTFORMAT/OUTPUTFORMAT 31
4.5 HiveQL: 데이터로드 1 Loading files into tables LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2...)] e.g) CREATE TABLE invites (foo INT, bar STRING); e.g) LOAD DATA LOCAL INPATH 'examples/files/kv1.txt' OVERWRITE INTO TAB LE invites; 2 Inserting data into Hive Tables from queries(multiple inserts) INSERT OVERWRITE INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2...) [IF NOT EXISTS]] select_statement1 FROM from_statement; e.g) CREATE TABLE invites1 like invites; e.g) INSERT OVERWRITE TABLE invites1 select * from invites; 3 Writing data into filesystem from queries(multiple inserts) INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT... FROM... 32
4.6 HiveQL: 데이터조회 1 2 3 4 5 6 7 Select Syntax e.g) SELECT * FROM t1 WHERE Clause e.g) SELECT * FROM sales WHERE amount > 10 AND region = "US DISTINCT Clauses e.g) SELECT DISTINCT col1 FROM t1 Partition Based Queries HAVING Clause e.g) SELECT col1 FROM t1 GROUP BY col1 HAVING SUM(col2) > 10 LIMIT Clause e.g) SET mapred.reduce.tasks = 1 e.g) SELECT * FROM sales SORT BY amount DESC LIMIT 5 //Top 5 REGEX Column Specification e.g) SELECT `(ds hr)?+.+` FROM sales c.f) https://cwiki.apache.org/confluence/display/hive/languagemanual 33
5. Demo 34
5.1 Hadoop 실행모드 모드 내용 Standalone - 하둡의기본실행모드. - 하둡환경설정파일에아무런설정을하지않고, 실행을하게되면로컬장비에서만실행되기때문에로컬모드라고도함 - 하둡에서제공하는데몬을구동하지않기때문에분산된환경을고려한테스트는불가능. - 단순하게맵리듀스프로그램을개발하고, 해당맵리듀스를디버깅하는용도에만적합한모드. Pseudo-distributed Fully distributed - 가상분산모드 - 하나의장비에모든하둡환경설정을하고, 하둡서비스도이장비에서만제공하는방식 - HDFS 와맵리듀스와관련된데몬을하나의장비에서만실행함 - 하둡스터디및개발테스트용도에적합 - 완전분산모드 - 여러대의장비에하둡이설치된경우
5.1 Hadoop 실행모드 호스트 server01 server02 server03 server04 설치데몬 NameNode, JobTracker Secondary NameNode, DataNode, TaskTracker DataNode, TaskTracker DataNode, TaskTracker
5.2 설치환경구성 1 리눅스서버준비 윈도우계열의경우 VirtualBox, VMWare 와같은가상호스트에리눅스를설치할것 2 호스트설정 /etc/hosts 에하둡설치대상호스트등록 e.g) 192.168.56.101 server01 3 JDK 설치 다운로드 : http://www.oracle.com/technetwork/java/javase/downloads/jdk6u38- downloads-1877406.html su - root cd ${download_dir} chmod 755 jdk-6u38-linux-i586-rpm.bin./jdk-6u38-linux-i586-rpm.bin /etc/profile 에 JAVA_HOME 추가 export JAVA_HOME=JDK 설치경로 export PATH=$PATH:$JAVA_HOME/bin source /etc/profile
5.2 설치환경구성 4 5 사용자생성 su root adduser hadoop passwd hadoop ssh 키생성및복사 su hadoop ssh-keygen t rsa ssh-copy-id i ~/.ssh/id_rsa.pub 데이터노드호스트명 ssh-copy-id i ~/.ssh/id_rsa.pub 보조네임노드호스트명 모든 Slave 서버로복사할것
5.3 설치파일다운로드 stable 버전으로다운로드 (2013 년 2 월현재 stable 버전은 1.0.4 버전임 )
5.4 Hadoop 설치 1 2 3 4 5 하둡설치파일을 /home/hadoop에업로드압축해제 su - hadoop cd /home/hadoop tar xzf hadoop-1.0.4.tar.gz 디렉터리생성 namespace 저장디렉토리 (namenode) mkdir /home/hadoop/filesystem data 디렉토리 (datanode) mkdir /home/hadoop/data conf/hadoop-env.sh export HADOOP_HEAPSIZE=256 export HADOOP_PID_DIR=/home/hadoop/pids conf/core-site.xml <configuration> <property> <name>fs.default.name</name> <value>hdfs://server01:9000</value> </property> </configuration>
5.4 Hadoop 설치 6 conf/hdfs-site.xml <property> <name>dfs.name.dir</name> <value>/home/hadoop/filesystem</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.http.address</name> <value>server01:50070</value> </property> <property> <name>dfs.secondary.http.address</name> <value>server02:50090</value> </property> <property> <name>dfs.data.dir</name> <value>/home/hadoop/data/hdfs</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property>
5.4 Hadoop 설치 7 conf/mapred-site.xml <configuration> <property> <name>mapred.job.tracker</name> <value>server01:9001</value> </property> </configuration> 8 conf/masters server02 9 conf/slaves server02 server03 server04
5.5 Slave 서버설치 1 2 3 NameNode에설치된내용을 DataNode로복사 NameNode 설치내용 tar cd /home/hadoop tar cf hadoop.tar hadoop-1.0.4 DataNode로복사및압축해제 모든 DataNode에대해내용실행 scp hadoop.tar < 데이터노드호스트명 >:/home/hadoop ssh < 데이터노드호스트명 > cd /home/hadoop; tar xf hadoop.tar ssh < 데이터노드호스트명 > mkdir /home/hadoop/data 운영환경에서는스크립트작성하여활용
5.6 NameNode 포맷 1 2 FileSystem Namespace 정보저장디렉토리를구성하는과정 NameNode에서만실행 Format 명령실행시기존파일정보가있으면모두삭제됨 conf/hdfs.site.xml 파일에있는 dfs.name.dir 설정값에생성실행명령 bin/hadoop namenode format ls al /home/hadoop/filesystem
5.7 Hadoop 실행및중지 1 실행관리는 NameNode가설치된서버에서스크립트실행 2 Hadoop 전체시작및중지 cd ${HADOOP_HOME} bin/start-all.sh bin/stop-all.sh 3 HDFS만시작및중지 bin/start-dfs.sh bin/stop-dfs.sh 4 특정데몬시작및중지 NameNode NameNode 설치서버 bin/hadoop-daemon.sh start namenode bin/hadoop-daemon.sh stop namenode DataNode 실행할 DataNode 서버에서실행 bin/hadoop-daemon.sh start datanode bin/hadoop-daemon.sh stop datanode
5.8 MapReduce 플랫폼실행 1 전체실행 : JobTracker 서버 (NameNode 서버 ) 에서실행 su hadoop cd /home/hadoop/hadoop-1.0.4 bin/start-mapred.sh bin/stop-mapred.sh 2 데몬별실행 : 각서버에서실행 JobTracker bin/hadoop-daemon.sh start jobtracker bin/hadoop-daemon.sh stop jobtracker TaskTracker bin/hadoop-daemon.sh start tasktracker bin/hadoop-daemon.sh stop tasktracker
5.9 예제프로그램실행 1 기본제공되는예제프로그램 hadoop-examples-1.x.x.jar 2 HDFS 에샘플데이터업로드 bin/hadoop fs mkdir conf bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env.sh 3 WordCount 예제실행 bin/hadoop jar hadoop-examples-*.jar wordcount conf/hadoop-env.sh wordcount_output 4 예제실행결과확인 bin/hadoop fs -cat wordcount_output/part-r-00000
5.10 Hive 설치 1 요구사항 Hadoop RDBMS Default: derby MySql Server, mysql-connector-java(gpl) Hive-0.9.0 ANT-LIB (OPTION hive web interface) 2 압축해제 cp ${download}/hive-0.9.0.tar.gz /home/hadoop cd /home/hadoop tar xzf hive-0.9.0.tar.gz 3 환경설정 cd hive-0.9.0 cp conf/hive-env.sh.template conf/hive-env.sh vi conf/hive-env.sh HADOOP_HOME=/home/hadoop/hadoop-1.0.4 48
5.10 Hive 설치 4 vi conf/hive-site.xml <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration> 5 HDFS에데이터저장소디렉터리생성 cd /home/hadoop bin/hadoop fs mkdir /tmp bin/hadoop fs -mkdir /user/hive/warehouse bin/hadoop fs -chmod g+w /tmp bin/hadoop fs -chmod g+w /user/hive/warehouse 6 실행 bin/hive show tables; 49
5.11 Hive 활용사례 1 미국항공운항통계데이터다운로드 : http://statcomputing.org/dataexpo/2009/the-data.html 2 3 Hive 질의시편의를위해헤더정보를삭제함 sed -e '1d' 2008.csv > 2008_new.csv HDFS에데이터업로드 bin/hadoop fs mkdir input bin/hadoop fs -put 다운로드경로 /2008_new.csv input 50
5.11 Hive 활용사례 4 Hive 테이블생성하기 CREATE TABLE airline_delay(year INT, Month INT, DayofMonth INT, DayOfWeek INT, DepTime INT, CRSDepTime INT, ArrTime INT, CRSArrTime INT, UniqueCarrier STRING, FlightNum INT, TailNum STRING, ActualElapsedTime INT, CRSElapsedTime INT, AirTime INT, ArrDelay INT, DepDelay INT, Origin STRING, Dest STRING, Distance INT, TaxiIn INT, TaxiOut INT, Cancelled INT, CancellationCode STRING COMMENT 'A = carrier, B = weather, C = NAS, D = security', Diverted INT COMMENT '1 = yes, 0 = no', CarrierDelay STRING, WeatherDelay STRING, NASDelay STRING, SecurityDelay STRING, LateAircraftDelay STRING) PARTITIONED BY (delayyear INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE; 51
5.11 Hive 활용사례 5 Hive 테이블에데이터업로드 LOAD DATA INPATH '/user/hadoop/input/2008_new.csv' OVERWRITE INTO TABLE airline_delay PARTITION (delayyear='2008'); 6 데이터업로드확인 SELECT year, month, deptime, arrtime, uniquecarrier, flightnum FROM airline_delay WHERE delayyear = '2008' LIMIT 10; 7 집계함수활용 SELECT COUNT(1) FROM airline_delay WHERE delayyear = 2008; SELECT Year, Month, AVG(ArrDelay) AS avg_arrive_delay_time, AVG(DepDelay) AS avg_departure_delay_time FROM airline_delay WHERE delayyear = 2008 AND ArrDelay > 0 GROUP BY Year, Month; 52