SEARCH
TOOLBOX
LANGUAGES
Hadoop

Hadoop

From Chaehyun

Revision as of 05:10, 7 August 2013 by Xlos (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Contents


hadoop local로 실행하기

  1. cygwin 설치
    1. open ssh 설치
    2. ssh-host-config -y
    3. ssh-user-config
  2. hadoop download
  3. 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

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 용)

  • 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

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
Retrieved from "http://chaehyun.kr/w/Hadoop"