老东西叫我用vmvare部署hadoop,我觉得这简直蠢毙了,让我们用docker和docker-compose来快速的过一遍如何使用docker-compose来部署简单的hadoop集群范例
windows。。。看着用吧
hadoop版本不同改下Dockerfile中的内容,具体来说是这里-3.3.6改成你的版本比如3.1.3
还有注意!Hadoop中的主机名不能带-或者_
注意了!一定注意存储空间大小,确保机器至少有10G左右的空余,不然跑不起来的
如果出现如下问题,请调整docker-compose文件中分给容器的容量,然后删除并重建容器:
$ hdfs namenode
WARNING: /export/server/hadoop/logs does not exist. Creating.
mkdir: cannot create directory '/export/server/hadoop/logs': No space left on device
ERROR: Unable to create /export/server/hadoop/logs. Aborting.
Hadoop HDFS需要三个角色:
- NameNode,主节点管理者
- DateNode,从节点工作者
- SecondaryNameNode,主节点辅助
我们需要三个容器:
暂且称之为
masternode,slavenode1,slavenode2
这三个容器扮演的角色分别是
- masternode:NameNode,DateNode,SecondaryNameNode
- slavenode1:DateNode
- slavenode2: DateNode
注意!建立在你会的基础上,不会的话看着脚本敲命令
克隆项目后确保目录如:
git clone https://github.com/rn-consider/Hadoop_docker.git
然后确保使用docker-compose up -d 创建的容器也可以运行
给所有sh脚本附加执行权限,然后运行./一键式部署请确保已经下载了hadoop压缩包.sh,然后等待脚本执行完成像是:
,完成后直接跳转到运行hadoop章节
我们需要三个docker容器来实现masternode,slavenode1,slavenode2,它们需要一些基本的配置,比如说固定的Ip,ssh的安装,jdk8的安装等,所幸我们可以使用docker-compose来大大简化这些基本的配置工作,新建一目录假设命名为hadoop_t,然后按照以下命令,(注意!因为我们使用的是docker所以只需要按照我的步骤来且docker,docker-compose版本号满足要求,那么环境配置必然会成功)
git clone https://github.com/rn-consider/Hadoop_docker.git
docker-compose会自动创建docker网络和dns映射让各个容器可以通过容器的服务名来访问各自的容器,我们可以愉快的跳过这个配置
Docker 使用官方的 Ubuntu 镜像默认情况下不会启动防火墙,因为容器通常被设计成相对独立的环境。这意味着容器内的网络通信通常是不受防火墙限制的。
所以这一步我们也可以愉快的跳过.
传统方式下我们进入每一台虚拟机并使用ssh-copy-id node1,node2...类似的方式,在docker下我们可以编写一个简单的shell脚本解决这个问题,只需要执行项目中的脚本就行:
简单的执行shell脚本即可,我们使用
ntpdate
来同步阿里云的ntp服务器
我们的Dockerfile构建的镜像已经自动的安装了JDK8并将本地目录下的HADOOP压缩包复制解压到了容器中的/etc/export/hadoop下,我们也可以愉快的跳过这一步
也可直接运行脚本,直接拷贝放置在fileconfig目录下的配置文件:
我们可以看下HADOOP的文件夹结构:
这些文件均存在于$HADOOP_HOME/etc/hadoop文件夹中.
ps:$HADOOP_HOME我们将在后续设置它,其指代Hadoop安装文件夹即/export/server/hadoop
- export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 # where we use apt download
- export HADOOP_HOME=/export/server/hadoop
- export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
- export HADOOP_LOG_DIR=$HADOOP_HOME/logs
-
-
fs.defaultFS -
hdfs://masternode:8020 -
-
-
io.file.buffer.size -
131072 -
- hdfs://masternode:8020为整个HDFS内部的通讯地址,应用协议为hdfs://(HADOOP内置协议)
- 表明DataNode将与masternode的8020端口通讯,masternode是NameNode所在机器
- 此配置固定了masternode必须启动NameNode进程
-
-
-
-
dfs.datanode.data.dir.perm -
-
700 -
-
-
-
-
-
dfs.namenode.name.dir -
-
/data/nn -
-
-
-
-
-
dfs.namenode.hosts -
-
masternode,slavenode1,slavenode2 -
-
-
-
-
dfs.blocksize -
-
268435456 -
-
-
-
-
-
dfs.namenode.handler.count -
-
100 -
-
-
-
-
-
dfs.datanode.data.dir -
-
/data/dn -
-
-
脚本运行
- chown -R hadoop:hadoop /data
-
- chown -R hadoop:hadoop /export
-
- chown -R hadoop:hadoop /home
所有前期准备全部完成,现在对整个文件系统执行初始化
别忘了source一下
- su - hadoop
-
- hdfs namenode -format
使用docker inspect可以看到docker容器的ip地址:
docker-compose文件定义了桥接网络到宿主机,直接在宿主机访问172.21.0.2:9870(就是masternode被分配的子网地址)就能看到HDFS WEBUI:
获取压缩包
wget -b https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
查看进度
cat wget-log