JSON 형태의 문자열로 들어오는 칼럼을 UDTF 함수를 이용하여 테이블로 만들어야 할 때 다음과 같이 사용할 수 있다. JSON 문자열의 데이터를 찾는 것은 get_json_object()를 이용하고, inline() 함수를 이용하여 테이블화 한다. hive> SELECT inline(array( struct(get_json_object(str, "$.key1")) > , struct(get_json_object(str, "$.key2")) )) > FROM ( SELECT '{ "key1": "a", "value1" : "1", "key2": "b", "value2" : "2" }' AS str ) t > ; OK a b Time taken: 0.031 seconds, Fetched: 2 row(s)
우지에서 작업중 코디네이터, 워크플로우에서 오류가 발생하면 작업을 새로 걸지 않고, 리런 커맨드를 이용하여 재작업 할 수 있습니다. 코디네이터 리런$oozie job -rerun [-nocleanup] [-refresh] [-action 1, 3-4, 7-40] (-action or -date is required to rerun.) [-date 2009-01-01T01:00Z::2009-05-31T23:59Z, 2009-11-10T01:00Z, 2009-12-31T22:00Z] (if neither -action nor -date is given, the exception will be thrown.) # 3번 액션 재작업 oozie job -rerun [coord-id] -action 3 # 3~10..
배쉬의 for 문에서 순차적인 숫자를 출력하는 방법은 다음과 같습니다. #!/bin/bash for vTime in {00..23} do echo ${vTime} done [결과] $ ./for.sh 00 01 02 ...23 #!/bin/bash for vTime in {1..100} do echo ${vTime} done [결과] $ ./for.sh 1 2 ...100 #!/bin/bash for vTime in 00 01 02 03 04 do echo $vTime done [결과]0001..04
파이썬의 패키지 배포는 pypi 사이트를 이용합니다. 개인적으로 만든 패키지를 pypi 사이트에 배포하는 방법을 알아보겠습니다. 준비사항-PIP 패키지 설치 pypi에 패키지를 배포하기 위해서는 다음 3개의 패키지를 설치하는 것이 좋습니다. pip install wheel # 빌드 툴 pip install setuptools # 패키징 툴 pip install twine # 패키지 업로드 툴 각 패키지의 상세한 내용은 다음 내용을 참고 바랍니다. wheel 파이썬 빌드& 패키징 포맷입니다. 기존 egg 포맷을 대체하는 포맷입니다. wheel vs egg 파이썬 공식 문서[바로가기] setuptools 파이썬의 기본 라이브러리인 distutils를 개선한 패키지 개발 라이브러리 setup.py 파일에 관련..
버블정렬 구현체는 다음과 같다.
하둡 HDFS는 동작하면서 HDFS에 파일을 생성, 삭제 하는 등의 작업에 대한 트랜잭션 로그를 기록합니다. 해당 로그는 Edits_XXX 이름으로 네임노드의 dfs.namenode.edits.dir 에 설정된 위치에 저장됩니다. 이 트랜잭션 로그는 트랜잭션이 많아질 수록 빠르게 해당 위치에 쌓이게 됩니다. 로그는 세컨더리네임노드를 이용하여 정리할 수 있습니다. 세컨더리네임노드는 다음과 같이 실행합니다. > hdfs secondarynamenode 세컨더리 네임노드는 설정값에 따라 기본 한시간에 한번씩 Edits 로그를 확인하면서 설정값이상의 파일이나, 트랜잭션 횟수를 넘어서면 Edits 파일을 정리하여 사이즈를 줄여줍니다. dfs.namenode.checkpoint.period: 체크포인트 확인 시간 ..
기타줄 문제는 그리디 알고리즘으로 해결한다. 적어도 끊어진 기타줄 만큼 구매할 수 있는 최소한의 돈을 출력하면 된다. 1. 패키지로 구매할 수 있는 최소값, 개당으로 구매할 수 있는 최소값을 구하고,2. 패키지로 구매하는 것보다, 개당구매로 6개를 구매하는 것이 더 싼지 확인하고,3. 끊어진 기타줄 만큼 패키지 구매 + min(개당 구매, 패키지구매) 적어도 끊어진 기타줄 만큼 구매이기 때문에 더 구매해도 되는 것을 생각해서 마지막에 패키지 구매가 최소값인지 확인하면 된다. https://www.acmicpc.net/problem/1049
파이썬에서 파라미터로 전달받는 데이터의 값을 제한하기 위해서 데코레이터를 이용하는 방법은 다음과 같다. 파이썬3면 Enum을 이용하면 좀더 깔끔하게 처리할 수 있을 것 같다. 인스펙트를 이용하여 추가로 처리하는 예제는 다음과 같다. #!/usr/bin/env python # -*- coding: utf-8 -*- import inspect values = [ "a", "b", "c" ] def check_param_values(param_name, check_list): def wrapper(func): param_index = inspect.getargspec(func).args.index(param_name) def decorator(*args, **kwargs): if args[param_index..
파이썬의 데코레이터는 함수를 실행하기 전과 후에 공통적으로 해야할 작업이 있을 경우 사용하면 도움이 된다. @을 이용하여 함수위에 선언해주면되고, 데코레이터는 함수, 클래스를 이용하여 선언할 수 있다. 다수의 데코레이터를 적용할 수도 있다. 간단한 예제는 다음과 같다. 실행결과는 다음과 같다. print_hello1시작 hello1 print_hello1종료 ------------------------------- 2018-07-26 15:18:16.128121 print_hello2시작 hello2 print_hello2종료 2018-07-26 15:18:16.128121 None ------------------------------- 2018-07-26 15:18:16.128121 hello3 20..
여러개의 파이썬 모듈이 설치된 시스템에서 파이썬을 실행하는 버전을 지정해야 하는 경우에 선택할 수 있는 방법은 두가지가 있다. 하나는 실행시점에 파이썬의 버전을 명시하는 방법이다. > python2.7 run_script.py> python3.7 run_script.py 다른 방법은 스크립트의 셔뱅을 이용하는 방법이다. 유닉스 계열에서 작성한 스크립트의 셔뱅에 파이썬의 버전을 지정하면 실행 시점에 자동으로 선택해 준다. #!/usr/bin/env python2.7 #!/usr/bin/env python3.6 > ./run_script.py 셔뱅에 파이썬 버전을 지정하면 다른 서버에서도 동일한 환경으로 동작한다. https://en.wikipedia.org/wiki/Shebang_%28Unix%29#Por..
TEZ 엔진을 이용할 때 메모리 부족 오류가 발생하는 곳은 AM과 MR 작업 중에 발생한다. AM은 다음의 설정으로 메모리를 설정한다. // AM의 메모리 set tez.am.resource.memory.mb=2048; // AM이 사용할 힙메모리 사이즈(tez.am.resource.memory.mb의 80%) set tez.am.java.opts=-Xmx1600m; 그리고 MR 작업에서 메모리를 설정하는 방법은 다음과 같다. // tez 작업을 진행하는 컨테이너의 메모리 크기 set hive.tez.container.size=2048; // 컨테이너에서 사용할 수 있는 힙의 메모리 크기 set hive.tez.java.opts=-Xmx1600m; // hive.tez.container.size의 80%..
우지의 cli 명령어를 실행할 때 OOZIE_URL이 설정되어 있지 않고, 프로퍼티로 -oozie 값을 전달하지 않으면 다음의 오류가 발생한다. java.lang.IllegalArgumentException: Oozie URL is not available neither in command option or in the environment at org.apache.oozie.cli.OozieCLI.getOozieUrl(OozieCLI.java:711) at org.apache.oozie.cli.OozieCLI.createXOozieClient(OozieCLI.java:911) at org.apache.oozie.cli.OozieCLI.jobsCommand(OozieCLI.java:1544) at org..
배쉬에 이전에 실행한 명령어를 확인하는 history 명령어가 있다. 기본적으로 history 명령을 실행하면 다음과 같은 형태로 나온다. 1001 crontab -e 1002 history | grep cp 1003 history 이를 표현하는 형식을 명령어를 실행한 시간을 출력하기 위해서 다음과 같이 변경하면 아래의 결과를 볼 수 있다. .bashrc, .bashrc_profile 파일에 아래의 내용을 추가하고 파일을 다시 읽어 들이면 된다. export HISTTIMEFORMAT="%Y-%m-%d %T" # 히스토리 포맷 변경 export HISTSIZE=5000 # 메모리에 읽어 들이는 명령어의 개수 export HISTFILESIZE=10000 # 파일에 저장하는 명령어의 개수 1016 2018..
하이브의 tez 실행엔진을 이용할 때 아래의 옵션을 이용하면 실행의 각 단계에서 걸리는 시간을 확인할 수 있다. hive.tez.exec.print.summaryDefault Value: falseAdded In: Hive 0.14.0 with HIVE-8495If true, displays breakdown of execution steps for every query executed on Hive CLI or Beeline client. 옵션을 true 로 설정하고 쿼리를 실행하면 다음과 같이 실행의 각단계에서 걸리는 시간을 확인할 수 있다. 이때 각 단계에서 걸리는 시간을 이용하여 쿼리를 튜닝할 수 있다. Launching Job 1 out of 1 Status: Running (Executing ..
보통 윈도우에서 개발하고, 리눅스에서 우지를 실행하게 되는데윈도우 파일 포맷으로 저장한 파일을 리눅스에서 실행하려고 하면 아래와 같이 파일을 찾지 못하는 오류가 발생한다. /usr/bin/env: python : No such file or directory Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1] 또 파일 포맷의 이상일 때 다음과 같은 오류가 발생할 수도 있다. 윈도우의 줄바꿈은 CR+LF(/r/n)이고, 유닉스의 줄바꿈은 LF(/n)라서 오류가 발생한다. /bin/sh^M: bad interpreter: No such file or directory 이럴때 파일을 vi 로 열어..
hive를 이용하여 MR 작업 처리중 shuffle 과정에서, OutOfMemory 오류가 발생하면 다음과 같이 수정하면 된다. Error: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#12 at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134) at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:377) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessCo..
함수형 언어 함수형 언어는 함수형 프로그래밍의 패러다임을 따르는 프로그래밍 언어입니다. LISP, Clojure, Erlang 등이 있고, 최근에는 함수형 언어가 아닌 C#, Java같은 객체지향언어에서도 람다 함수의 도입을 통해 함수형 프로그래밍을 지원할 수 있도록 노력하고 있습니다. 함수형 프로그래밍 함수형 프로그래밍은 프로그래밍 패러다임의 하나로 자료 처리를 수학적 함수의 계산으로 취급하고 상태 변화와 가변 데이터를 피하는 것입니다. 순수 함수와 보조 함수의 조합을 이용해서 로직 내에 존재하는 조건문과 반복문을 제거하여 복잡성을 없애고, 변수의 사용을 억제하여 상태 변경을 피하고자 하는 패러다임입니다. 조건문과 반복문은 로직의 흐름을 이해하기 어렵게 하여 가독성을 해치고, 변수의 값은 누군가에 의해..
수들의 합2 문제는 투포인터 알고리즘을 이용하여 해결할 수 있다. s(start), e(end) 인덱스를 이용하여, start 로 배열을 증가하면서 sum을 증가시켜 M값과 동일하면 count를 증가하고 end를 증가하면서 sum 을 빼서 동일한 값이 있는지 확인한다. 배열 = {1 2 3 4 2 5 3 1 1 2}일때 start, end는 처음에 0번 인덱스 입니다. start를 증가하면서 1 + 2 + 3을 순서대로 해주면 sum은 6이 되어 M을 넘어서게 됩니다. 이때 end를 증가하면서 sum을 빼주면start가 2번 인덱스이고, end가 0번 인덱스인 시점에 합은 5가 됩니다. 이때 count를 1더해주면 됩니다. 이를 끝까지 반복해주면 됩니다.
파이썬에서 데이터를 입력받을 때 input()을 이용한다. input()을 이용하면 프롬프트를 이용한 입력을 받을 수 있고, 형변환이 되는 이점이 있다. 하지만 대량의 데이터를 반복적으로 입력받을 때 input()을 이용하지 않고, sys.stdin.readline() 을 이용하면 성능이 향상된다. 백준 1931 문제를 같은 코드로 입력 함수만 다르게 사용한 결과 아래와 같이 10배의 속도 향상(3928MS -> 336MS)을 얻을 수 있었다. 8954131h1931맞았습니다!!50344 KB336 MSPython 3 / 수정491 B41분 전8953912h1931맞았습니다!!50344 KB3928 MSPython 3 / 수정508 B1시간 전자바에서 Scanner를 이용한 입력보다 BufferedRea..
scala 2.11 버전에서 java 9으로 빌드시 다음의 오류가 발생하였다. [INFO] Compiling 3 source files to C:\ScalaSample\target\classes at 1528696267166[ERROR] error: scala.reflect.internal.MissingRequirementError: object java.lang.Object in compiler mirror not found.[ERROR] at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:17)[ERROR] at scala.reflect.internal.MissingRequirementError$..
스칼라(scala) 개발을 연습하기 위해서 이클립스에 스칼라 개발 환경을 설정하고, 빌드하여 jar 파일을 만드는 것까지 설정하는 방법을 정리해 보겠다. 우선 이클립스를 설치한다. 저는 가장 최신버전인 4.7 Oxygen 버전을 설치하였다. 그리고 Help -> Eclipse Market Place 에서 scala를 검색하여 Scala IDE 4.7.x 를 설치한다. 이 플러그인을 설치하면 스칼라 라이브러리도 설치된다. 설치후 File -> New -> Scala Project 를 선택하여 스칼라 프로젝트를 생성한다. 그리고 Scala Library container에서 오른쪽 버튼을 클릭하여 properties 로 들어가서 스칼라 라이브러리를 2.11로 변경한다. 현재 스파크의 스칼라 버전이 2.11이..
이클립스에서 메이븐을 이용하여 spark 에서 사용할 수 있는 scala 프로젝트를 빌드하는 방법은 다음과 같다. - 메이븐 pom.xml 설정의 디펜던시 추가 org.scala-lang scala-library ${ver.scala} org.apache.spark spark-core_${ver.scala.main} ${ver.spark} org.apache.spark spark-sql_${ver.scala.main} ${ver.spark} org.apache.spark spark-hive_${ver.scala.main} ${ver.spark} - 메이븐 pom.xml 의 빌드 설정 추가 net.alchim31.maven scala-maven-plugin 3.2.1 process-resources com..
wait 커맨드는 프로세스의 실행 종료를 대기하게 한다. 특정 프로세스를 대기하게 할 수도 있고, 전체 프로세스의 종료를 대기할 수도 있다. wait %Background ID # jobs 로 확인할 수 있는 백그라운드 번호로 대기wait PID # PID 번호의 프로세스 대기wait # 전체 서브 프로세스 종료 대기 #!/bin/bash a &b & c & waitecho "end" 위와 같이 스크립트를 작성해서 실행하면 a, b, c의 작업이 종료되고,"end"를 출력한다.
기본적으로 하이브는 데이터베이스의 이름을 변경하는 것은 지원하지 않는다. 따라서 메타스토어(metastore)의 테이블에 있는 하이브 테이블의 이름을 수정하면 된다. 메타스토어는 ID 기준으로 처리 되기 때문에 메타스토어의 이름을 변경하면 적용된다. 우선 하이브 메타스토어(metastore)에 mysql 로 접속한다. * 설정한 기준에 따라 다르게 접속하면된다. * 메타 스토어의 주소를 모르면 hive-site.xml 에 설정된 javax.jdo.option.ConnectionURL 정보를 확인한다. 하이브 DB를 보면 DBS 테이블이 DB 관련 정보이다. mysql> desc DBS;+-----------------+---------------+------+-----+---------+-------+|..
- Total
- Today
- Yesterday
- 하이브
- airflow
- 오류
- nodejs
- mysql
- hbase
- S3
- emr
- HIVE
- bash
- 알고리즘
- yarn
- Python
- 파이썬
- Hadoop
- 다이나믹
- build
- 백준
- error
- SPARK
- 하둡
- oozie
- HDFS
- AWS
- Tez
- SQL
- Linux
- java
- 정올
- ubuntu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |