Hadoop HDFS에서 디렉토리별 사용량 체크를 하는 방법

HDFS를 사용하다보면 directory 별로 디스크 사용량 체크가 필요하다. 아래와 같이 Permission denied 에러가 발생할것이다. 그 이유는 ROOT의 사용량 조회를 일반 유저 아이디로는 조회가 불가능하기 때문이다. 루트를 포함해 디스크 용량을 확인하기 위해서는 모든 키를 갖고 있는 HDFS 유저로 조회를 하면 된다.

du: Permission denied: user=icecream, access=READ_EXECUTE, inode="/user/hue/.Trash":hue:hue:drwx------

``` sudo -u hdfs hdfs dfs -du -s | sort -r -k 1 -g | awk '{ suffix="KMGT"; for(i=0; $1>1024 && i < length(suffix); i++) $1/=1024; print int($1) substr(suffix, i, 1), $3; }'

example

sudo -u hdfs hdfs dfs -du -s /data/* | sort -r -k 1 -g | awk '{ suffix="KMGT"; for(i=0; $1>1024 && i < length(suffix); i++) $1/=1024; print int($1) substr(suffix, i, 1), $3; }' ```

PySpark 에서 NoneType을 Filtering 하는 방법 (any, all, subset)

pyspark에서 drop method는 NULL을 가진 행을 제거하는데 가장 간단한 함수다. 기본적으로 NULL 값을 가진 행을 모두 제거를 한다. 모든 컬럼이 NULL인 경우 제거를 하고, 하나의 컬럼이 NULL인 경우 제거를 하고 싶은 경우가 있을것이다. 이런 경우에 어떻게 다르게 진행하는지 "any", "all"을 통해 설명

위 작업을 SQL에서 진행한다면 WHERE 절에 해당 컬림이 NULL인지 체크하는 구문을 넣어야 한다. 만약 모든 컬럼에 대해서 해야 하면? 모든 컬럼을 명시해야하는 단점이 있다. (SELECT * FROM TABLE WHERE COL1 IS NOT NULL)

  • drop 메소드에 인수
    • any: 모든 행의 컬럼값 중 하나라도 NULL의 값을 가지면 해당 행을 제거
    • all: 모든 컬럼 값이 NULL이거나 NaN인 경우에만 해당 행을 제거

위에서 보면 항상 "모든"이 조건이 된다. 하지만 drop 인자중에 subset을 이용하면 특정 컬럼에 대해서만 drop을 진행할 수 있다. 아래 소스코드 참고

소스코드

Pyspark NoneType, Null, Blank, Empty String 필터링 하는 방법

pyspark에서 NoneType, NULL, Blank, Empty String 등 사용지 않는 값을 필털이 하는 방법에 대해서 설명을 한다.

  • SQL로 진행하면 컬럼 하나 하나에 대해서 WHERE 절을 이용해서 필터링을 해야한다.
  • 하지만 spark에서 Condition을 생성하고, 해당 Condition을 filter() 함수의 인자로 넘겨주면, 동일한 조건으로 모든 컬럼에 적용이 가능하다.
  • 코드에서 살펴볼 내용
    • None, Null Empty String이 포함된 Row만 추출이 가능
    • None, Null, Empty String을 제외한 모든 Row만 추출도 가능
  • 코드 설명
    • 간단하게 각각 컬럼에 공통적으로 적용할 condition을 입력을 하고, map함수를 이용해 모든 컬럼에 적용을 한다.
    • 마지막에는 reduce함수를 이용해 condition을 모두 "&"(and) 또는 "|"(or) 로 연결하면 condition은 정의 완성
    • 정의된 condition을 filter함수에 넘기면 내가 원하는 Row만 추출이 가능하다.
    • Condition 예)Column<(((CODE IS NOT NULL) AND (NOT (CODE = ))) AND ((TYPE IS NOT NULL) AND (NOT (TYPE = ))))>

소스코드

Shell Script에서 외부 하이브 테이블 가져오는 방법

외부에서 하이브 테이블 가져오기

  1. (외부) 하이브 테이블 데이터 복사
  2. (내부) 하이브 테이블 생성
  3. (내부) 데이터 하이브 테이블로 로드(Load)

쉘(shell)에서 데이터를 덤프, 테이블 생성, 로드 까지 하는 방법

스크립트

  • 스크립트에서 첫번째로 hadoop distcp를 이용해서 데이터를 덤프해 오자.
  • cat을 이용해서 하이브 쿼리를 특정 디렉토리의 .hql을 생성
  • .hql의 파일을 hive -f를 통해서 실행

위 과정에서 Hive 쿼리를 직접 입력하지 않고, hql을 생성한 이유는 이후에 스크립트에서가 아닌 스크립트 내에 있는 여러 쿼리들 중에서 하나만 실행하고 싶을때 사용하면 좋다. 또한 cat을 이용하는 이유는 하이브 쿼리를 순수하게 그대로 사용이 가능하기 때문이다. 예를 들어 cat을 사용하지 않고 """로 여러 행을 입력하게 하기 위해서는 \를 개행하는 곳마다 입력을 해야 한다. 그렇게 되면 이후에 쿼리 날릴때 \를 또 수정해야 하는 문제가 있기 때문에 쉘에서 hive 쿼리를 실행할때는 cat을 이용해서 hql 파일을 생성하고 hql파일을 실행하는게 좋은것 같다.

Vi에 Tab, Space 를 표시하는 방법 (indentLine Plugin)

vi를 편집하다 보면, python과 같은 indentation을 brace 없이 하는 경우 어느곳이 space인지, tab인지 구분이 어렵다. 그래서 vi Plugin 을 사용하면 화면에 표시가 가능하다. 아래 github에서 설치해서 사용하면 좋음!

https://github.com/Yggdroot/indentLine

+ Recent posts