docker 安裝hadoop2.8.5和spark2.4.0

win7 + docker+ubuntu+java-1.8+hadoop-2.8.5+spark-2.4.0

win7系統下,docker的安裝,本人是利用Docker Toolbox進行安裝

參考博客:https://blog.csdn.net/xiangxiezhuren/article/details/79698913

下載地址https://docs.docker.com/toolbox/overview/

安裝過程中,需要選擇的方框都打勾即可,

安裝完成後桌面會有三個快捷方式

1.Docker Quickstart Terminal:docker快速啓動終端

2.Kitematic:進行鏡像的管理 [其中,LOGIN是註冊、登錄Docker,需要連接外網進行註冊]

 

進入docker終端,執行docker pull ubuntu,下載ubuntu鏡像

docker images

docker ps -a 查看所有鏡像

獲取所有容器ip地址 docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

更改tag:docker tag <images id>  <images name>:<tag>

                              e.g. docker tag 569dd6d0e296 ubuntu : 16.02

執行docker run -it ubuntu:16.02後,會生成一個新的容器【注意:每執行一次該命令,就會有新的容器被創建】

若想執行原來已創建的容器,需要首先執行:docker ps -a 查看容器對應id

然後執行

                          docker container start 569dd6d0e296

                      -->docker attach 569dd6d0e296,隨後即進入指定版本的ubuntu創建的容器(linux系統中)

如圖所示

對於新手會發現,創建的ubuntu無法使用vim編輯器,且執行apt-get install vim會報錯

對於docker創建的ubuntu需要先執行 apt-get update【類似於更新系統,獲取可下載的package】

然後執行apt-get install vim就可以正常下載了

類似的可以下載nano編輯器

vim常用命令:

o----下一行輸入

i-----光標處輸入

G---最後一行

上下左右--kjhl

刪除x

多行刪除
    首先在命令模式下,輸入“:set nu”顯示行號; 2.通過行號確定你要刪除的行; 3.命令輸入“:32,65d”,回車鍵,32-65行就被  刪除了,
如果無意中刪除錯了,可以使用‘u’鍵恢復(命令模式下)

啓動第一個容器(ubuntu:1.0),安裝java

sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sodu apt-get update
apt-get install oracle-java8-installer
java -version

這裏安裝的是java8(JDK1.8.)

將裝好的java容器鏡像保存爲一個副本,可以在此基礎上構建其他鏡像

root@122a2cecdd14:~# exit
docker commit -m "java install" 122a2cecdd14 ubuntu:java

Hadoop安裝

   啓動已安裝的java容器鏡像

docker run -ti ubuntu:java

     安裝wget

root@8ef06706f88d:cd ~
root@8ef06706f88d:~# mkdir soft
root@8ef06706f88d:~# cd soft/
root@8ef06706f88d:~/soft# mkdir apache
root@8ef06706f88d:~/soft# cd apache/
root@8ef06706f88d:~/soft/apache# mkdir hadoop
root@8ef06706f88d:~/soft/apache# cd hadoop/
root@8ef06706f88d:~/soft/apache/hadoop# wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz
root@8ef06706f88d:~/soft/apache/hadoop# tar xvzf hadoop-2.8.5.tar.gz

  3.配置環境變量

修改~/.bashrc文件。在文件末尾加入下面配置信息:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export HADOOP_HOME=/root/soft/apache/hadoop/hadoop-2.8.5
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

 配置完成後需要執行下面語句,使其立即生效

source ~/.bashrc

 

注意:我們使用apt-get安裝java,不知道java裝在什麼地方的話可以使用下面的命令查看:

root@8ef06706f88d:~# update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-7-oracle/jre/bin/java
Nothing to configure.
root@8ef06706f88d:~#

4.配置Hadoop

主要配置core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml這四個文件

root@8ef06706f88d:~# cd $HADOOP_HOME/
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5# mkdir tmp
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5# cd tmp/
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/tmp# pwd
/root/soft/apache/hadoop/hadoop-2.8.5/tmp
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/tmp# cd ../
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5# mkdir namenode
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5# cd namenode/
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/namenode# pwd
/root/soft/apache/hadoop/hadoop-2.8.5/namenode
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/namenode# cd ../
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5# mkdir datanode
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5# cd datanode/
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/datanode# pwd
/root/soft/apache/hadoop/hadoop-2.8.5/datanode
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5datanode# cd $HADOOP_CONF_DIR/
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# cp mapred-site.xml.template mapred-site.xml
root@8ef06706f88d:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# nano hdfs-site.xml

1)core-site.xml

<configuration>
    <property>
            <name>hadoop.tmp.dir</name>
            <value>/root/soft/apache/hadoop/hadoop-2.8.5/tmp</value>
            <description>A base for other temporary directories.</description>
    </property>

    <property>
            <name>fs.default.name</name>
            <value>hdfs://master:9000</value>
            <final>true</final>
            <description>The name of the default file system.  A URI whose
            scheme and authority determine the FileSystem implementation.  The
            uri's scheme determines the config property (fs.SCHEME.impl) naming
            the FileSystem implementation class.  The uri's authority is used to
            determine the host, port, etc. for a filesystem.</description>
    </property>
</configuration>

注意:

  • hadoop.tmp.dir配置項值即爲此前命令中創建的臨時目錄路徑。
  • fs.default.name配置爲hdfs://master:9000,指向的是一個Master節點的主機(後續我們做集羣配置的時候,自然會配置這個節點,先寫在這裏)

2)hdfs-site.xml 

 

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <final>true</final>
        <description>Default block replication.
        The actual number of replications can be specified when the file is created.
        The default is used if replication is not specified in create time.
        </description>
    </property>

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/root/soft/apache/hadoop/hadoop-2.8.5/namenode</value>
        <final>true</final>
    </property>

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/root/soft/apache/hadoop/hadoop-2.8.5/datanode</value>
        <final>true</final>
    </property>
</configuration>

注意:

  • 我們後續搭建集羣環境時,將配置一個Master節點和兩個Slave節點。所以dfs.replication配置爲2。
  • dfs.namenode.name.dirdfs.datanode.data.dir分別配置爲之前創建的NameNode和DataNode的目錄路徑

3)mapred-site.xml

   先執行 cp mapred-site.xml.template mapred-site.xml

   再進行配置【移除可能老舊版本的配置】




<configuration>                
        <property>
                <name>mapreduce.framework.name</name>
                <value> yarn</value>

        </property>
</configuration>

4)yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
</property>
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>

</configuration>

5)修改JAVA_HOME環境變量

nano hadoop-env.sh

修改文件中:export JAVA_HOME=/usr/lib/jvm/java-8-oracle

6)格式化 namenode

hdfs/hadoop namenode -format

4.安裝SSH

實現無密碼登陸

root@8ef06706f88d:~# sudo apt-get install ssh

SSH裝好了以後,由於我們是Docker容器中運行,所以SSH服務不會自動啓動。需要我們在容器啓動以後,手動通過/usr/sbin/sshd 手動打開SSH服務。未免有些麻煩,爲了方便,我們把這個命令加入到~/.bashrc文件中。通過nano ~/.bashrc編輯.bashrc文件(nano沒有安裝的自行安裝,也可用vi),在文件後追加下面內容:

#autorun
/usr/sbin/sshd

執行source ~/.bashrc

5.生成訪問密鑰

root@8ef06706f88d:/# cd ~/
root@8ef06706f88d:~# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
root@8ef06706f88d:~# cd .ssh
root@8ef06706f88d:~/.ssh# cat id_rsa.pub >> authorized_keys
root@8ef06706f88d:~/.ssh# chmod 600 authorized_keys

注意: 這裏,我的思路是直接將密鑰生成後寫入鏡像,免得在買個容器裏面再單獨生成一次,還要相互拷貝公鑰,比較麻煩。當然這只是學習使用(這樣會導致容器密鑰就全都一樣)

6.配置slaves

在master節點容器中執行如下命令:

root@master:~# cd $HADOOP_CONF_DIR/
root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# nano slaves 

將如下信息寫入該文件末尾:

slave1
slave2

 

7.保存鏡像副本

這裏我們將安裝好Hadoop的鏡像保存爲一個副本。

root@8ef06706f88d:~# exit
king@king:~$ docker commit -m "hadoop install" 8ef06706f88d ubuntu:hadoop

搭建分佈式集羣

這裏有幾個問題:

  1. Docker容器中的ip地址是啓動之後自動分配的,且不能手動更改
  2. hostname、hosts配置在容器內修改了,只能在本次容器生命週期內有效。如果容器退出了,重新啓動,這兩個配置將被還原。且這兩個配置無法通過commit命令寫入鏡像

我們搭建集羣環境的時候,需要指定節點的hostname,以及配置hosts。hostname可以使用Docker run命令的h參數直接指定。但hosts解析有點麻煩,雖然可以使用run--link參數配置hosts解析信息,但我們搭建集羣時要求兩臺機器互相能夠ping通,其中一個容器沒有啓動,那麼ip不知道,所以--link參數對於我們的這個場景不實用。要解決這個問題,大概需要專門搭建一個域名解析服務,即使用--dns參數

我們這裏只爲學習,就不整那麼複雜了,就手動修改hosts吧。

啓動master容器

docker run -ti -h master ubuntu:hadoop

啓動slave1容器

docker run -ti -h slave1 ubuntu:hadoop

啓動slave2容器

docker run -ti -h slave2 ubuntu:hadoop

執行此步驟後,各hadoop容器配置均相同,只需修改hosts和slaves即可

配置hosts

(ifconfig不能用時,可先執行apt-get install net-tools,然後再執行ifconfig)

  1. 通過ifconfig命令分別獲取各節點ip。環境不同獲取的ip可能不一樣,例如我本機獲取的ip如下: 
    • master:172.17.0.2
    • slave1:172.17.0.3
    • slave2:172.17.0.4
  2. 使用sudo nano /etc/hosts命令將如下配置寫入各節點的hosts文件,注意修改ip地址:

    172.17.0.2        master
    172.17.0.3        slave1
    172.17.0.4       slave2

啓動Hadoop

在master節點上執行start-all.sh命令,啓動Hadoop。

只不過每次重新啓動都得修改各節點/etc/hosts

成功執行如下圖所示:

【此處若仍需要輸入密碼請轉至本文末尾,進行另一種ssh免密登錄方式】

【此處若出現以下信息,只需依次輸入yes ,出現yes輸入不能識別情況可按以下所示操作】

jps

可以在其他slave結點輸入jps,查看狀態

在master節點上通過命令hdfs dfsadmin -report查看DataNode是否正常啓動

執行自帶wordcount例子

參考博客:https://www.cnblogs.com/xiaomila-study/p/4973662.html

1)
root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# hadoop fs -mkdir -p /data/wordcount

2)
root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# hadoop fs -mkdir -p /output/

3)
root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# hadoop fs -ls /

4)
#其中需要說明的是,作爲執行的輸入文件可以隨意選擇,

root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# hadoop fs -put ~/soft/apache/hadoop/hadoop-2.8.5/LICENSE.txt /data/wordcount/

#即我這裏直接選擇hadoop-2.8.5下的證書文件作爲輸入【執行put類似於cp命令不會導致原文件變動】

5)
root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# hadoop fs -ls /data/wordcount

6)#執行wordcount
root@master:~/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop# hadoop jar ~/soft/apache/hadoop/hadoop-2.8.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /data/wordcount /output/wordcount
7)#查看輸出
hadoop fs -text /output/wordcount/part-r-00000 

二、在hadoop基礎上安裝spark

1.scala環境搭建

1)下載scala-2.12.8.tgz,解壓到/usr/share目錄下


wget https://downloads.lightbend.com/scala/2.12.8/scala-2.12.8.tgz

tar -zxvf scala-2.12.8.tgz
   
mv scala-2.12.8 /usr/share

2)在~/.bashrc中添加配置:

export SCALA_HOME=/usr/share/scala-2.12.8
export PATH=$SCALA_HOME/bin:$PATH

生效  source /.bashrc

2.spark2.4.0環境搭建

1)創建目錄並下載解壓到指定位置

wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz

cd $HADOOP_HOME
cd ..
cd ..
mkdir spark
tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz

2) 在~/.bashrc中添加配置:

export SPARK_HOME=/root/soft/apache/spark/spark-2.4.0-bin-hadoop2.7/
export PATH=$PATH:$SPARK_HOME/bin

注意, 因spark sbin目錄文件與hadoop sbin有相同,故這裏不指定

生效  source /.bashrc

3)修改spark-env.sh

cd $SPARK_HOME/conf

cp spark-env.sh.template spark-env.sh

nano spark-env.sh #在末尾添加如下內容:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export SCALA_HOME=/usr/share/scala-2.12.8
export HADOOP_HOME=/root/soft/apache/hadoop/hadoop-2.8.5
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/root/soft/apache/spark/spark-2.4.0-bin-hadoop2.7
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=1g

4)修改slaves

      cp slaves.template slaves,打開後添加如下內容

slave1
slave2

 保存鏡像副本

docker commit -m "spark install" XXX  ubuntu:spark

docker run -it -h master ubuntu:spark

.........重複前面hadoop步驟...........

5)

啓動hadoop:start-all.sh

啓動spark:

cd $SPARK_HOME/sbin

./start-all.sh

注意:

鑑於之前已啓動過hadoop,因此使用docker run -it -h  <各節點hostname> ubuntu:spark 會導致 各個slave結點 的 $HADOOP_HOME路徑下的tmp臨時文件和存放datanode結點數據的文件/datanode/current/數據信息相同

出現Hadoop datanode正常啓動,但是Live nodes中卻缺少節點的問題且結點時而變化的問題

即 執行 hdfs dfsadmin -report 發現 datanode live 數量小於實際節點數

先停止slave節點服務,將slave節點的tmp和datanode文件下的文件刪除,並重新啓動 即可解決

參考博客:https://blog.csdn.net/u011462318/article/details/80439160

6)運行wordcount

#重複hadoop運行wordcount步驟     1)到6)

spark-shell

scala> sc.textFile("/data/wordcount").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/output/wordcount")#以空格分詞

 查看輸出略

 

附:

ubuntu可以通過編輯 sources list進行官方源和第三方源的更新【注意備份】

cp /etc/apt/sources.list /etc/apt/sources.list.bak  #備份
sudo vim /etc/apt/sources.list #修改
cp /etc/apt/sources.list  /etc/apt/sources.list.qinghua #備份第三方源

  apt-get update

 

VMware 虛擬環境ubuntu 安裝docker不錯的網站:

http://www.runoob.com/docker/ubuntu-docker-install.html

root@master:~#  scp  /root/soft/apache/hadoop/hadoop-2.8.5/etc/hadoop/yarn-site.xml  slave1:/root/soft/apache/hadoop/had
oop-2.8.5/etc/hadoop/
#實現遠程文件發送

 

另一種操作【各節點容器已創建後,實現ssh免密登陸】,

在master節點容器中

ssh-copy-id -i slave1  #登錄slave1,將公鑰拷貝到hadoop01的authorized_keys中;
ssh-copy-id -i slave2 #登錄slave2,將公鑰拷貝到hadoop01的authorized_keys中;
。。。

注意:執行上述命令會要求輸入slave的password 可能需要先在各個slave設置root密碼(輸入 passwd,按提示操作即可)

      然後可能需要修改sshd_config

1.修改root密碼:#sudo passwd root

2.輯配置文件,允許以 root 用戶通過 ssh 登錄:sudo vi /etc/ssh/sshd_config

 找到:PermitRootLogin prohibit-password禁用

   添加:PermitRootLogin yes

3.sudo service ssh restart

授權authorized_keys文件,在.ssh目錄下輸入命令:

chmod 600 authorized_keys

將授權文件拷貝到slave1、slave2...,命令如下:

scp /root/.ssh/authorized_keys slave1:/root/.ssh/ #拷貝

scp /root/.ssh/authorized_keys slave2:/root/.ssh/ #拷貝
參考博客 https://www.cnblogs.com/ivan0626/p/4144277.html

【Docker 安裝hadoop 參考博客:https://www.cnblogs.com/onetwo/p/6419925.html該博客安裝版本hadoop2.6.X版本與2.8.X有不同之處,不能照搬,請注意比較】

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章