data engineering

hadoop shell 관련.

qkqhxla1 2017. 6. 25. 23:28

oozie의 워크플로우위의 목록을 둘러보다 보면 쉘이 있다.

빨간색 네모다. 전에도 몇번 사용해본 일이 있고, echo 1;등의 명령어도 잘 먹길래 아! 이건 그냥 쉘이구나! 하고 생각해왔었다.


하이브에서 여러 쿼리를 실행시킬 일이 있었다. 중간의 한 부분만 특정 인자들로 바꿔주면 되어서, for loop에 대한 정보를 찾아봤었다. 그런데 구글에 나오는 기본적인 포문 예제들을 돌려봐도 에러가 떴었다. 고치다가 포기하고, 또 생각해보니 쿼리 자체가 복잡해서(join만 몇개가 걸려있는 쿼리) 예제 코드를 돌리더라도 거기에 포문을 적용시키기가 뭔가 두려웠다. 다른 방법을 찾았었다. 쉘에서 하이브 쿼리를 실행시키는 방법을 찾았다.

#!/bin/bash -x

hive -e 'select 1';

그럼 쿼리는 동일하고, 반복하는 부분만 쉘에서 변수로 대체해서 돌려주면 되는거 아냐??? 쉘 스크립트에서 반복문도 돌려봤겠다 해보자 하고 스크립트를 열심히 짜서 돌렸는데 또 뭔가가 안되었다. 쿼리의 결과를 파일로 써야 했는데, 아주 기본적으로 보이는 아래의 쉘 스크립트가 제대로 안 돌아갔다.

#!/bin/bash -x

echo "rara" > /user/xxxx/test.txt

책을 한번 보고 돌려보는거면 뭔가 더 알았겠지만 아직 책 한권도 안봐서... 뭐가 에러인지 잘 모르겠다. 

에러가 no such file or directory라고 떠서 겨우 이거 하나때문에 몇시간을 삽질했다. 분명히 쉘에서 >로 파일을 쓰면 파일이 없으면 새로 만들어서 내용을 써야되는데 왜 없다고 나오는거야?? 하고 포기했는데 집에서 누워있다가 갑자기 뭔가 떠올랐다.


쉘 이라고 써있지만 내가 생각하는 일반 쉘이 아니라 하둡 전용 쉘 아냐? 라는게 떠올라서 구글에서 검색해봤더니 맞았다...

그리고 아래의 좋은 명령어 사전이 있는 페이지를 발견하였다.

https://hadoop.apache.org/docs/r1.2.1/file_system_shell.html


하둡 전용 쉘?이란걸 알았으니 하나는 해결되었고 그 이후에 하이브에서 실행시킨 결과를 텍스트파일로 저장하는 방법은 구글링했더니 아주 간단하게 찾을수 있었다.

https://stackoverflow.com/questions/31107065/write-text-from-comand-line-into-hadoop


그리고 드디어 하둡 쉘에서 하이브 쿼리를 실행시킨후 그것을 파일에 저장하는걸 아래와 같은 쿼리로성공하였다.


hive -e "select 'hello world'" | hdfs dfs -put - /user/xxxx/test.txt;


위 쿼리를 만들면서 더 알아내야할점, 삽질한점.
1. 위의 스택오버플로우 링크에서는 하둡 쉘을 실행시킬때 hadoop fs로 했는데, 이건 deprecated라고 그랬었나? 그게 떠서 hdfs dfs로 바꿨다. deprecated된 명령어인가보다.

2. 쉘에 익숙하지 않아서 잊고 있었던건데.. "select 'hello world'"와 'select "hello world"'는 다르다. 이거때문에 또 삽질을 할 뻔했지만 다행히 빨리 깨달음. 하둡 쉘이지만 쉘인만큼 쉘의 성질을 그대로 가져온것 같다.

관련 링크 : https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash



추가.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli

를 보면 >가 되는것도 같긴 한데 나는 왜 안돼지...