在Docker上安装Ubuntu系统
直接从Docker上下载Ubuntu系统
docker pull ubuntu
docker pull命令表示从docker hub上拉取Ubuntu镜像到本地,可以用下面命令查看是否安装成功。
docker images
在本地windows10中创建一个build目录,用于和docker系统共享文件。
运行ubuntu系统:
docker run -it -v F:\VirtualMachine\build:/root/build --name ubuntu ubuntu
docker run 表示运行一个镜像。
-i 表示开启交互式;-t 表示分配一个tty(可以理解为一个控制台);因此,-it可以理解为在当前终端上与Docker内部的Ubuntu系统进行交互。
-v 表示Docker内部的Ubuntu系统中的/root/build目录与本地的F:\VirtualMachine\build目录共享,这样就可以很方便地将文件上传到Docker内部的Ubuntu系统中。
-name 表示ubuntu表示Ubuntu镜像启动名称,如果没有指定,那么Docker将会随机分配一个名字。
-ubuntu 命令中的最后一个ubuntu,表示docker run启动的镜像文件。
Ubuntu系统初始化
1)更新系统软件源
apt-get update
2)安装vim编辑器
apt-get install vim
3)安装和配置sshd
apt-get install ssh
开启sshd服务器
/etc/init.d/ssh start
把启动命令写进~/.bashrc文件,每次登录Ubuntu系统时,都能自动启动sshd服务。
用vim编辑器打开~/.bashrc文件,在该文件最后一行添加如下内容:
/etc/init.d/ssh start
安装sshd之后,需要配置SSH无密码连接本地sshd服务,在Docker上的Ubuntu系统中执行如下命令:
ssh-keygen -t rsa #一直按Enter键即可
cd ~/.ssh
cat id_dsa.pub >> authorized_keys
如果找不到.ssh或者cat: id_dsa.pub: No such file or directory 点击这里ssh错误
安装java
在Docker上的Ubuntu系统中可以输入下面命令来安装jdk(如果出现E: Unable to locate package defaultjdk。一般apt-get出现这种情况,就是没有更新APT库,更新一下就好了。则运行
sudo apt-get update
sudo apt-get upgrade
)
apt-get install default-jdk
配置java环境变量,打开 ~/.bashrc文件,在最开始位置增加如下内容:
vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
执行下面命令使~/.bashrc配置文件生效。
source ~/.bashrc
注意:如果要装oracle java版本,则卸载open-jdk版本即可(命令:sudo apt-get remove openjdk*)
参考的卸载openjdk与安装oraclejdk的文章:https://blog.youkuaiyun.com/dengdengma520/article/details/81189318
保存镜像
在Docker内部对容器做的修改,是不会自动保存到镜像中的,就是说,上面对容器进行了大量配置,一旦把容器关闭,然后重新开启容器,之前的设置会全部消失。首先到Docker官网注册账号,然后再本地系统(不是Docker中的系统)Linux系统通过下面命令登录,windows通过Docker Desktop登录
docker login #登录·
登录后,再cmd输入下面命令查看当前运行的容器的信息:
docker ps
从上面信息可以看出,当前运行的Ubuntu镜像的ID是9b66321b893b。输入下面命令将修改后的容器保存为一个新的镜像,新镜像名称为ubuntu/jdkinstalled。
docker commit 9b66321b893b ubuntu/jdkinstalled
安装hadoop
将hadoop-2.7.1.tar.gz放到F:\VirtualMachine\build。然后在Docker内部系统的/root/build目录下解压:
tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local
这里已经配置好hadoop单机模式了。运行下面命令测试是否安装正确。
cd /usr/local
mv ./hadoop-2.7.1 ./hadoop
cd hadoop
./bin/hadoop version
配置hadoop集群
配置hadoop集群,需要修改/usr/local/hadoop/etc/hadoop目录下的配置文件hadoop_env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml和yarn-site.xml。
首先使用vim编辑器打开hadoop_env.sh文件
cd /usr/local/hadoop
vim etc/hadoop/hadoop-env.sh
打开后,在文件前添加下面内容:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
然后用vim编辑器修改core-site.xml文件
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
然后用vim编辑器修改hdfs-site.xml文件
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/namenode_dir</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/datanode_dir</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
然后用vim编辑器修改mapred-site.xml文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
最后用vim编辑器修改yarn-site.xml文件
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>
最后保存这个镜像
C:\Users\xixi>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a9d331672b4 ubuntu/jdkinstalled "/bin/bash" 36 seconds ago Up 33 seconds ubuntu-jdkinstalled
9b66321b893b ubuntu "/bin/bash" 2 hours ago Up 2 hours ubuntu
C:\Users\xixi>docker commit 5a9d331672b4 ubuntu/hadoopinstalled
sha256:3a9eab1bb8df5573195d48e6a4d080d64e6498a051fe51e906b6e9f1f691e19a
C:\Users\xixi>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu/hadoopinstalled latest 3a9eab1bb8df 9 seconds ago 1.08GB
ubuntu/jdkinstalled latest 80e7c7e5d482 3 hours ago 750MB
ubuntu latest 549b9b86cb8d 2 days ago 64.2MB
hello-world latest fce289e99eb9 11 months ago 1.84kB
接下来,在windows终端中打开3个终端窗口,每个终端分别启动一个容器运行ubuntu/hadoopinstalled镜像,分别表示Hadoop集群中的Master、Slave01和Slave02:
#第一个终端
docker run -it -h master --name master ubuntu/hadoopinstalled
#第二个终
docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled
#第三个终
docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled
配置Master、Slave01和Slave02的地址信息,分别打开/etc/hosts文件,可以查看本机的IP和主机名信息,最后hosts都应该是
172.17.0.4 slave02
172.17.0.3 slave01
172.17.0.2 master
然后测试下Master是否可以成功连上Slave01和Slave02:
ssh slave01
ssh slave02
最后还需要打开Master节点上的slaves文件,输入两个Slave节点的主机名,在Master节点输入下面命令:
cd /usr/local/hadoop
vim etc/hadoop/slaves
使用vim编辑器打开slaves文件,将localhost替换成两个节点的主机名:
Slave01
Slave02
至此,Hadoop集群已经配置完成,现在可以启动集群,在Master节点的终端中执行下面命令:
cd /usr/local/hadoop
bin/hdfs namenode -format
sbin/start-all.sh
运行实例
在HDFS上创建一个目录,在Master节点的终端执行下面命令:
cd /usr/local/hadoop
./bin/hdfs dfs -mkdir -p /user/hadoop/input
然后将/usr/local/hadoop/etc/hadoop/目录下的所有文件复制到HDFS中
./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
然后通过下面命令查看是否正确将文件上传到HDFS,需要在Master节点的终端中继续执行如下命令:
./bin/hdfs dfs -ls /user/hadoop/input
最后执行实例程序:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'
等程序结束后,就可以在HDFS上的output目录查看运行结果,在Master终端执行下面命令:
./bin/hdfs dfs -cat output/*
运行结果如下:
1 dfsadmin
1 dfs.replication
1 dfs.namenode.name.dir
1 dfs.datanode.data.dir
最后,若要在windows10访问http://localhost:9000/,则要设置通过独立IP访问docker for windows 容器内网
参考书籍:《大数据》林子雨编著