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.xml、hdfs-site.xml、mapred-site.xml、yarn-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.dir
和dfs.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
搭建分布式集群
这里有几个问题:
- Docker容器中的ip地址是启动之后自动分配的,且不能手动更改
- 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)
- 通过
ifconfig
命令分别获取各节点ip。环境不同获取的ip可能不一样,例如我本机获取的ip如下:- master:172.17.0.2
- slave1:172.17.0.3
- slave2:172.17.0.4
-
使用
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有不同之处,不能照搬,请注意比较】