Hadoop
From Chaehyun
(Difference between revisions)
(→cloudera HADOOP_HOME 설정) |
|||
(35 intermediate revisions not shown) | |||
Line 1: | Line 1: | ||
__TOC__ | __TOC__ | ||
+ | |||
+ | = hadoop local로 실행하기 = | ||
+ | # cygwin 설치 | ||
+ | ## open ssh 설치 | ||
+ | ## ssh-host-config -y | ||
+ | ## ssh-user-config | ||
+ | # hadoop download | ||
+ | # http://hadoop.apache.org/common/docs/r0.20.2/quickstart.html | ||
= cygwin 에서 native library 사용하기 = | = cygwin 에서 native library 사용하기 = | ||
Line 12: | Line 20: | ||
* classpath에 추가할 때는 delimiter가 : 이고, libjars에서는 , 임에 주의할 것 | * classpath에 추가할 때는 delimiter가 : 이고, libjars에서는 , 임에 주의할 것 | ||
** http://hadoop.apache.org/common/docs/r0.20.2/commands_manual.html | ** http://hadoop.apache.org/common/docs/r0.20.2/commands_manual.html | ||
+ | * 정리 | ||
+ | ** HADOOP_CLASSPATH=lib.jar | ||
+ | ** hadoop jar xlos.jar className -libjars lib.jar input output | ||
= combiner에 대한 상식 = | = combiner에 대한 상식 = | ||
Line 24: | Line 35: | ||
|- | |- | ||
| FILE_BYTES_READ | | FILE_BYTES_READ | ||
- | | | + | | 맵 태스크에 의해 각 파일시스템에서 읽힌 바이트 수 |
- | | 대부분 shuffle 과정에서 읽은 크기 인 듯? FILE_BYTES_WRITTEN과 크기가 동일함 | + | | 리듀스 태스크에 의해 각 파일 시스템에서 읽은 바이트 수. 대부분 shuffle 과정에서 읽은 크기 인 듯? FILE_BYTES_WRITTEN과 크기가 동일함 |
|- | |- | ||
|- | |- | ||
| FILE_BYTES_WRITTEN | | FILE_BYTES_WRITTEN | ||
- | | | + | | 각 태스크에 의해 각 파일 시스템에 쓰인 바이트 수 |
| | | | ||
|- | |- | ||
Line 39: | Line 50: | ||
|- | |- | ||
| HDFS_BYTES_WRITTEN | | HDFS_BYTES_WRITTEN | ||
- | | 대부분 0. | + | | 대부분 0. reducer task가 없는 경우, map task의 결과가 바로 HDFS에 기록 되고, Map output bytes와 일치? |
| reducer의 결과는 최종적으로 hdfs에 저장됨. hdfs에 저장된 최종 reducer 결과의 크기 | | reducer의 결과는 최종적으로 hdfs에 저장됨. hdfs에 저장된 최종 reducer 결과의 크기 | ||
|} | |} | ||
+ | * Map output bytes : 잡의 모든 맵에 의해 생산된 압축하지 않은 출력 바이트 수. | ||
+ | |||
+ | = task 진행률 = | ||
+ | * map task : 처리된 입력의 비율 | ||
+ | * reduce task : 시스템 수준에서 처리된 리듀스 입력의 비율 | ||
+ | |||
+ | = map task 개수 설정 = | ||
+ | * The number of map tasks can also be increased manually using the JobConf's conf.setNumMapTasks(int num). This can be used to increase the number of map tasks, but will not set the number below that which Hadoop determines via splitting the input data. | ||
+ | ** http://wiki.apache.org/hadoop/HowManyMapsAndReduces | ||
+ | * mapred.map.tasks : 실제 hadoop이 input split 기준으로 계산한 map task 개수보다다 작은 값은 무시됨 | ||
+ | * mapred.jobtracker.maxtasks.per.job : jobtracker daemon에서 설정한 값이 적용되며, client에서 설정한 값은 무시됨 | ||
+ | * mapred.tasktracker.map.tasks.maimum : 마찬가지로 tasktracker에서 설정한 값이 적용됨 | ||
+ | * However, the FileSystem blocksize of the input files is treated as an upper bound for input splits. | ||
+ | ** 그런데 실제로 mapred.min.split.size 값을 FileSystem의 block size보다 크게 설정하면, 아래와 같은 멘트가 뜨면서 정상적으로 동작함 | ||
+ | *** 11/06/02 21:19:41 INFO net.NetworkTopology: Adding a new node: /default-rack/*.*.*.*:50010 | ||
+ | |||
+ | = hadoop file 쓰기 = | ||
+ | * org.apache.hadoop.security.AccessControlException: Permission denied: user\com, access=WRITE, inode="test":hadoopuser:supergroup:rw-r--r-- | ||
+ | * Configuration conf = new Configuration(); | ||
+ | * conf.set("hadoop.job.ugi", "hadoopuser,supergroup"); | ||
+ | |||
+ | =streaming= | ||
+ | * hadoop jar ${HADOOP_HOME}/contrib/streaming/hadoop-*-streaming.jar -input /user/xlos/t/web_url_out_3day -output /user/xlos/t/web_url_out_3day_cluster -mapper "cut -f1" -reducer "uniq -c" -numReduceTasks 1 &>/dev/null & | ||
+ | |||
+ | = key/value 주기 = | ||
+ | * You can specify additional configuration variables by using "-D <property>=<value>". | ||
+ | <pre> | ||
+ | hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ | ||
+ | -D mapred.reduce.tasks=2 \ | ||
+ | -D mapred.map.tasks=100\ | ||
+ | -input myInputDirs \ | ||
+ | -output myOutputDir \ | ||
+ | -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ | ||
+ | -reducer /bin/wc | ||
+ | </pre> | ||
+ | |||
+ | = cluster 용 추가 설정 = | ||
+ | * http://hadoop.apache.org/common/docs/r0.20.205.0/cluster_setup.html | ||
+ | == core-site.xml == | ||
+ | <pre> | ||
+ | <?xml version="1.0"?> | ||
+ | <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> | ||
+ | |||
+ | <!-- Put site-specific property overrides in this file. --> | ||
+ | |||
+ | <configuration> | ||
+ | <property> | ||
+ | <name>fs.default.name</name> | ||
+ | <value>hdfs://namenode:9000</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>hadoop.tmp.dir</name> | ||
+ | <value>/var/hadoop/tmp</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>io.compression.codecs</name> | ||
+ | <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>io.compression.codec.lzo.class</name> | ||
+ | <value>com.hadoop.compression.lzo.LzoCodec</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>fs.inmemory.size.mb</name> | ||
+ | <value>200</value> | ||
+ | <description>prev : 100 Larger amount of memory allocated for the in-memory file-system used to merge map-outputs at the reduces.</description> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>io.sort.factor</name> | ||
+ | <value>100</value> | ||
+ | <description>prev : 10 More streams merged at once while sorting files.</description> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>io.sort.mb</name> | ||
+ | <value>200</value> | ||
+ | <description>prev : 100 Higher memory-limit while sorting data.</description> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>io.file.buffer.size</name> | ||
+ | <value>131072</value> | ||
+ | <description>prev : 65536 Size of read/write buffer used in SequenceFiles.</description> | ||
+ | </property> | ||
+ | </configuration> | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | == mapred-site.xml == | ||
+ | <pre> | ||
+ | <?xml version="1.0"?> | ||
+ | <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> | ||
+ | |||
+ | <!-- Put site-specific property overrides in this file. --> | ||
+ | |||
+ | <configuration> | ||
+ | <property> | ||
+ | <name>mapred.job.tracker</name> | ||
+ | <value>namenode:9001</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>mapred.tasktracker.map.tasks.maximum</name> | ||
+ | <value>6</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>mapred.tasktracker.reduce.tasks.maximum</name> | ||
+ | <value>6</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>mapred.reduce.tasks</name> | ||
+ | <value>15</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>mapred.system.dir</name> | ||
+ | <value>/hadoop/mapred/system</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>mapred.map.output.compression.codec</name> | ||
+ | <value>com.hadoop.compression.lzo.LzoCodec</value> | ||
+ | </property> | ||
+ | <property> | ||
+ | <name>mapred.reduce.parallel.copies</name> | ||
+ | <value>20</value> | ||
+ | <description>prev : 5 Higher number of parallel copies run by reduces to fetch outputs from very large number of maps.</description> | ||
+ | </property> | ||
+ | </configuration> | ||
+ | </pre> | ||
+ | |||
+ | == cloudera hadoop 배포판 설치 (Ubuntu 용) == | ||
+ | * http://www.ibm.com/developerworks/kr/library/l-hadoop-1/ | ||
+ | |||
+ | */etc/apt/sources.list.d/cloudera.list 파일에 아래 두 줄 추가 | ||
+ | ** deb http://archive.cloudera.com/debian intrepid-cdh3 contrib | ||
+ | ** deb-src http://archive.cloudera.com/debian intrepid-cdh3 contrib | ||
+ | |||
+ | * apt-get update | ||
+ | * apt-cache search hadoop | ||
+ | * sudo apt-get install hadoop-0.20 --force-yes -y | ||
+ | |||
+ | * dist -c "cp -r /etc/hadoop-0.20/conf.empty /etc/hadoop-0.20/conf.my_cluster" | ||
+ | *sudo update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50 | ||
+ | |||
+ | = CapacityScheduler guide = | ||
+ | * http://hadoop.apache.org/common/docs/r1.0.0/capacity_scheduler.html | ||
+ | * 굳이 cluster로 나누지 말고, 하나로 합친 다음, Capacity Scheduler를 활용하자 | ||
+ | |||
+ | = Simple hadoop workflow = | ||
+ | * http://sna-projects.com/azkaban/ | ||
+ | * Azkaban is a workflow scheduler that allows the independent pieces to be declaratively assembled into a single workflow, and for that workflow to be scheduled to run periodically. | ||
+ | |||
+ | = hosts 문제 = | ||
+ | * 하둡은 기본적으로 hostname 이랑 /etc/resolve.conf 를 참고함 (확실치 않음) | ||
+ | * HDFS Viewer에서 ip나 full domain이 아닌, hostname으로 연결이 되는 경우 | ||
+ | * /etc/hosts 를 아래와 같이 수정함 | ||
+ | ** 127.0.0.1 localhost | ||
+ | ** 1.234.62.243 sk001.reople.com sk001 | ||
+ | * 아마존 aws 에서는 | ||
+ | ** /etc/hostname 에 ec101 추가 | ||
+ | ** /etc/resolve.conf 에 | ||
+ | *** (가장 마지막 라인에) | ||
+ | *** domain reople.com ec2.internal 로 수정 | ||
+ | <pre> | ||
+ | 2012-10-16 22:46:13,859 FATAL org.apache.hadoop.mapred.JobTracker: java.net.BindException: Problem binding to ec101.reople.com/174.129.98.43:9001 : Cannot assign requested address | ||
+ | at org.apache.hadoop.ipc.Server.bind(Server.java:227) | ||
+ | </pre> | ||
+ | ** 이런 오류가 발생하면, | ||
+ | ** /etc/hosts 에 | ||
+ | *** 127.0.0.1 ec101.reople.com ec101''' localhost''' | ||
+ | *** localhost가 가장 마지막에 있어야함 | ||
+ | ** security group 에 9000, 9001 포트 추가한 다음 재부팅을 해줘야함 | ||
+ | |||
+ | = gc 오류 날 때 = | ||
+ | * export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS" | ||
+ | |||
+ | == cloudera HADOOP_HOME 설정 == | ||
+ | * sudo jps -v | ||
+ | * HADOOP_HOME=/mnt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop-0.20-mapreduce | ||
+ | * ./count_purchase.py hdfs://ip-10-132-128-216.ap-northeast-1.compute.internal:8022/user/ubuntu/coruscant/export/stats_log -r hadoop --hadoop-bin /usr/bin/hadoop |
Latest revision as of 05:10, 7 August 2013
Contents |
hadoop local로 실행하기
- cygwin 설치
- open ssh 설치
- ssh-host-config -y
- ssh-user-config
- hadoop download
- http://hadoop.apache.org/common/docs/r0.20.2/quickstart.html
cygwin 에서 native library 사용하기
- cygwin 에서는 기본적으로 hadoop native library가 지원되지 않기 때문에 압축 등을 사용할 수 없음
외부 jar 사용하기
- local 로 돌릴 때 문제가 발생하는 듯함. local로 돌릴 때는 classpath에도 추가하고, libjars에도 추가할 것. delimiter 주의
- 먼저 export HADOOP_CLASSPATH=a.jar:b.jar
- HADOOP_CLASSPATH tends to be used to add to bin/hadoop's classpath. Because of the way the comment is written, administrator's who customize hadoop-env.sh often inadvertently disable user's abilities to use it, by not including the present value of the variable.
- 그리고 하둡을 실행할 때, -libjars a.jar,b.jar 옵션 추가
- Specify comma separated jar files to include in the classpath. Applies only to job.
- classpath에 추가할 때는 delimiter가 : 이고, libjars에서는 , 임에 주의할 것
- 정리
- HADOOP_CLASSPATH=lib.jar
- hadoop jar xlos.jar className -libjars lib.jar input output
combiner에 대한 상식
- combiner의 input은 항상 mapper에서 들어오는 것은 아님.
- combiner의 output이 combiner의 input으로 들어올 수도 있음
FileSystemCounters의 의미
counter | Map | Reduce |
FILE_BYTES_READ | 맵 태스크에 의해 각 파일시스템에서 읽힌 바이트 수 | 리듀스 태스크에 의해 각 파일 시스템에서 읽은 바이트 수. 대부분 shuffle 과정에서 읽은 크기 인 듯? FILE_BYTES_WRITTEN과 크기가 동일함 |
FILE_BYTES_WRITTEN | 각 태스크에 의해 각 파일 시스템에 쓰인 바이트 수 | |
HDFS_BYTES_READ | hdfs 에서 읽은 크기. Map input bytes 보다 조금 더 크다 | 대부분 0 |
HDFS_BYTES_WRITTEN | 대부분 0. reducer task가 없는 경우, map task의 결과가 바로 HDFS에 기록 되고, Map output bytes와 일치? | reducer의 결과는 최종적으로 hdfs에 저장됨. hdfs에 저장된 최종 reducer 결과의 크기 |
- Map output bytes : 잡의 모든 맵에 의해 생산된 압축하지 않은 출력 바이트 수.
task 진행률
- map task : 처리된 입력의 비율
- reduce task : 시스템 수준에서 처리된 리듀스 입력의 비율
map task 개수 설정
- The number of map tasks can also be increased manually using the JobConf's conf.setNumMapTasks(int num). This can be used to increase the number of map tasks, but will not set the number below that which Hadoop determines via splitting the input data.
- mapred.map.tasks : 실제 hadoop이 input split 기준으로 계산한 map task 개수보다다 작은 값은 무시됨
- mapred.jobtracker.maxtasks.per.job : jobtracker daemon에서 설정한 값이 적용되며, client에서 설정한 값은 무시됨
- mapred.tasktracker.map.tasks.maimum : 마찬가지로 tasktracker에서 설정한 값이 적용됨
- However, the FileSystem blocksize of the input files is treated as an upper bound for input splits.
- 그런데 실제로 mapred.min.split.size 값을 FileSystem의 block size보다 크게 설정하면, 아래와 같은 멘트가 뜨면서 정상적으로 동작함
- 11/06/02 21:19:41 INFO net.NetworkTopology: Adding a new node: /default-rack/*.*.*.*:50010
- 그런데 실제로 mapred.min.split.size 값을 FileSystem의 block size보다 크게 설정하면, 아래와 같은 멘트가 뜨면서 정상적으로 동작함
hadoop file 쓰기
- org.apache.hadoop.security.AccessControlException: Permission denied: user\com, access=WRITE, inode="test":hadoopuser:supergroup:rw-r--r--
- Configuration conf = new Configuration();
- conf.set("hadoop.job.ugi", "hadoopuser,supergroup");
streaming
- hadoop jar ${HADOOP_HOME}/contrib/streaming/hadoop-*-streaming.jar -input /user/xlos/t/web_url_out_3day -output /user/xlos/t/web_url_out_3day_cluster -mapper "cut -f1" -reducer "uniq -c" -numReduceTasks 1 &>/dev/null &
key/value 주기
- You can specify additional configuration variables by using "-D <property>=<value>".
hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -D mapred.reduce.tasks=2 \ -D mapred.map.tasks=100\ -input myInputDirs \ -output myOutputDir \ -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ -reducer /bin/wc
cluster 용 추가 설정
core-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://namenode:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/hadoop/tmp</value> </property> <property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec</value> </property> <property> <name>io.compression.codec.lzo.class</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property> <property> <name>fs.inmemory.size.mb</name> <value>200</value> <description>prev : 100 Larger amount of memory allocated for the in-memory file-system used to merge map-outputs at the reduces.</description> </property> <property> <name>io.sort.factor</name> <value>100</value> <description>prev : 10 More streams merged at once while sorting files.</description> </property> <property> <name>io.sort.mb</name> <value>200</value> <description>prev : 100 Higher memory-limit while sorting data.</description> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> <description>prev : 65536 Size of read/write buffer used in SequenceFiles.</description> </property> </configuration>
mapred-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapred.job.tracker</name> <value>namenode:9001</value> </property> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>6</value> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>6</value> </property> <property> <name>mapred.reduce.tasks</name> <value>15</value> </property> <property> <name>mapred.system.dir</name> <value>/hadoop/mapred/system</value> </property> <property> <name>mapred.map.output.compression.codec</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property> <property> <name>mapred.reduce.parallel.copies</name> <value>20</value> <description>prev : 5 Higher number of parallel copies run by reduces to fetch outputs from very large number of maps.</description> </property> </configuration>
cloudera hadoop 배포판 설치 (Ubuntu 용)
- /etc/apt/sources.list.d/cloudera.list 파일에 아래 두 줄 추가
- deb http://archive.cloudera.com/debian intrepid-cdh3 contrib
- deb-src http://archive.cloudera.com/debian intrepid-cdh3 contrib
- apt-get update
- apt-cache search hadoop
- sudo apt-get install hadoop-0.20 --force-yes -y
- dist -c "cp -r /etc/hadoop-0.20/conf.empty /etc/hadoop-0.20/conf.my_cluster"
- sudo update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50
CapacityScheduler guide
- http://hadoop.apache.org/common/docs/r1.0.0/capacity_scheduler.html
- 굳이 cluster로 나누지 말고, 하나로 합친 다음, Capacity Scheduler를 활용하자
Simple hadoop workflow
- http://sna-projects.com/azkaban/
- Azkaban is a workflow scheduler that allows the independent pieces to be declaratively assembled into a single workflow, and for that workflow to be scheduled to run periodically.
hosts 문제
- 하둡은 기본적으로 hostname 이랑 /etc/resolve.conf 를 참고함 (확실치 않음)
- HDFS Viewer에서 ip나 full domain이 아닌, hostname으로 연결이 되는 경우
- /etc/hosts 를 아래와 같이 수정함
- 127.0.0.1 localhost
- 1.234.62.243 sk001.reople.com sk001
- 아마존 aws 에서는
- /etc/hostname 에 ec101 추가
- /etc/resolve.conf 에
- (가장 마지막 라인에)
- domain reople.com ec2.internal 로 수정
2012-10-16 22:46:13,859 FATAL org.apache.hadoop.mapred.JobTracker: java.net.BindException: Problem binding to ec101.reople.com/174.129.98.43:9001 : Cannot assign requested address at org.apache.hadoop.ipc.Server.bind(Server.java:227)
- 이런 오류가 발생하면,
- /etc/hosts 에
- 127.0.0.1 ec101.reople.com ec101 localhost
- localhost가 가장 마지막에 있어야함
- security group 에 9000, 9001 포트 추가한 다음 재부팅을 해줘야함
gc 오류 날 때
- export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS"
cloudera HADOOP_HOME 설정
- sudo jps -v
- HADOOP_HOME=/mnt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop-0.20-mapreduce
- ./count_purchase.py hdfs://ip-10-132-128-216.ap-northeast-1.compute.internal:8022/user/ubuntu/coruscant/export/stats_log -r hadoop --hadoop-bin /usr/bin/hadoop