antony@notes:~/data-platform$ cat "Hadoop-實戰篇舊版.md"
Hadoop 實戰篇(舊版)
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 # 公鑰在製作的過程中,會把bin跟ssh兩個目錄區裡面的內容放到光碟片裡面去,一個是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