2019년 1월 16일 수요일
IBM PowerAI Vision 사용법 demo : Image classification/object detection
IBM의 이미지 및 동영상을 위한 classification/object detection용 솔루션인 PowerAI Vision의 사용법을 정리했습니다.
먼저, image dataset에 대해 labeling을 해야 합니다. 이는 인터넷 상에서 쉽게 구할 수 있는 무료 tool인 labelimg, imageio 등을 이용하셔도 되고, 아예 처음부터 PowerAI Vision (이하 PAIV) 속에서 수행하셔도 됩니다. 아래의 예는 labelimg를 이용하여 사진 속의 object에 사각형을 그리고 labeling을 하는 장면입니다.
이런 식으로 labeling을 하면 그 결과가 해당 파일 하나마다 한개씩 xml 파일이 생성되어 저장됩니다. 이렇게 사진마다 labeling xml 파일이 생성되면 파일들을 PAIV에 upload할 준비가 된 것입니다. 이 사진 및 xml 파일들을 PAIV에 upload할 때 더 간편하게 할 수 있도록 아예 zip 파일로 묶어놓으면 더 좋습니다.
참고로 이 labeling xml 파일의 내용은 아래와 같습니다.
이제 web browser를 통해 PAIV에 접속하겠습니다. 기본 userid/passwd는 admin/passw0rd입니다. 접속하고나면 맨 먼저 'Data sets' 항목으로 갑니다. 기존에 다른 분들이 upload하신 dataset들이 있고 수지씨의 아름다운 사진도 보입니다만 한눈 팔지 마시고 우리는 'Create New Data Set'을 클릭합니다.
'Data Set Name'에 적절한 이름을 붙이십시요.
그러고나면 우리가 만든 fighter라는 dataset이 생성된 것을 보실 수 있습니다. 그러나 여기에는 아직 사진이 한장도 들어있지 않습니다. 이제 여기에 사진을 넣어야 합니다.
우리가 만든 fighter라는 dataset을 클릭하면 '파일을 여기에 끌어놓으라'는 메시지와 'Import files'라는 사각버튼이 보입니다. 여기서는 이 사각버튼을 눌러 보겠습니다.
이건 평범하게, 우리가 쓰고 있는 PC의 directory로부터 파일을 upload할 수 있는 메뉴를 불러옵니다. 여기서는 아까 zip으로 압축해놓았던 fighter.zip을 선택합니다.
이제 보면 fighter.zip 속에 들어있는 사진들과 xml 파일을 PAIV가 읽어들여 dataset으로 포맷한 것으로 보실 수 있습니다. 다만 사진들을 보면 작은 글씨로 f16, f15 등이 아까 우리가 labeling해놓은 대로 표시되어 있으나, 사진 위에는 큰 글씨로 'Uncategorized' 라고 분류된 것을 보실 수 있습니다. 이는 위에서 우리가 했던 label은 사진 속의 object에 붙여놓은 것이고, 사진 전체에 대해 f15, f16 등으로 분류하는 label을 붙여놓은 것은 아니기 때문입니다. 즉, 이 사진들은 classification을 위해서 label이 된 것이 아니라 object detection을 위해서 label이 된 것입니다.
여기서 잠깐 classification과 object detection을 구분하자면 아래와 같습니다.
Classification : 사진 1장 전체를 미리 지정한 category 중 어느 하나로 분류
Object detection : 사진 내에 미리 지정된 object에 해당하는 것이 있는지 감지하여 사각형으로 표시
우리의 dataset에는 크기 f15, f16, f14의 3가지 object들이 들어있습니다. 이것들을 모두 택하시고, 이제 'Train'이라는 사각버튼을 눌러 training에 들어가겠습니다.
Train 메뉴에서는 먼저 'Type of training'을 'Image classification'과 'Object detection' 둘 중 하나에서 선택해야 합니다. 물론 이 dataset labeling 특성에 맞게 우리는 'Object detection'을 택해야 합니다. ('Image classification'을 택하려면 먼저 사진의 labeling을 그에 맞게 해야 하는데, 그건 뒤에서 다시 보시겠습니다.) 이어서 그 아래의 'Model selection'을 해야 하는데, 여기서는 'Optimized for accuracy (faster R-CNN)'을 택했습니다.
그 아래의 'Advanced options' 메뉴는 max interation이나 learning rate 같은 hyperparameter를 지정하는 곳입니다. 여기서는 아무 수정 없이 그냥 train 하겠습니다. 아래의 'Train' 사각버튼을 누르면 train이 시작됩니다.
Train이 시작되면 이 과정이 얼마나 더 걸리는지가 대략 계산되어 display 됩니다.
그 아래 화면에서는 iteration이 진행됨에 따라 감소하는 loss graph가 display 됩니다.
Training이 완료되면 'Model details'와 'Deploy'의 2가지 사각버튼이 보입니다. 이 중 먼저 'Model details'를 클릭하겠습니다.
여기서는 train된 model에 대한 간단한 정보들이 display됩니다. Accuracy와 Precision, mAP 등이 무엇을 뜻하는지는 아래 URL을 참조하시기 바랍니다.
https://www.ibm.com/support/knowledgecenter/SSRU69_1.1.2/base/vision_metrics.html#vision_metrics__detection_gpu
이제 맨 위의 'Deploy model' 사각버튼을 눌러보겠습니다. 아래와 같이 model의 이름을 정하고 엔터를 누르면 'Deployed models'에 방금 생성한 model의 이름이 나타나게 됩니다.
우리가 방금 생성한 model 이름을 클릭해 봅니다. 그러면 이 모델이 Image classification을 위한 것인지 Object detection을 위한 것인지가 표시되면서, 외부에서 이 model을 불러쓸 수 있도록 API endpoint도 display됩니다. 여기서는 그 밑에 있는 'Tes Model' 메뉴에 별도의 사진을 넣어 제대로 object를 탐지하는지 시험해보겠습니다. 시험 방법은 간단합니다. 그냥 PC의 파일관리자에서 원하는 사진을 끌어다 'Drop files here'라고 쓰인 흰색 상자에 넣기만 하면 됩니다.
보셨다시피 training dataset에 사진이 몇장 없었기 때문에, 이 모델의 실제 정확도는 매우 낮습니다. 그래서 F14 전투기를 F16으로 분류하기도 합니다만, 겉으로 꽤 비슷해 보이는 F14와 F15를 훌륭하게 제대로 구분해서 보여주기도 합니다.
이번에는 처음에 만들었던 'fighter' dataset으로 되돌아가보겠습니다. 메뉴 화면 중에 'Augment data'라는 것이 보일 것입니다. 그걸 클릭해보면, blur/color/sharpen/rotate/crop/noise 등과 같은 기법을 통해 1장의 사진을 여러장으로 가공하여 사진 수를 늘리는 메뉴임을 아실 수 있습니다. 여기서는 blur와 color 빼고 모든 기법을 다 택하고 'Continue'를 눌러보겠습니다.
아래와 같이 새로 추가될 증강 dataset에 'fighter_augmented'라고 이름을 붙여주고나면, 그 이름으로 새로운 dataset이 추가된 것을 보실 수 있습니다. 그리고 그 속의 사진 개수는 원래 24장이던 것이 무려 528장으로 늘어나 있습니다. 이제 그 'fighter_augmented' dataset을 클릭해보겠습니다.
실제로 하나의 사진이 blur라든가 rotate 등의 기법으로 여러 장으로 복제된 것을 보실 수 있습니다. 이 528장의 사진을 가지고 이번에는 object detection이 아닌 classification을 수행해보도록 하겠습니다.
위의 사진들 중 f16에 해당하는 사진들을 click한 뒤, 사진 위의 메뉴 중 'Assign category'를 클릭하십시요. 그리고 거기에 category 이름을 f14, f15, f16 등으로 지정하면 됩니다.
이제 아래 dataset과 같이 각 사진마다 f14, f15, f16 중 하나의 category가 지정되었습니다. 이제 'Train model' 사각버튼을 눌러 train을 시작합니다.
'Type of training' 항목에서는 아까와는 달리 'Object detection' 대신 'Image Classification'을 선택합니다. 그 아래의 'Model selection'에서는 시스템에서 제공하는 기본 neural network인 'GoogleNet'을 선택합니다. 아직은 Caffe에서의 GoogleNet만 기본 지원되지만, 그 밑의 'Custom Model'을 선택하면 외부에서 가져온 tensorflow의 다른 neural network도 import 하여 사용할 수 있습니다.
그 밑의 'Advanced options'에서는 'Base model'을 선택하게 되어 있습니다. 대부분의 경우엔 'General'을 택하겠습니다만, 혹시 우리가 지금 train하려는 dataset이 PAIV에서 기본으로 제공되는 trained model인 '풍경, 얼굴, 자동차' 등에 해당하는 것이라면, 이 기본 model에 대해 추가 dataset으로 추가 train 하는 형태로 진행할 수 있습니다. 그 경우 더 높은 정확도를 얻을 수 있겠지요. 불행히도 우리는 여기서 전투기 사진을 사용하고 있으므로 해당 사항이 없고, 따라서 'General'을 택해야 합니다.
나머지 부분은 learning rate 등의 hyper parameter setting입니다. 여기서는 변경하지 않고 'Train' 사각버튼을 눌러 train을 시작합니다.
그 다음 부분은 위에서 한번 해본 object detection과 동일합니다. Model training이 끝나면 해당 model을 적당한 이름으로 save하고, 이어서 deploy하면 그 이름이 Deployed models 목록에 나타나는 것을 보실 수 있습니다.
방금 deploy한 'fighter_augmented_model_deployed'를 클릭하여 들어가보면, 아까의 object detection 모델과 같이 'API endpoint' 정보 등과 함께, 'Test Model' 메뉴가 나옵니다. 여기에 별도로 준비한 전투기 사진을 drag & drop으로 넣어서 제대로 classification을 하는지 보겠습니다.
이 classification model은 아까의 object detection model에 비해 (비록 실제로 다양한 사진을 넣은 것이 아니라 augmented dataset에 불과하지만) 훨씬 많은 dataset을 사용해서 train했기 때문인지, 아까의 object detection보다는 훨씬 더 나은 정확도를 보여줍니다. 비록 도중에 F14를 F16이라고 분류한 것이 있긴 합니다만, 전투기에 별 관심 없는 사람이라면 구별하기 힘든 F14와 F15를 매우 잘 분류하고 있습니다.
이번에는 PAIV가 자랑하는 특수 기능인 'Auto labeling'을 시도해보겠습니다. 이는 기존에 train해둔 model을 이용하여, 새로 추가된 dataset에 대해 object label을 자동으로 수행해주는 기능입니다. 많은 일손과 시간이 들어가는 label 수작업을 크게 줄여주는 고마운 기능입니다. 다만 이 기능에 대해서는 2가지를 염두에 두셔야 합니다.
1) Classification은 지원하지 않으며, Object detection을 위한 labeling만 지원합니다.
2) Auto labeling에 사용한 기존 model의 accuracy가 좋지 않으면, 당연히 auto labeling의 품질도 떨어집니다.
Auto labeling을 수행하기 위해, 먼저 추가의 전투기 사진들로 새로운 dataset 'more_fighters'를 만듭니다.
이제 메뉴 바 중의 'Auto label'을 클릭합니다. 그러면 아래와 같이 기존 deployed model 중에서 auto label에 사용할 model을 선택하게 되어 있습니다. 우리는 아까 만들어두었던 fighter_model1_deployed를 선택합니다.
이어서 'Auto label' 사각버튼을 누르면 auto label이 시작됩니다.
사진이 34장 밖에 안 되므로 auto label도 순식간에 끝납니다. 그러나, 기억하시다시피 우리가 사용한 'fighter_model1_deployed' model은 정확도가 별로 높지 않았습니다. 그래서인지, 34장의 사진 중 고작 10개의 object만 label했습니다.
그나마 아래와 같이 F14에 F16이라는 label을 붙여놓았습니다.
원래 어떤 model이라도 100% 정확할 수는 없으며, 따라서 auto label된 dataset은 결국 사람이 눈으로 검토하고 잘못된 label은 손으로 수정해야 합니다. 이제 위의 잘못 label된 것을 수정하겠습니다. 해당 사진을 클릭하면 아래와 같이 pop up 되는데, 여기서 나온 'Label objects' 사각버튼을 클릭합니다.
사진 오른쪽 위에 f16(1) X 라는 표시가 보입니다. 그 X 표시에 클릭하면 f16이라는 사각형으로 둘러싸인 label이 삭제됩니다.
이제 사진 오른쪽 위에 있는 f14(0) 이라는 표시를 선택한 뒤, 마우스를 전투기 사진 옆에서 click & drag 하여 사각형을 그려주면 이 전투기가 f14로 label됩니다.
이제 위쪽의 하얀 사각버튼 'Done editing'을 클릭하면 label 수정이 완료됩니다.
기존에 없던 object label을 이 메뉴에서 새로 추가하는 것도 가능합니다. 가령 아래 사진에는 F15와 F16 외에도, 머스탱(P51D) 프로펠러 전투기와 F22 스텔스 전투기도 보입니다. 이것들에 대해서는 아래와 같이 사진 오른쪽 위의 '+ Add New'를 클릭하여 즉석에서 새로운 label을 입력해주면 됩니다.
PowerAI Vision의 좀더 자세한 정식 manual은 아래 URL을 참조하세요.
https://www.ibm.com/support/knowledgecenter/en/SSRU69_1.1.2/navigation/welcome.html
2019년 1월 11일 금요일
GPFS Cluster에 새로 GPFS client node를 추가하는 절차
설치 시작하기 전에, GPFS 서버와 GPFS client 간에는 root user에서 passwd를 묻지 않고 ssh가 되도록 설정이 되어 있어야 합니다. 서로의 hostname을 인식하도록 양쪽의 /etc/hosts도 업데이트가 되어 있어야 하고요.
1) GPFS Client에서 작업할 내용
필요한 Spectrum Scale (GPFS) fileset들이 다 있는지 확인하십시요.
gpfs.base-4.2.*.deb
gpfs.gpl-4.2.*all.deb
gpfs.msg.en_US-4.2.*all.deb
gpfs.gskit-8.0.50.*.deb
gpfs.ext-4.2.*.deb (IBM Spectrum Scale Standard Edition and IBM Spectrum Scale Advanced Edition only)
이 파일셋들을 아래와 같은 명령으로 설치하십시요.
# dpkg -i gpfs.base*deb gpfs.gpl*deb gpfs.gskit*deb gpfs.msg*deb gpfs.ext*deb
작업상의 편의를 위해 PATH를 아래와 같이 설정하십시요.
# export PATH=/usr/lpp/mmfs/bin:$PATH
GPFS portability layer의 build를 위해 다음 명령을 수행하십시요. (이건 shell script이므로 필요시 약간 수정해도 됩니다만, 아마 수정하실 필요는 없을 것입니다.)
# mmbuildgpl
(이 mmbuildgpl 명령에 대해서 혹시 더 자세한 설명이나 절차가 필요하시면 이 URL 을 참조하세요.)
2) GPFS Server에서 작업할 내용
작업상의 편의를 위해 PATH를 아래와 같이 설정하십시요.
# export PATH=/usr/lpp/mmfs/bin:$PATH
GPFS client의 이름을 아래와 같이 넣어주십시요. GPFS client의 이름은 아마 infiniband의 interface로 되어 있을 것이고, 이미 /etc/hosts에 등록이 되어 있어야 합니다. 혹시 잘 모르실 때는 "mmlsnodeclass --all" 명령으로 기존의 다른 node name들을 보고 참조하시기 바랍니다.
# mmaddnode -N 'gpfs_client_nodename' (예: # mmaddnode -N COMPUTE-D02 )
3) GPFS Client에서 작업할 내용
그 다음에 추가된 node에서 GPFS의 SW license를 accept해야 합니다. 다음 명령을 수행하십시요.
# mmchlicense client --accept -N 'gpfs_client_nodename' (예: # mmaddnode -N COMPUTE-D02 )
(여기서는 GPFS Server의 전체 GPFS daemon은 이미 구동된 상태라고 가정합니다.)
이제 GPFS daemon을 구동합니다.
# mmstartup
아마도 기존 GPFS client에 mount되어야 할 GPFS filesystem은 automount=Yes로 되어 있었을 것이니, 별도의 조치 없이도 해당 GPFS filesystem은 mount될 것입니다. 약 10초 지난 뒤에 다음 명령으로 mount 되었는지 확인하십시요.
# df
기존의 GPFS client node에 대해 뭔가 config를 바꾼 것이 있을 수 있습니다. 기존의 client node (여기서는 기존 COMPUTE들 중 하나)의 구성과 비교하여, 혹시 새로 추가된 node의 attribute가 다른 점이 있다면 변경해주십시요.
먼저, 다음 명령으로 기존 속성을 확인하십시요. (이제 이 client node도 cluster에 join 했으므로 GPFS server에 가서 하지 않고 GPFS client node에서 하셔도 됩니다.)
# mmlsconfig
이떄 나오는 속성들 중에서, 대부분은 전체 cluster node들에게 동일하게 적용된 것들에는 아무 표시가 없지만, 일부 속성들 중에는 특정 node에만 적용되는 속성들이 몇 개 있을 수 있습니다. 그런 것들에는 대괄호 [ ] 가 옆에 붙으면서 대괄호 속에 그 해당 node name이 표시될 것입니다. 그것들을 찾으시면 됩니다.
가령 아래에서, maxblocksize는 전체 node가 다 동일한l 속성이지만, pagepool은 전체적으로는 1G로, COMPUTE-D01에 대해서만 512M 로 설정되어 있는 것입니다.
maxblocksize 1M
[common]
pagepool 1G
[COMPUTE-D01]
pagepool 512M
COMPUTE-D01에만 적용된 속성들을 위와 같이 찾아서, mmchconfig 명령으로 수정하십시요. 가령 pagepool을 COMPUTE-D02에 대해 512M으로 수정하는 명령은 아래와 같습니다.
# mmchconfig pagepool=512M -i -N COMPUTE-D02
위에서, -i 옵션은 그 수정 효과가 당장, 그리고 rebooting 후에도 유지되도록 표시하는 것입니다. 일부 속성 중에는 -i 옵션이 안 먹는 것도 있으니 그럴 경우는 -i를 빼고 적용하시면 됩니다.
속성 수정이 다 끝나면, GPFS client node에서, 아래 명령으로 GPFS daemon을 한번 내렸다가 다시 올려주시면 됩니다.
# mmshutdown
# mmstartup
마지막으로 다 제대로 mount 되었는지 다시 df 명령으로 확인하시면 됩니다.
혹시 위에 설명되지 않은 command 옵션 등에 대한 정보가 필요하시면 아래 link를 참조하시기 바랍니다.
https://www.ibm.com/support/knowledgecenter/en/STXKQY_4.2.3/com.ibm.spectrum.scale.v4r23.doc/bl1adm_command.htm
1) GPFS Client에서 작업할 내용
필요한 Spectrum Scale (GPFS) fileset들이 다 있는지 확인하십시요.
gpfs.base-4.2.*.deb
gpfs.gpl-4.2.*all.deb
gpfs.msg.en_US-4.2.*all.deb
gpfs.gskit-8.0.50.*.deb
gpfs.ext-4.2.*.deb (IBM Spectrum Scale Standard Edition and IBM Spectrum Scale Advanced Edition only)
이 파일셋들을 아래와 같은 명령으로 설치하십시요.
# dpkg -i gpfs.base*deb gpfs.gpl*deb gpfs.gskit*deb gpfs.msg*deb gpfs.ext*deb
작업상의 편의를 위해 PATH를 아래와 같이 설정하십시요.
# export PATH=/usr/lpp/mmfs/bin:$PATH
GPFS portability layer의 build를 위해 다음 명령을 수행하십시요. (이건 shell script이므로 필요시 약간 수정해도 됩니다만, 아마 수정하실 필요는 없을 것입니다.)
# mmbuildgpl
(이 mmbuildgpl 명령에 대해서 혹시 더 자세한 설명이나 절차가 필요하시면 이 URL 을 참조하세요.)
2) GPFS Server에서 작업할 내용
작업상의 편의를 위해 PATH를 아래와 같이 설정하십시요.
# export PATH=/usr/lpp/mmfs/bin:$PATH
GPFS client의 이름을 아래와 같이 넣어주십시요. GPFS client의 이름은 아마 infiniband의 interface로 되어 있을 것이고, 이미 /etc/hosts에 등록이 되어 있어야 합니다. 혹시 잘 모르실 때는 "mmlsnodeclass --all" 명령으로 기존의 다른 node name들을 보고 참조하시기 바랍니다.
# mmaddnode -N 'gpfs_client_nodename' (예: # mmaddnode -N COMPUTE-D02 )
3) GPFS Client에서 작업할 내용
그 다음에 추가된 node에서 GPFS의 SW license를 accept해야 합니다. 다음 명령을 수행하십시요.
# mmchlicense client --accept -N 'gpfs_client_nodename' (예: # mmaddnode -N COMPUTE-D02 )
(여기서는 GPFS Server의 전체 GPFS daemon은 이미 구동된 상태라고 가정합니다.)
이제 GPFS daemon을 구동합니다.
# mmstartup
아마도 기존 GPFS client에 mount되어야 할 GPFS filesystem은 automount=Yes로 되어 있었을 것이니, 별도의 조치 없이도 해당 GPFS filesystem은 mount될 것입니다. 약 10초 지난 뒤에 다음 명령으로 mount 되었는지 확인하십시요.
# df
기존의 GPFS client node에 대해 뭔가 config를 바꾼 것이 있을 수 있습니다. 기존의 client node (여기서는 기존 COMPUTE들 중 하나)의 구성과 비교하여, 혹시 새로 추가된 node의 attribute가 다른 점이 있다면 변경해주십시요.
먼저, 다음 명령으로 기존 속성을 확인하십시요. (이제 이 client node도 cluster에 join 했으므로 GPFS server에 가서 하지 않고 GPFS client node에서 하셔도 됩니다.)
# mmlsconfig
이떄 나오는 속성들 중에서, 대부분은 전체 cluster node들에게 동일하게 적용된 것들에는 아무 표시가 없지만, 일부 속성들 중에는 특정 node에만 적용되는 속성들이 몇 개 있을 수 있습니다. 그런 것들에는 대괄호 [ ] 가 옆에 붙으면서 대괄호 속에 그 해당 node name이 표시될 것입니다. 그것들을 찾으시면 됩니다.
가령 아래에서, maxblocksize는 전체 node가 다 동일한l 속성이지만, pagepool은 전체적으로는 1G로, COMPUTE-D01에 대해서만 512M 로 설정되어 있는 것입니다.
maxblocksize 1M
[common]
pagepool 1G
[COMPUTE-D01]
pagepool 512M
COMPUTE-D01에만 적용된 속성들을 위와 같이 찾아서, mmchconfig 명령으로 수정하십시요. 가령 pagepool을 COMPUTE-D02에 대해 512M으로 수정하는 명령은 아래와 같습니다.
# mmchconfig pagepool=512M -i -N COMPUTE-D02
위에서, -i 옵션은 그 수정 효과가 당장, 그리고 rebooting 후에도 유지되도록 표시하는 것입니다. 일부 속성 중에는 -i 옵션이 안 먹는 것도 있으니 그럴 경우는 -i를 빼고 적용하시면 됩니다.
속성 수정이 다 끝나면, GPFS client node에서, 아래 명령으로 GPFS daemon을 한번 내렸다가 다시 올려주시면 됩니다.
# mmshutdown
# mmstartup
마지막으로 다 제대로 mount 되었는지 다시 df 명령으로 확인하시면 됩니다.
혹시 위에 설명되지 않은 command 옵션 등에 대한 정보가 필요하시면 아래 link를 참조하시기 바랍니다.
https://www.ibm.com/support/knowledgecenter/en/STXKQY_4.2.3/com.ibm.spectrum.scale.v4r23.doc/bl1adm_command.htm
2019년 1월 9일 수요일
ppc64le Redhat 서버에서 x86 hadoop cluster에 대해 PyHive로 query 수행하기
지난 포스팅에 이어 이번에는 x86 hadoop cluster에 대해 ppc64le Redhat 서버에서 PyHive를 이용하여 query를 수행하는 방법을 정리했습니다.
이 방법의 장점은 ppc64le 서버에 hadoop이나 hive 등을 설치하지 않아도 된다는 것이고, 나쁜 점은 PyHive를 설치해야 한다는 점입니다. PyHive를 설치하기 위해서는 (언제나 그렇듯이) 인터넷이 연결되어 있거나 사내에 private repository가 구성되어 있어야 합니다.
먼저, PyHive 설치를 위해서 cyrus-sasl-devel을 yum 명령으로 설치합니다.
[bsyu@redhat74 ~]$ sudo yum install cyrus-sasl-devel
이걸 미리 설치하지 않으면 pip로 sasl 설치할 때 아래와 같은 error 발생하므로 꼭 설치하셔야 합니다.
sasl/saslwrapper.h:22:10: fatal error: sasl/sasl.h: No such file or directory
#include <sasl/sasl.h>
^~~~~~~~~~~~~
compilation terminated.
error: command 'gcc' failed with exit status 1
이어서 pip로 필요 python package들을 설치합니다.
[bsyu@redhat74 ~]$ pip install sasl thrift thrift-sasl PyHive
...
Installing collected packages: thrift-sasl, future, PyHive
Successfully installed sasl-0.2.1 PyHive-0.6.1 future-0.17.1 thrift-sasl-0.3.0
이제 python(여기서는 python2를 씁니다)으로 다음과 같이 pyhive로 query를 날려봅니다. (여기서 10.10.14.71이 hive 서버입니다.)
[bsyu@redhat74 ~]$ python
Python 2.7.15 |Anaconda, Inc.| (default, May 1 2018, 23:32:32)
[GCC 7.2.0] on linux2
>>> from pyhive import hive
>>> conn = hive.Connection(host="10.10.14.71", port=10000, username="hive", database="default")
>>> cursor = conn.cursor()
>>> cursor.execute("SELECT * FROM pokes")
>>> cursor.fetchall()
[(u'1 ', u'"i love donut"'), (u'2 ', u'you love pretzel'), (u'3 ', u'"she loves bagel"'), (u'1 ', u'"i love donut"'), (u'2 ', u'you love pretzel'), (u'3 ', u'"she loves bagel"'), (u'1 ', u'"i love donut"'), (u'2 ', u'you love pretzel'), (u'3 ', u'"she loves bagel"')]
지난번 포스팅의 hive나 beeline에서처럼 예쁘게 정리되어 나오지는 않지만 분명히 제대로 data를 다 가져오는 것을 보실 수 있습니다.
그런데 문제가 하나 있습니다. 원래 이 PyHive는 python2만 지원합니다. 그래서 python3를 사용하셔야 하는 경우 다음과 같은 error가 발생하게 됩니다.
>>> cursor.execute("select * from pokes", conn)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/bsyu/anaconda3/lib/python3.7/site-packages/pyhive/hive.py", line 354, in execute
sql = operation % _escaper.escape_args(parameters)
File "/home/bsyu/anaconda3/lib/python3.7/site-packages/pyhive/common.py", line 210, in escape_args
raise exc.ProgrammingError("Unsupported param format: {}".format(parameters))
pyhive.exc.ProgrammingError: Unsupported param format: <pyhive.hive.Connection object at 0x3fff7dc86630>
이걸 해결하는 방법이 또 있습니다 ! 아래 URL에 나온 방법입니다만, x86 Cloudera cluster의 hive 서버의 hive-site.xml에 다음과 같이 NOSASL property를 추가하면 됩니다.
https://community.hortonworks.com/questions/107481/how-to-enable-a-pyhive-connection-with-python-35-s.html
[root@powervc131 ~]# vi /etc/hive/conf.dist/hive-site.xml
...
<property>
<name>hive.server2.authentication</name>
<value>NOSASL</value>
</property>
이걸 수정하고 나서 x86 Cloudera cluster를 재구동하거나 할 필요는 없고, 단지 ppc64le 서버에서 python 세션만 다시 시작하시면 됩니다. 다음과 같이 python3에서도 data를 잘 가져오는 것을 보실 수 있습니다.
[bsyu@redhat74 files]$ python
Python 3.7.0 (default, Jun 28 2018, 13:02:24)
[GCC 7.2.0] :: Anaconda, Inc. on linux
>>> from pyhive import hive
>>> conn = hive.Connection(host="10.10.14.71", port=10000, username="hive", database="default")
>>> cursor = conn.cursor()
>>> cursor.execute("SELECT * FROM pokes")
>>> cursor.fetchall()
[('1 ', '"i love donut"'), ('2 ', 'you love pretzel'), ('3 ', '"she loves bagel"'), ('1 ', '"i love donut"'), ('2 ', 'you love pretzel'), ('3 ', '"she loves bagel"'), ('1 ', '"i love donut"'), ('2 ', 'you love pretzel'), ('3 ', '"she loves bagel"')]
이 방법의 장점은 ppc64le 서버에 hadoop이나 hive 등을 설치하지 않아도 된다는 것이고, 나쁜 점은 PyHive를 설치해야 한다는 점입니다. PyHive를 설치하기 위해서는 (언제나 그렇듯이) 인터넷이 연결되어 있거나 사내에 private repository가 구성되어 있어야 합니다.
먼저, PyHive 설치를 위해서 cyrus-sasl-devel을 yum 명령으로 설치합니다.
[bsyu@redhat74 ~]$ sudo yum install cyrus-sasl-devel
이걸 미리 설치하지 않으면 pip로 sasl 설치할 때 아래와 같은 error 발생하므로 꼭 설치하셔야 합니다.
sasl/saslwrapper.h:22:10: fatal error: sasl/sasl.h: No such file or directory
#include <sasl/sasl.h>
^~~~~~~~~~~~~
compilation terminated.
error: command 'gcc' failed with exit status 1
이어서 pip로 필요 python package들을 설치합니다.
[bsyu@redhat74 ~]$ pip install sasl thrift thrift-sasl PyHive
...
Installing collected packages: thrift-sasl, future, PyHive
Successfully installed sasl-0.2.1 PyHive-0.6.1 future-0.17.1 thrift-sasl-0.3.0
이제 python(여기서는 python2를 씁니다)으로 다음과 같이 pyhive로 query를 날려봅니다. (여기서 10.10.14.71이 hive 서버입니다.)
[bsyu@redhat74 ~]$ python
Python 2.7.15 |Anaconda, Inc.| (default, May 1 2018, 23:32:32)
[GCC 7.2.0] on linux2
>>> from pyhive import hive
>>> conn = hive.Connection(host="10.10.14.71", port=10000, username="hive", database="default")
>>> cursor = conn.cursor()
>>> cursor.execute("SELECT * FROM pokes")
>>> cursor.fetchall()
[(u'1 ', u'"i love donut"'), (u'2 ', u'you love pretzel'), (u'3 ', u'"she loves bagel"'), (u'1 ', u'"i love donut"'), (u'2 ', u'you love pretzel'), (u'3 ', u'"she loves bagel"'), (u'1 ', u'"i love donut"'), (u'2 ', u'you love pretzel'), (u'3 ', u'"she loves bagel"')]
지난번 포스팅의 hive나 beeline에서처럼 예쁘게 정리되어 나오지는 않지만 분명히 제대로 data를 다 가져오는 것을 보실 수 있습니다.
그런데 문제가 하나 있습니다. 원래 이 PyHive는 python2만 지원합니다. 그래서 python3를 사용하셔야 하는 경우 다음과 같은 error가 발생하게 됩니다.
>>> cursor.execute("select * from pokes", conn)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/bsyu/anaconda3/lib/python3.7/site-packages/pyhive/hive.py", line 354, in execute
sql = operation % _escaper.escape_args(parameters)
File "/home/bsyu/anaconda3/lib/python3.7/site-packages/pyhive/common.py", line 210, in escape_args
raise exc.ProgrammingError("Unsupported param format: {}".format(parameters))
pyhive.exc.ProgrammingError: Unsupported param format: <pyhive.hive.Connection object at 0x3fff7dc86630>
이걸 해결하는 방법이 또 있습니다 ! 아래 URL에 나온 방법입니다만, x86 Cloudera cluster의 hive 서버의 hive-site.xml에 다음과 같이 NOSASL property를 추가하면 됩니다.
https://community.hortonworks.com/questions/107481/how-to-enable-a-pyhive-connection-with-python-35-s.html
[root@powervc131 ~]# vi /etc/hive/conf.dist/hive-site.xml
...
<property>
<name>hive.server2.authentication</name>
<value>NOSASL</value>
</property>
이걸 수정하고 나서 x86 Cloudera cluster를 재구동하거나 할 필요는 없고, 단지 ppc64le 서버에서 python 세션만 다시 시작하시면 됩니다. 다음과 같이 python3에서도 data를 잘 가져오는 것을 보실 수 있습니다.
[bsyu@redhat74 files]$ python
Python 3.7.0 (default, Jun 28 2018, 13:02:24)
[GCC 7.2.0] :: Anaconda, Inc. on linux
>>> from pyhive import hive
>>> conn = hive.Connection(host="10.10.14.71", port=10000, username="hive", database="default")
>>> cursor = conn.cursor()
>>> cursor.execute("SELECT * FROM pokes")
>>> cursor.fetchall()
[('1 ', '"i love donut"'), ('2 ', 'you love pretzel'), ('3 ', '"she loves bagel"'), ('1 ', '"i love donut"'), ('2 ', 'you love pretzel'), ('3 ', '"she loves bagel"'), ('1 ', '"i love donut"'), ('2 ', 'you love pretzel'), ('3 ', '"she loves bagel"')]
ppc64le Redhat 서버에서 x86 hadoop cluster에 대해 hive로 query 수행하기
POWER9 CPU와 V100 GPU를 장착한 AC922 서버를 deep learning 용도로 사용하는 환경에서, training에 필요한 dataset은 x86 Cloudera hadoop cluster로부터 가져와야 할 필요가 있을 수 있습니다.
그런 경우, 방법은 크게 2가지가 있습니다. 하나는 그냥 hadoop 본연의 기능을 이용하는 것이고, 나머지 하나는 PyHive를 이용하는 것입니다. 이 포스팅에서는 hadoop 본연의 기능을 이용하는 방법을 먼저 다루겠습니다. Pyhive를 이용하는 방법은 다음 posting에서 정리하겠습니다.
Hadoop 본연의 기능을 이용하려면 (당연히) ppc64le에 hadoop과 hive를 설치해야 합니다. 여기서는 접근해야 하는 x86 hadoop cluster에 Cloudera 5.14가 설치되어 있다고 가정하겠습니다. CDH 5.14에는 hadoop 2.6.0과 hive 1.10이 들어있습니다.
먼저, ppc64le용 hadoop과 hive를 source로부터 build 합니다. 이 포스팅에 올려놓은 것처럼 source에서 직접 build하셔도 되고, 제가 미리 build해놓은 것을 download 받아 적절한 directory에 풀어놓기만 해도 됩니다. 제가 build 해놓은 것은 아래 ink의 Google drive에 올려놓았습니다.
hadoop-2.6.5.tar.gz : https://drive.google.com/open?id=12B1e6mBLBOOUW6oajwDMYTUap6iUIHEG
apache-hive-1.1.1-bin.tar.gz : https://drive.google.com/open?id=1Qg-fxWXFoqzwcXEjvXpL2sb9Tk9lssg-
위에서 내려받은 tar.gz을 아래와 같이 적절한 directory에 풀어주면 설치는 끝납니다.
여기서는 /home/hadoop-2.6.5 가 HADOOP_HOME이, 그리고 /home/apache-hive-1.1.1-bin 이 HIVE_HOME 이 됩니다.
[redhat74] root:/root> sudo tar -zxf /home/bsyu/files/hadoop-2.6.5-src/hadoop-dist/target/hadoop-2.6.5.tar.gz -C /home
[redhat74] root:/root> sudo tar -zxf /home/bsyu/files/hive-release-1.1.1/packaging/target/apache-hive-1.1.1-bin.tar.gz -C /home
그리고 다음과 같이 JAVA_HOME과 PATH를 환경에 맞게 설정해줘야 합니다.
[redhat74] root:/root> export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.ppc64le
[redhat74] root:/root> export PATH=/home/apache-hive-1.1.1-bin/bin:/home/hadoop-2.6.5/bin:$PATH
그 다음으로 할 일은 접근해야 하는 x86 Cloudera cluster의 namenode로부터 주요 xml 구성 파일들을 그대로 copy해오는 것입니다. 특히 아래 2개를 해오셔야 합니다. 그 내용은 전혀 바꾸지 않아도 됩니다. 이러면 이 ppc64le 서버는 x86 Cloudera cluster의 slave도 아니면서 그 HDFS 및 Hive에 접근할 수 있는 것입니다. 물론 이 서버들 간에는 해당 user가 password를 답하지 않고서도 ssh를 할 수 있도록 ~/.ssh/authorized_keys 등을 미리 구성해놓아야 합니다.
(아래에서 10.10.14.71이 x86 Cloudera cluster의 namenode이자 hive 서버입니다.)
[redhat74] root:/root> scp 10.10.14.71:/etc/hadoop/conf.cloudera.yarn/*.xml /home/hadoop-2.6.5/etc/hadoop
[redhat74] root:/root> scp 10.10.14.71:/etc/hive/conf/*.xml /home/apache-hive-1.1.1-bin/conf
이제 ppc64le 서버에서 hadoop 명령을 내려보면 x86 Cloudera cluster의 HDFS의 file에 접근이 가능합니다.
[redhat74] root:/root> hadoop fs -df
Filesystem Size Used Available Use%
hdfs://powervc131:8020 871687405568 620453786 778279674022 0%
[redhat74] root:/root> hadoop fs -ls /user/hive/warehouse
Found 1 items
drwxrwxrwt - anonymous hive 0 2019-01-09 14:48 /user/hive/warehouse/pokes
이제 hive로 x86 Cloudera cluster를 향해 query를 날려보겠습니다. 먼저 다음과 같이 환경변수를 설정합니다. 이걸 해주지 않으면 이 stackoverflow에서 언급된 "Found class jline.Terminal, but interface was expected" error를 만나게 됩니다. ( https://stackoverflow.com/questions/28997441/hive-startup-error-terminal-initialization-failed-falling-back-to-unsupporte )
[redhat74] root:/root> export HADOOP_USER_CLASSPATH_FIRST=true
그 다음에 hive를 구동하여, 마치 AC922 서버가 x86 Cloudera cluster의 일원인 것처럼 자연스럽게 원하는 query를 날리시면 됩니다. 아래와 같이, x86 Cloudera 속에 들어있던 pokes라는 table의 data가 그대로 잘 나오는 것을 보실 수 있습니다.
[redhat74] root:/root> hive
...
hive> select * from pokes;
OK
1 "i love donut"
2 you love pretzel
3 "she loves bagel"
1 "i love donut"
2 you love pretzel
3 "she loves bagel"
1 "i love donut"
2 you love pretzel
3 "she loves bagel"
Time taken: 2.19 seconds, Fetched: 9 row(s)
다른 방법을 쓸 수도 있습니다. 이는 HiveServer2를 이용하는 방법인데, CDH 5.14에서는 HiveServer2가 default로 구동되니까 x86 Cloudera cluster에서 별도로 구성을 해주실 것은 없을 겁니다. 위에서 설치한 hive에 포함된 beeline을 이용하여 HiveServer2에 접속할 수 있습니다. 다만 이때는 접속하는 서버를 아래와 같이 -u 옵션으로 지정하셔야 합니다.
[redhat74] root:/root> beeline -u jdbc:hive2://10.10.14.71:10000
scan complete in 2ms
...
Beeline version 1.1.1 by Apache Hive
0: jdbc:hive2://10.10.14.71:10000> select * from pokes;
...
INFO : OK
+------------+--------------------+--+
| pokes.foo | pokes.bar |
+------------+--------------------+--+
| 1 | "i love donut" |
| 2 | you love pretzel |
| 3 | "she loves bagel" |
| 1 | "i love donut" |
| 2 | you love pretzel |
| 3 | "she loves bagel" |
| 1 | "i love donut" |
| 2 | you love pretzel |
| 3 | "she loves bagel" |
+------------+--------------------+--+
9 rows selected (0.565 seconds)
그런 경우, 방법은 크게 2가지가 있습니다. 하나는 그냥 hadoop 본연의 기능을 이용하는 것이고, 나머지 하나는 PyHive를 이용하는 것입니다. 이 포스팅에서는 hadoop 본연의 기능을 이용하는 방법을 먼저 다루겠습니다. Pyhive를 이용하는 방법은 다음 posting에서 정리하겠습니다.
Hadoop 본연의 기능을 이용하려면 (당연히) ppc64le에 hadoop과 hive를 설치해야 합니다. 여기서는 접근해야 하는 x86 hadoop cluster에 Cloudera 5.14가 설치되어 있다고 가정하겠습니다. CDH 5.14에는 hadoop 2.6.0과 hive 1.10이 들어있습니다.
먼저, ppc64le용 hadoop과 hive를 source로부터 build 합니다. 이 포스팅에 올려놓은 것처럼 source에서 직접 build하셔도 되고, 제가 미리 build해놓은 것을 download 받아 적절한 directory에 풀어놓기만 해도 됩니다. 제가 build 해놓은 것은 아래 ink의 Google drive에 올려놓았습니다.
hadoop-2.6.5.tar.gz : https://drive.google.com/open?id=12B1e6mBLBOOUW6oajwDMYTUap6iUIHEG
apache-hive-1.1.1-bin.tar.gz : https://drive.google.com/open?id=1Qg-fxWXFoqzwcXEjvXpL2sb9Tk9lssg-
위에서 내려받은 tar.gz을 아래와 같이 적절한 directory에 풀어주면 설치는 끝납니다.
여기서는 /home/hadoop-2.6.5 가 HADOOP_HOME이, 그리고 /home/apache-hive-1.1.1-bin 이 HIVE_HOME 이 됩니다.
[redhat74] root:/root> sudo tar -zxf /home/bsyu/files/hadoop-2.6.5-src/hadoop-dist/target/hadoop-2.6.5.tar.gz -C /home
[redhat74] root:/root> sudo tar -zxf /home/bsyu/files/hive-release-1.1.1/packaging/target/apache-hive-1.1.1-bin.tar.gz -C /home
그리고 다음과 같이 JAVA_HOME과 PATH를 환경에 맞게 설정해줘야 합니다.
[redhat74] root:/root> export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.ppc64le
[redhat74] root:/root> export PATH=/home/apache-hive-1.1.1-bin/bin:/home/hadoop-2.6.5/bin:$PATH
그 다음으로 할 일은 접근해야 하는 x86 Cloudera cluster의 namenode로부터 주요 xml 구성 파일들을 그대로 copy해오는 것입니다. 특히 아래 2개를 해오셔야 합니다. 그 내용은 전혀 바꾸지 않아도 됩니다. 이러면 이 ppc64le 서버는 x86 Cloudera cluster의 slave도 아니면서 그 HDFS 및 Hive에 접근할 수 있는 것입니다. 물론 이 서버들 간에는 해당 user가 password를 답하지 않고서도 ssh를 할 수 있도록 ~/.ssh/authorized_keys 등을 미리 구성해놓아야 합니다.
(아래에서 10.10.14.71이 x86 Cloudera cluster의 namenode이자 hive 서버입니다.)
[redhat74] root:/root> scp 10.10.14.71:/etc/hadoop/conf.cloudera.yarn/*.xml /home/hadoop-2.6.5/etc/hadoop
[redhat74] root:/root> scp 10.10.14.71:/etc/hive/conf/*.xml /home/apache-hive-1.1.1-bin/conf
이제 ppc64le 서버에서 hadoop 명령을 내려보면 x86 Cloudera cluster의 HDFS의 file에 접근이 가능합니다.
[redhat74] root:/root> hadoop fs -df
Filesystem Size Used Available Use%
hdfs://powervc131:8020 871687405568 620453786 778279674022 0%
[redhat74] root:/root> hadoop fs -ls /user/hive/warehouse
Found 1 items
drwxrwxrwt - anonymous hive 0 2019-01-09 14:48 /user/hive/warehouse/pokes
이제 hive로 x86 Cloudera cluster를 향해 query를 날려보겠습니다. 먼저 다음과 같이 환경변수를 설정합니다. 이걸 해주지 않으면 이 stackoverflow에서 언급된 "Found class jline.Terminal, but interface was expected" error를 만나게 됩니다. ( https://stackoverflow.com/questions/28997441/hive-startup-error-terminal-initialization-failed-falling-back-to-unsupporte )
[redhat74] root:/root> export HADOOP_USER_CLASSPATH_FIRST=true
그 다음에 hive를 구동하여, 마치 AC922 서버가 x86 Cloudera cluster의 일원인 것처럼 자연스럽게 원하는 query를 날리시면 됩니다. 아래와 같이, x86 Cloudera 속에 들어있던 pokes라는 table의 data가 그대로 잘 나오는 것을 보실 수 있습니다.
[redhat74] root:/root> hive
...
hive> select * from pokes;
OK
1 "i love donut"
2 you love pretzel
3 "she loves bagel"
1 "i love donut"
2 you love pretzel
3 "she loves bagel"
1 "i love donut"
2 you love pretzel
3 "she loves bagel"
Time taken: 2.19 seconds, Fetched: 9 row(s)
(좋아, 자연스러웠어 !)
다른 방법을 쓸 수도 있습니다. 이는 HiveServer2를 이용하는 방법인데, CDH 5.14에서는 HiveServer2가 default로 구동되니까 x86 Cloudera cluster에서 별도로 구성을 해주실 것은 없을 겁니다. 위에서 설치한 hive에 포함된 beeline을 이용하여 HiveServer2에 접속할 수 있습니다. 다만 이때는 접속하는 서버를 아래와 같이 -u 옵션으로 지정하셔야 합니다.
[redhat74] root:/root> beeline -u jdbc:hive2://10.10.14.71:10000
scan complete in 2ms
...
Beeline version 1.1.1 by Apache Hive
0: jdbc:hive2://10.10.14.71:10000> select * from pokes;
...
INFO : OK
+------------+--------------------+--+
| pokes.foo | pokes.bar |
+------------+--------------------+--+
| 1 | "i love donut" |
| 2 | you love pretzel |
| 3 | "she loves bagel" |
| 1 | "i love donut" |
| 2 | you love pretzel |
| 3 | "she loves bagel" |
| 1 | "i love donut" |
| 2 | you love pretzel |
| 3 | "she loves bagel" |
+------------+--------------------+--+
9 rows selected (0.565 seconds)
Redhat ppc64le 상에서의 hadoop 및 hive 설치
HortonWorks (HDP)를 사용하는 것이 정식이겠습니다만, 여기서는 source로부터 build하는 방법을 다루겠습니다.
먼저 다음과 같이 maven 등 필요 OS package들을 yum으로 설치합니다.
[bsyu@centos01 files]$ sudo yum install maven protobuf-compiler zlib-devel snappy-devel pkgconfig autoconf automake libtool
이어서 JAVA_HOME 등 환경변수를 설정합니다.
[bsyu@centos01 files]$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.ppc64le
[bsyu@centos01 files]$ export MAVEN_OPTS="-Xmx2048m"
# hadoop build
여기서는 hadoop 2.6.5를 build 하겠습니다. 그 source를 가져오고 압축을 해제합니다.
[bsyu@centos01 files]$ wget https://archive.apache.org/dist/hadoop/common/hadoop-2.6.5/hadoop-2.6.5-src.tar.gz
[bsyu@centos01 files]$ tar -zxf hadoop-2.6.5-src.tar.gz
[bsyu@centos01 files]$ cd hadoop-2.6.5-src/
Maven으로 build하는 명령은 아래와 같이 매우 간단합니다.
[bsyu@centos01 hadoop-2.6.0-src]$ mvn package -Pdist -DskipTests -Dtar -Dmaven.javadoc.skip=true
(원래 hadoop 2.6은 java 버전 7에서 지원되던 것입니다. 그래서 java 8 환경에서는 -Dmaven.javadoc.skip=true를 붙이지 않으면 javadoc 관련하여 error가 나는 부분이 있으니 꼭 붙이시기 바랍니다.)
이렇게 생성된 hadoop-2.6.5.tar.gz을 적당한 directory에 풀어놓으면 설치는 끝납니다. 여기서는 /home/hadoop-2.6.5 가 HADOOP_HOME 이 됩니다.
[bsyu@centos01 ~]$ sudo tar -zxf /home/bsyu/files/hadoop-2.6.5-src/hadoop-dist/target/hadoop-2.6.5.tar.gz -C /home
# hive build
여기서는 hive 1.1,1을 build 하겠습니다. 그 source를 가져오고 압축을 해제합니다.
[bsyu@centos01 files]$ wget https://github.com/apache/hive/archive/release-1.1.1.tar.gz
[bsyu@centos01 files]$ tar -zxf release-1.1.1.tar.gz
[bsyu@centos01 files]$ cd hive-release-1.1.1
다음과 같이 hadoop class를 지정해주고, 특히 hadoop v2 환경에서 사용할 것임을 지정하는 -Phadoop-2를 붙여서 maven으로 build 해주면 됩니다.
[bsyu@centos01 hive-release-1.1.1]$ mvn package -Pdist -Phadoop-2 -DskipTests -Dtar -Dmaven.javadoc.skip=true
...
[INFO] Building tar: /home/bsyu/files/hive-release-1.1.1/packaging/target/apache-hive-1.1.1-bin.tar.gz
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:10.367s
[INFO] Finished at: Wed Jan 09 11:27:01 KST 2019
[INFO] Final Memory: 179M/897M
[INFO] ------------------------------------------------------------------------
이렇게 생성된 apache-hive-1.1.1-bin.tar.gz을 적당한 directory에 풀어놓으면 설치는 끝납니다. 여기서는 /home/apache-hive-1.1.1-bin 이 HIVE_HOME 이 됩니다.
[bsyu@centos01 ~]$ sudo tar -zxf /home/bsyu/files/hive-release-1.1.1/packaging/target/apache-hive-1.1.1-bin.tar.gz -C /home
위에서 build한 hadoop-2.6.5.tar.gz 과 apache-hive-1.1.1-bin.tar.gz 를 Google drive에 올려놓았습니다.
피드 구독하기:
글 (Atom)