Skip to content

antony@notes:~/data-platform$ cat "Hadoop-實戰篇舊版.md"

Hadoop 實戰篇(舊版)

2022-05-15· data-platform ·資料科技平台

Hadoop 實戰篇(舊版)

先下載製作 myus20.04 Image 套件檔

在 Windows 系統的 cmd 視窗, 執行以下命令
$ ssh bigred@<m1 IP>

$ wget http://www.oc99.org/dt/hadoop/myus20.04.zip; unzip myus20.04.zip

$ cd ~/myus20.04; tree . 
.
├── Dockerfile # 這個就是等等要做的image。
├── bin
│   └── bash.append
├── buildimg.sh
└── ssh
    ├── authorized_keys #自動登入的憑證檔
    ├── id_rsa # 私鑰
    └── id_rsa.pub # 公鑰

在製作的過程中,會把binssh兩個目錄區裡面的內容放到光碟片裡面去,一個是bin裡面會有一段程式(bash.append),另一個是ssh裡面的私鑰(id_rsa)和自動登入的憑證檔(id_rsa.pub),代表用這個Dockerfile做出來的image,以後產生出來的container,他們之間用ssh命令互連,就可以不用打密碼了,因為大家的憑證都一模一樣,但是不用打密碼不代表真的沒密碼,只是因為憑證一樣,所以我們是安全的。


製作 myus20.04 Image

$ cat Dockerfile
FROM localhost/ubuntu:20.04 
# 因為先前手動還原光碟片,不是從Docker光片中心來的,所以前面要加"localhost"。
# 如果是Docker光片中心來的,前面的"localhost"就可以不用寫。

COPY bin/bash.append /tmp/ 
# 把"bin/"這個目錄裡面的bash.append檔案,拷貝到"/tmp/" 裡面。

RUN  mkdir -p /etc/skel/.ssh
# 在"/etc/skel/"裡面產生一個".ssh"目錄

COPY ssh/* /etc/skel/.ssh/ 
# 把剛剛ssh目錄裡面的3個檔案拷貝到/etc/skel/.ssh裡面。
# 在linux產生新的使用者,一定會有一個家目錄,而linux系統一定會把/etc/skel/裡面的所有資料,
  拷貝一份到新建的家目錄去。
# 先這樣做是因為等等的光碟片或系統,只要一有產生新的使用者,就會擁有我們先埋進去的憑證。 

ENV DEBIAN_FRONTEND noninteractive
# 在做光碟片(image)的時候,告訴image的過程,如果有一些命令它會有互動過程,
  也就是來問我們問題的,請它一概用內定自作業,像是apt-get install 安裝一堆系統套件或是系統更新,
  會有機會遇到它問你要不要按YES或是原來的東西要不要蓋掉,它會跟你互動,所以今天輸入這行,就是讓它
  自己用內定值,不要問我。
  
RUN apt-get update && apt-get install -y nano locales apt-utils elinks tree unzip curl 
    wget jq psmisc npm nfs-common && \
    apt-get install -y openssl netcat net-tools ssh zip sudo golang iputils-ping dnsutils 
    gettext-base && \ 
# 這行命令是先做系統套件的更新,再安裝nano、locales、apt-utils、elinks、tree...等,後面都會用到,
  所以要先安裝,特別注意有安裝nfs-common,代表等等做出來的光碟片,可以去mount nfs的共享資料夾。
# 最重要的是老師在image裡面還有安裝Open SSHserver
   
   mkdir /opt/bin /opt/www /opt/dataset /opt/mdb /mnt/sysbak && \ 
# /opt/bin 這個是放資料科技平台(Hadoop、kafka、Cassandra、Hbase...等)的program。
# /opt/www 只要我們有建資料科技平台的網站,網站的資料,網頁要下載的檔案,都會放在裡面。/
# /opt/dataset 這個目錄釋放要資料科技分析的資料檔。 
# /opt/mdb 這個目錄是放mariadb,sql命令的程序(script)檔會放在裡面,以後就不用慢慢打,在這裡
           可以直接一次跑完。 
# /mnt/sysbak 這個目錄是放K8S的yaml檔,pod會用的。  

   locale-gen en_US && locale-gen zh_TW.UTF-8 && locale-gen en_US.UTF-8 && 
   sudo passwd -dl root && \ 
# sudo passwd -dl root 是把root的密碼設成永久過期(冷凍),但是root的權限還是有在用。
# locale-gen en_US是標準英文語系。locale-gen zh_TW是繁體中文。等等這個光碟片做出來的pod,
  就可以處理英文跟繁體中文的編碼。
  locale-gen en_US.UTF-8 是萬國英文碼。
# 這一整段是讓等等這台ubuntu可以顯示和儲存的檔案內容可以有這些編碼的存在。

    sudo ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \ 
# Ubuntu內建實區是格林威治的時間,所以要把時區設在亞洲台北

# 以下命令會同時安裝 Python2 & Python3    
    apt-get install -y python3 python3-numpy python3-pandas python3-pip 
    python-is-python3 && \ 
#提供python2跟3給Spark程式來執行,因為Spark只跑Python語言。

    apt-get -y upgrade && apt-get autoremove -y && apt-get clean && rm -rf 
    /var/cache/apt/archives && \ 
# 把剛剛下載下來的一堆套件的暫存檔通通刪掉,因為不需要的檔案太多會造成image太大,所以通通刪掉,
  簡稱大掃除。

# 建立管理者帳號 bigred
groupadd bigboss && echo '%bigboss ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers && \ # 新增bigboss的群組,並讓這群組裡的使用者都有sudo的權限
cat /tmp/bash.append >> /etc/bash.bashrc && rm /tmp/bash.append && \ # 這個程式是執行重裝貝殼(bin/bash)時,
useradd -m -s /bin/bash bigred && echo 'bigred:bigred' | chpasswd && \
usermod -a -G bigboss bigred && chmod -R 700 /home/bigred/.ssh

RUN echo 'PermitUserEnvironment yes' >> /etc/ssh/sshd_config && \ #
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config && \
rm /etc/update-motd.d/* && echo "Ubuntu 20.04 LTS : IP `hostname -I`" >/etc/update-motd.d/00 && \
sudo chmod +x /etc/update-motd.d/00

USER bigred
WORKDIR /home/bigred/
CMD ["/bin/bash"]

$ cat Dockerfile
FROM localhost/myus20.04
ADD hadoop-2.10.1.tar.gz apache-hive-3.1.2-bin.tar.gz pig-0.17.0.tar.gz spark-3.0.1-bin-hadoop2.7.tgz /opt/ # ADD這個命令它會幫壓縮檔解壓縮,並且放到image裡面去
COPY parquet-pig-bundle-1.6.0.jar /opt/pig-0.17.0/lib/ # .jar是Java的打包檔
COPY mariadb-java-client-2.3.0.jar /opt/apache-hive-3.1.2-bin/lib
COPY hdp210/* /opt/hadoop-2.10.1/etc/hadoop/
COPY spk301/* /opt/spark-3.0.1-bin-hadoop2.7/conf/
COPY bin/* /opt/bin/
# 使用 ssh 執行命令, 會讀取 /etc/environment 這個設定檔
COPY ssh/environment /etc/environment # ssh登入到ssh server的時候,會觸發/etc/environment 這個檔案被執行一遍
COPY apt.temp /etc/apt/ # 給ubuntu(pod)的apt命令讀的

RUN sudo apt-get update && DEBIAN_FRONTEND=noninteractive sudo -E apt-get install -y mariadb-client nfs-common openjdk-8-jdk libisal-dev libsnappy-dev libz-dev && \ # openjdk-8-jdk 是Java的開發套件,安裝完才能跑JAVA語言
    DEBIAN_FRONTEND=noninteractive sudo -E apt-get -y upgrade && DEBIAN_FRONTEND=noninteractive sudo -E apt-get autoremove -y && \
    sudo apt-get clean && sudo rm -rf /var/cache/apt/archives && sudo chown -R root:root /opt && \
    mkdir -p /opt/dataset
CMD ["/bin/bash"]

手動建立 ubuntu 20.04 image
$ wget http://www.oc99.org/images/ubuntu.20.04.tar
# 因為Docker光片中心有做下載限制,所以老師先自行下載,並且把光碟變成tar檔,放在老師自己的網站。
$ sudo podman load < ubuntu.20.04.tar
# sduo podman = docker 。
# "docker load <" 的意思是把光碟片被分出去的tar檔還原回來。

$ cat buildimg.sh 
#!/bin/bash

Sudo podman rmi localhost/myus20.04 &>/dev/null
Echo "building myus20.04 image" && sudo podman build –no-cache –t myus20.04 .

Sudo podman save myus20.04 > myus20.04.tar
[ "$?" == "0" ] && echo "myus20.04.tar created"

$ ./buildimg.sh
...........
--> 8c6b5798596
Successfully tagged localhost/myus20.04:latest
8c6b5798596a346e894b3448b4298fe63326f95f28acfca37046e3fc9f112c7f
myus20.04.tar created
tags: 資料科技平台