Install¶
metatron integrator 는 hadoop 내에 데이터를 수집,처리할 수 있는 tool 로써 oozie 엔진을 기반으로 동작한다.
oozie 는 hadoop component(MR, Hive, Spark, Exec, ...) 를 사용하기 때문에 hadoop component 들의 설치가 우선적으로 문제없이 동작하는 환경을 구성하여야 한다. 이를 바탕으로 oozie 가 설치되고 integrator 가 설치되어야 한다.
1. Requirements¶
- CentOS 6.x 이상 권장
- Java 1.8 이상
- Hadoop cluster 2.6.x 이상 권장
- mysql (mariadb) 5.5 이상 권장
- oozie 4.3.0 이상
- activemq 5.15.6 이상
2. Install oozie¶
oozie 는 4.3.0 버전 이상을 설치하여야 하며, 설치와 실행에 대한 사항은 오피셜 사이트(http://oozie.apache.org/)를 참조.
oozie server configuration 에는 timezone 과 proxy user 설정등이 추가되어 있어야 한다.
2-1. oozie conf 내 proxy user 추가¶
아래와 같이 integrator application 이 실행되는 계정(metatron)에 대해서 proxy user 를 추가한다.
1 2 3 4 5 6 7 8 <property> <name>oozie.service.ProxyUserService.proxyuser.metatron.hosts</name> <value>*</value> </property> <property> <name>oozie.service.ProxyUserService.proxyuser.metatron.groups</name> <value>*</value> </property>
2-2. oozie conf 내 JPA 설정¶
oozie meta data 가 저장되는 DBMS 에 대한 설정을 정의한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <property> <name>oozie.service.JPAService.jdbc.driver</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>oozie.service.JPAService.jdbc.url</name> <value>jdbc:mysql://{DBMS Server IP}:{DBMS Server Port}/oozie</value> </property> <property> <name>oozie.service.JPAService.jdbc.username</name> <value>oozie_user</value> </property> <property> <name>oozie.service.JPAService.jdbc.password</name> <value>oozie_userpassword</value> </property>
2-3. oozie server timezone 설정¶
서버가 동작하는 지역 timezone 에 맞게 timezone 설정도 추가 되어야 한다.
1 2 3 4 <property> <name>oozie.processing.timezone</name> <value>GMT+0900</value> </property>
2-4. oozie conf 내 JMS 설정¶
job 의 시작과 종료등 이벤트를 integrator 가 수신할 수 있도록 JMS 설정을 추가하여야 한다. oozie external library 중에 JMS 관련한 class 를 oozie.service.ext 에 등록하여야 하고 oozie.jms.producer.connection.properties 에는 JMS publish 할 수 있도록 설정을 추가하여야 한다.
설정 중에 {activemq server IP} 는 activemq 가 설치되어 있는 서버 IP 로 대체되어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 <property> <name>oozie.services.ext</name> <value> org.apache.oozie.service.JMSAccessorService, org.apache.oozie.service.JMSTopicService, org.apache.oozie.service.EventHandlerService, org.apache.oozie.sla.service.SLAService </value> </property> <property> <name>oozie.jms.producer.connection.properties</name> <value>java.naming.factory.initial#org.apache.activemq.jndi.ActiveMQInitialContextFactory;java.naming.provider.url#tcp://{activemq server IP}:61616;connectionFactoryNames#ConnectionFactory</value> </property>
2-5. oozie port open oozie와 integrator 는 rest API 를 통해서 통신하기 때문에 integrator → oozie direction 방향으로 oozie listen port(11000)에 대해 방화벽 오픈이 필요하다.
3. Install Integrator¶
Integrator application 의 설치 경로는 기본적으로 /home/metatron/servers/metatron-integrator 를 사용하며, 변경이 필요한 경우 integrator.sh 파일내에 경로를 수정하여야 한다.
3-1. oozie listen port open¶
oozie와 integrator 는 rest API 를 통해서 통신하기 때문에 integrator → oozie direction 방향으로 oozie listen port(11000)에 대해 방화벽 오픈이 필요하다.
3-2. hadoop cluster 내 webhdfs port open¶
integrator 는 oozie xml 파일 혹은 hql, library 파일등을 업로드하기 위해서 web hdfs 포트가 열려있어야 한다. 기본 포트인 50070 포트에 대해 integrator 가 접근할 수 있도록 방화벽 설정이 필요하다.
3-3. application.yaml 설정¶
integrator 의 설정은 yaml 파일로 정의한다. yaml 파일은 section 으로 구성되어 있으며 각 section 의 역할은 아래와 같다.
section name 설명 비고 spring.datasource integrator meta 정보를 저장하는 DB 서버 정보를 입력한다. spring.jpa integrator meta 정보를 저장할 DB 의 정보를 입력한다. spring.mail Job noti, SLA noti 를 받을 mail 서버 정보를 입력한다. spring.activemq oozie 서버와 JMS 연동을 위한 activemq 서버 정보를 입력한다. spring.hadoop hadoop cluster 정보를 입력한다. spring.oozie oozie 서버 정보를 입력한다. spring.hive hive server 정보를 입력한다. spring.druid druid task 를 위한 discovery 설정 정보를 입력한다. spring.polaris druid task 를 위한 discovery 설정 정보를 입력한다. notification.slack Job noti, SLA noti 를 받을 slack 설정 정보를 입력한다. notification.sms Job noti, SLA noti 를 SMS 로 발송할 수 있도록 sms 서버 정보를 입력한다. server.port integrator 서버 listen port 를 설정한다. zuul.route metatron discovery 인증과 관련된 설정으로 discovery 서버 정보를 입력한다. 위와 같은 section 별로 설정된 yaml 파일의 sample 이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 spring: profiles: prod devtools: restart: enabled: false livereload: enabled: false datasource: # integrator metadata DBMS 서버 정보 type: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql://{dbserver IP}:{dbserver port}/integrator?useUnicode=true&characterEncoding=utf8&useSSL=false # db server 정보에 맞춰서 수정 username: integrator # db server 정보에 맞춰서 수정 password: xxxxxxxxxx # db server 정보에 맞춰서 수정 hikari: data-source-properties: cachePrepStmts: true prepStmtCacheSize: 250 prepStmtCacheSqlLimit: 2048 useServerPrepStmts: true jpa: database-platform: org.hibernate.dialect.MySQL5InnoDBDialect database: MYSQL show-sql: false hibernate: naming-strategy: org.hibernate.cfg.EJB3NamingStrategy naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl properties: hibernate.id.new_generator_mappings: true hibernate.cache.use_second_level_cache: false hibernate.cache.use_query_cache: false hibernate.generate_statistics: false mail: # Job event , SLA event 발생시 메일 발송을 위한 SMTP 서버 정보 host: localhost port: 25 username: password: sendAsMail: "Oozie Notification <no_reply@sk.com>" thymeleaf: cache: true http: # web upload file temporary saving path multipart: location: /home/metatron/servers/metatron-integrator/upload_temp max-file-size: 1000Mb max-request-size: 1000Mb activemq: # JMS 수신을 위한 activemq 서버 정보 broker-url: tcp://{activemq server IP}:61615 topic: metatron user: metatron password: jms: pub-sub-domain: true hadoop : # hadoop namenode 정보 url : http://hadoop-namenode user.name : metatron nameNodePort : 50070 dataNodePort : 50075 dataNodeUrlUsed : true defaultPath : /webhdfs/v1 tunneling : false oozie : # oozie server 정보 oozieUrl : http://{oozie server IP} # oozie server ip ex) http://1.2.3.4 ooziePort : 11000 # oozie server port. default 11000 timezone.offset : T+0900 timezone.location : Asia/Seoul hdfs.workflowSavingPath : /user/metatron/integrator/workflow # workflow saving HDFS path hdfs.coordinatorSavingPath : /user/metatron/integrator/coordinator # coordinator saving path hdfs.taskSavingPath : /user/metatron/integrator/task # task library temporary saving path hdfs.defaultPath : /user/metatron # base path jobConf.nameNode : hdfs://{HDFS name service} # workflow namenode variable. ex) hdfs://metatron-cluster jobConf.jobTracker : {Yarn resourcemanager address} # workflow job tracker(YARN) server variable ex) metatron-hadoop-01:8032 jobConf.oozie.use.system.libpath : true # oozie.use.system.libpath variable jobConf.oozie.libpath : /user/oozie/share/lib # oozie.libpath variable (HDFS Path) jobConf.impersonate.mode : true # Is user.name equals application runner jobConf.impersonate.name : metatron # user.name variable jobConf.defaultQueue.name : default # workflow queue name variables druid: # druid task 정보 userid: admin # discovery oauth token 획득을 위한 admin 계정 id password: admin # discovery oauth token 획득을 위한 admin 계정 password discoveryUrl: http://{discovery server IP}:{discovery port} # discovery oauth token 획득을 위한 discovery 서버 정보 authorization: Basic cG9sYXJpc19jbGllbnQ6cG9sYXJpcw== # discovery oauth token 획득을 위한 request header 내 Authorization 값 jarPath: /user/metatron/integrator/ext_scripts/metatron-integrator-druid.jar # druid task(metatron-integrator-druid.jar)의 HDFS 상 경로 server: port: 8280 # integrator server listen port(service port) compression: enabled: true mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json min-response-size: 1024 liquibase: contexts: prod notification: # JMS 를 통해 수신한 Job event , SLA event 를 전달하기 위한 messaging server 정보 slack: # Slack 정보 webhookUrl: # Setup & Configure Incoming-Webhook URL in Slack > Apps botName: # (Optional) if empty, use default value that configured in Slack App botEmoji: # (Optional) if empty, use default value that configured in Slack App notiChannel: # (Optional) if empty, use default value that configured in Slack App sms: # SMS 서버 정보 requestUrl: "http://{sms server IP}:{sms server port}/esc-channel/etc/sms/sendsmsinfo" senderNumber: "01000000000" # The message sender's number receiverNumber: "010000000" security: # discovery 통합 로그인을 위한 인증서버 정보(discovery 서버 정보) basic: enabled: false oauth2: # OAuth 서버 Client 정보 client: client-id: polaris_client client-secret: polaris resource: # oauth url token-info-uri: http://{metatron discovery server IP}:{metatron discovery server port}/oauth/check_token logging: level: ROOT: INFO com.sample: INFO io.github.jhipster: INFO jhipster: # jhipster 서버 정보(설정 불필요) http: version: V_1_1 # To use HTTP/2 you will need SSL support (see above the "server.ssl" configuration) cache: # Used by the CachingHttpHeadersFilter timeToLiveInDays: 1461 mail: # specific JHipster mail property, for standard properties see MailProperties from: sample@localhost base-url: http://my-server-url-to-change # Modify according to your server's URL metrics: # DropWizard Metrics configuration, used by MetricsConfiguration jmx.enabled: true graphite: enabled: false host: localhost port: 2003 prefix: sample prometheus: enabled: false endpoint: /prometheusMetrics logs: # Reports Dropwizard metrics in the logs enabled: false report-frequency: 60 # in seconds logging: logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration enabled: false host: localhost port: 5000 queue-size: 512 zuul: # zuul 서버 정보 routes: oauth: path: /oauth/** url: http://{metatron discovery server IP}:{metatron discovery server port} # require metatron discovery server IP, port sensitiveHeaders: Cookie,Set-Cookie stripPrefix: false stomp: path: /stomp/** url: http://{metatron discovery server IP}:{metatron discovery server port} # require metatron discovery server IP, port sensitiveHeaders: Cookie,Set-Cookie strip-prefix: true api: path: /api/** url: http://{metatron discovery server IP}:{metatron discovery server port} # require metatron discovery server IP, port sensitiveHeaders: Cookie,Set-Cookie stripPrefix: false application:
3-3. Make application directory in HDFS¶
yaml 파일에서 아래와 같이 application 에서 사용하는 HDFS 상의 디렉토리를 정의하게 된다.
1 2 3 4 hdfs.workflowSavingPath : /user/metatron/integrator/workflow hdfs.coordinatorSavingPath : /user/metatron/integrator/coordinator hdfs.taskSavingPath : /user/metatron/integrator/task hdfs.defaultPath : /user/metatron
yaml 파일에서 설정한 workflow, coordinator, task 경로에 맞춰 HDFS 내에 directory 를 생성하여야 한다. 위에서 설정한 경로를 hadoop cluster 내에 hadoop fs -mkdir 명령어로 생성해 주면 된다.
3-4. integrator library upload to HDFS¶
integrator 에서 사용하는 library 는 HDFS 에 업로드되어야 한다. ext_scripts 는 /user/metatron/integrator/ext_scripts 로 업로드한다.
3-5. application run script(integrator.sh) 확인¶
application 실행 스크립트인 integrator.sh 파일내에 application.yaml 의 profile 을 설정하여야 한다. 일반적인 경우 prod 라는 profile 을 사용하지만 yaml 파일 내에 복수개의 profile 을 정의 하는 경우는 profile name 을 지정해 주어야 한다.
spring.profiles.active 항목에 application.yaml 에 설정한 profile 명을 넣어서 yaml 파일 profile 을 불러올 수 있도록 설정하여야 한다.
또한, application 의 설치 경로(/home/metatron/servers/metatron-integrator)를 변경하는 경우에도 shell script 내 base dir 정보를 변경해 주어야 한다.
3-6. application start¶
integrator.sh start / stop 명령어를 통해서 application 을 실행하거나 종료할 수 있다.