一、腾讯云申请一个账号
因为学校有发腾讯云代金劵,所以这里以腾讯云为例,其他云也同理.
学习hadoop,做的学习笔记,希望大佬们多指点一下.
1、新建一个实例,因为是学习,选择最低配就行.
- 计费方式,地域随便自己选,最好选和自己地区相同的.
- 系统这里选的CentOS 7.5 64位
- 系统硬盘最低50G,带宽1M就行
- 默认项目,安全组看自己随便弄,主机密码一定要记得,后面会用到.
- 下一步付钱就好了,等一会就建立好了
2、进入建立好的实例
- 点实例右边的操作中的登陆
- 在弹出的方式中,自己选一个就行,我这里是Mac OS系统,就用自带的终端程序了.准备选择用密码登陆
3、SSH登陆建立好的云主机
- 将刚刚点登陆弹出来的框里,用密码登陆方式的那段命令输入终端,就会叫你输入密码,也就是最开始申请时,叫你填写的主机密码,终端里面输入时不会显示,输入完按Enter就行.
- 显示如下就连接上了
二、安装Docker
1、使用yum方式安装docker
*输入如下命令,安装好后如图所示.
#安装 Docker
yum -y install docker
#查看 Docker版本,看是否安装好
docker verison
#运行如下
[root@VM_0_11_centos ~]# docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:33:21 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:02:24 2019
OS/Arch: linux/amd64
Experimental: false
2、在Docker中下载centos镜像
#下载镜像
docker pull centos
#查看 Docker下载好了的镜像
docker images
#运行后如下
[root@VM_0_11_centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1e1148e4cc2c 3 months ago 202MB
3、用镜像创建容器
- 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
#创建容器
docker run -i -t -v /home/hadoop/build:/root/build -h test --name test centos /bin/bash
#运行如下,已经进入了新建的容器,名为test的主机,系统为CentOS
[root@VM_0_11_centos ~]# docker run -it -v /home/hadoop/build:/root/build -h test --name test centos /bin/bash
[root@test /]#
- 以centos镜像启动一个容器,容器名是test,主机名是test,并且将基于容器的centos系统的/root/build目录与本地/home/hadoop/build共享。
参数解释:
-v 表示基于容器的centos系统的/root/build目录与本地/home/hadoop/build共享;这可以很方便将本地文件上传到Docker内部的centos系统;
-h 指定主机名为master
–-name 指定容器名
/bin/bash 使用bash命令
三、容器配置
1.现在这个系统什么都没有,所以首先安装vim
yum -y install vim
#如下如所示
[root@test /]# yum -y install vim
···
···
Complete!
2.然后安装jdk
- 输入以下命令,查看可以安装的版本,要选择-devel的安装,因为这个安装的是jdk,而那个不带-devel的安装完了其实是jre.
yum -y list java*
- 可以不看版本,直接安装,这里安装java-1.8.0-openjdk-devel.x86_64,输入以下命令,直接安装.
yum install -y java-1.8.0-openjdk-devel.x86_64
- 安装好后,查看安装的版本
java -version
#如下所示
[root@test /]# java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
- 安装的位置为/usr/lib/jvm,输入以下命令可以查看
cd /usr/lib/jvm
ls
#如下如所示
[root@test /]# cd /usr/lib/jvm
[root@test jvm]# ls
java
java-1.8.0
java-1.8.0-openjdk
java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64
java-openjdk
jre
jre-1.8.0
jre-1.8.0-openjdk
jre-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64
jre-openjdk
- 至此jdk安装完成,退出目录,输入以下命令
cd
[root@test jvm]# cd
[root@test ~]#
3.现在安装SSH
- 安装SSH服务端和客户端,服务端能让其他主机远程登录本机,客户端能让本机远程登录其他主机
yum -y install passwd openssl openssh-server openssh-clients
[root@test ~]# yum -y install passwd openssl openssh-server openssh-clients
···
···
Complete!
- 创建 /var/run/sshd/目录,要不然sshd服务启动会报错
[root@test ~]# mkdir /var/run/sshd/
- 编辑sshd的配置文件/etc/ssh/sshd_config,将其中的UsePAM yes改为UsePAM no
#可以进入sshd_config文件中去修改,也可以使用命令:
[root@test ~]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
- 创建公私密钥,输入命令后,直接按两次enter键确认就行了
[root@test ~]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
[root@test ~]# ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
[root@test ~]# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
- 完成上述几步后,可以开启ssh服务了,会弹出警告,不用管,按下Enter就行
[root@test ~]# /usr/sbin/sshd -D &
[1] 247
[root@test ~]# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several problems.
- 此时使用命令ps -ef | grep sshd便可以看到
[root@test ~]# ps -ef | grep sshd
root 247 1 0 00:51 pts/0 00:00:00 /usr/sbin/sshd -D
root 250 1 0 01:00 pts/0 00:00:00 grep --color=auto sshd
- 输入以下命令安装 lsof
[root@test ~]# yum -y install lsof
- 如果在/etc/ssh/sshd_config文件中将端口22修改了,那么填写你修改了的端口
[root@test ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 247 root 3u IPv4 4163692 0t0 TCP *:ssh (LISTEN)
sshd 247 root 4u IPv6 4163694 0t0 TCP *:ssh (LISTEN)
- 配置ssh无密码登录,按Enter就行,ssh无密码登录可用hadoop集群中master主节点无密码登录从节点
[root@test ~]# ssh-keygen -t rsa
[root@test ~]# cd ~/.ssh
[root@test .ssh]# cat id_rsa.pub >> authorized_keys
- 测试登录其他主机,输入命令ssh localhost,输入yes
[root@test .ssh]# ssh localhost
···
Are you sure you want to continue connecting (yes/no)? yes
···
- 这个时候仔细看命令输入行,已经不一样了,说明已经登陆了,输入exit退出登陆,输入cd退出目录
[root@test ~]# exit
logout
Connection to localhost closed.
[root@test .ssh]# cd
[root@test ~]#
4.环境配置
这里需要用到vi操作,按 i 是编辑,编辑好了按 esc 退出编辑,按冒号 : 输入命令,输入 wq 保存退出.
- 在/etc/profile中配置环境变量
[root@test ~]# vi /etc/profile
- 在最下面添加这段,保存退出,JAVA_HOME后面的Java版本号是我安装的那个版本,输入自己安装的版本就行,我这里是java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
···
···
unset i
unset -f pathmunge
#set java environment
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
#set hadoop environment
export HADOOP_HOME=/usr/local/hadoop
export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
- 设置好后,输入以下命令,使之生效
source /etc/profile
- 在~/.bashrc文件中设置环境路径,最下面添加两行,保存退出
[root@test ~]# vi ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64
/usr/sbin/sshd -D &
5.保存镜像
- 现在我们已经安装好了vim、jdk、ssh客户端服务端的centos容器.
- 但在Docker内部的容器做的修改是不会自动保存到镜像的,也就是说,我们把容器关闭,然后重新开启容器,则之前的设置会全部消失,因此我们需要保存当前的配置.
- 为了达到复用配置信息,我们在每个步骤完成之后,都保存成一个新的镜像,然后开启保存的新镜像即可.
- 需要先到这个网址注册一个账号https://hub.docker.com/
- 账号注册成功后,然后在电脑上新开一个终端,原来那个终端不用关
- SSH登陆建立好的云主机,参考上面的步骤
- 输入以下命令,输入刚刚申请的相应用户名、密码,然后会提示登录成功。
[root@VM_0_11_centos ~]# docker login
Login Succeeded
#有时会提示未连接上,这是可能是因为没有开启doker,输入如下命令,再次登陆
sudo service docker start //开启Docker 服务
sudo chkconfig docker on //开机启动
- 查询现在运行的容器
[root@VM_0_11_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02cc04a2a8b4 centos "/bin/bash" 10 hours ago Up 10 hours test
- 保存镜像,容器ID不一样,输入自己的那个ID就行,我这里是 02cc04a2a8b4
[root@VM_0_11_centos ~]# docker commit 02cc04a2a8b4 centos/test
sha256:5cfee67798a83b6bd1d8171a5c413025da90a6c61d2909f94f882ab3598f7128
[root@VM_0_11_centos ~]#
- 查看已经有的镜像,就能看到刚刚保存的镜像 centos/test
[root@VM_0_11_centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/test latest 5cfee67798a8 3 minutes ago 572MB
centos latest 1e1148e4cc2c 3 months ago 202MB
[root@VM_0_11_centos ~]#
四、安装Hadoop
1.新建容器demo
- 前面我们安装有vim、jdk、ssh的centos镜像,已经保存,现在我们在这个的基础上继续搭建hadoop.
在正式开始前,了解一些docker容器的操作命令
docker ps:查看活动的容器
docker ps -a:查看所有的容器(包括终止状态的)
docker images:查看镜像
docker run:基于镜像新建一个容器
docker container start 容器id:启动已经终止的容器,但不会进入容器,容器在后台执行
docker container stop 容器id:终止容器
docker container rm 容器id:删除终止状态的容器
docker image rm 镜像id:删除镜像
进入容器有两个命令:attach和exec
docker attach 容器id:进入容器,使用exit退出时,容器会终止
docker exec -it 容器id bash:进入容器,使用exit退出时,容器不会终止(推荐)
- 以之前保存的centos/test 镜像新建一个名为demo的容器,容器中是centos系统,主机名为 demo.
[root@VM_0_11_centos ~]# docker run -i -t -h demo --name demo centos/test /bin/bash
[root@demo /]# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several problems.
[root@demo /]#
2.下载Hadoop安装文件
- 我们要把Hadoop安装文件下载到/root/build目录下,可以从官网下载,也可以从镜像网站下载,我这里使用镜像网站,速度比较快.
- 使用wget下载,首先下载wget,然后下载Hadoop安装文件,有几百M要等一会
[root@demo /]# yum install -y wget
[root@demo /]# wget -P /root/build http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
- 下载好后进入/root/build目录,查看下载的文件
[root@demo ~]# cd /root/build
[root@demo build]# ls
hadoop-3.2.0.tar.gz
- 解压到/usr/local目录下:
[root@demo build]# tar -zxvf hadoop-3.2.0.tar.gz -C /usr/local
- 进入/usr/local目录下后,并将hadoop-3.2.0目录名重命名为hadoop,并进入hadoop目录,查看是否安装成功
[root@demo build]# cd
[root@demo ~]# cd /usr/local
[root@demo local]# mv hadoop-3.2.0 hadoop
[root@demo local]# cd hadoop
[root@demo hadoop]# ./bin/hadoop version
Hadoop 3.2.0
Source code repository https://github.com/apache/hadoop.git -r e97acb3bd8f3befd27418996fa5d4b50bf2e17bf
Compiled by sunilg on 2019-01-08T06:08Z
Compiled with protoc 2.5.0
From source with checksum d3f0795ed0d9dc378e2c785d3668f39
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.2.0.jar
3.配置Hadoop
- 配置的这些文件都在/usr/local/hadoop/etc/hadoop/目录下.
- 接上面.进入目录并查看有那些文件.
[root@demo hadoop]# cd etc/hadoop
[root@demo hadoop]# ls
capacity-scheduler.xml hadoop-user-functions.sh.example kms-log4j.properties ssl-client.xml.example
configuration.xsl hdfs-site.xml kms-site.xml ssl-server.xml.example
container-executor.cfg httpfs-env.sh log4j.properties user_ec_policies.xml.template
core-site.xml httpfs-log4j.properties mapred-env.cmd workers
hadoop-env.cmd httpfs-signature.secret mapred-env.sh yarn-env.cmd
hadoop-env.sh httpfs-site.xml mapred-queues.xml.template yarn-env.sh
hadoop-metrics2.properties kms-acls.xml mapred-site.xml yarn-site.xml
hadoop-policy.xml kms-env.sh shellprofile.d yarnservice-log4j.properties
- 修改core-site.xml
[root@demo hadoop]# vi 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>
- 修改hdfs-site.xml
[root@demo hadoop]# vi 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>
- 修改mapred-site.xml
[root@demo hadoop]# vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 修改yarn-site.xml
[root@demo hadoop]# vi 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>
- 修改hadoop-env.sh文件
[root@demo hadoop]# vi hadoop-env.sh
#将export JAVA_HOME= 替换成
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64
- 在/hadoop/sbin路径下:
[root@demo hadoop]# cd
[root@demo ~]# cd /usr/local/hadoop/sbin
- 修改文件:start-dfs.sh,stop-dfs.sh两个文件顶部添加以下参数
[root@demo sbin]# vi start-dfs.sh
[root@demo sbin]# vi stop-dfs.sh
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
- 修改文件:start-yarn.sh,stop-yarn.sh顶部也需添加以下:
[root@demo sbin]# vi start-yarn.sh
[root@demo sbin]# vi stop-yarn.sh
#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
- 修改后重启 ./start-dfs.sh
[root@demo sbin]# ./start-dfs.sh
[root@demo sbin]# cd
[root@demo ~]#
- 到此Hadoop配置完成,保存镜像,操作方法如前面.新开一个终端操作.
[root@VM_0_11_centos ~]# docker login
Login Succeeded
[root@VM_0_11_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
200bfeb621f2 centos/test "/bin/bash" About an hour ago Up 39 minutes demo
02cc04a2a8b4 centos "/bin/bash" 15 hours ago Up 15 hours test
[root@VM_0_11_centos ~]# docker commit 200bfeb621f2 centos/demo
sha256:79f6af53dac9eca5b02009ccdf5e453db5f4d91bef58a224c639a0589152246d
[root@VM_0_11_centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/demo latest 79f6af53dac9 10 seconds ago 1.85GB
centos/test latest 5cfee67798a8 5 hours ago 572MB
centos latest 1e1148e4cc2c 3 months ago 202MB
五、准备搭建Hadoop集群
- 上面我们已经有配置好vim,ssh,jdk,hadoop的镜像了,名为centos/demo.
- 现在查看已经有的容器,全部删除
[root@VM_0_11_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
200bfeb621f2 centos/test "/bin/bash" About an hour ago Up About an hour demo
02cc04a2a8b4 centos "/bin/bash" 15 hours ago Up 15 hours test
[root@VM_0_11_centos ~]# docker stop 02cc04a2a8b4 200bfeb621f2
02cc04a2a8b4
200bfeb621f2
[root@VM_0_11_centos ~]# docker rm 02cc04a2a8b4 200bfeb621f2
02cc04a2a8b4
200bfeb621f2
[root@VM_0_11_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 以镜像centos/demo新建容器master
[root@VM_0_11_centos ~]# docker run -it -h master --name master centos/demo /bin/bash
[root@master /]# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several problems.
[root@master /]#
- 再打开3个新的终端分别建立worker01,worker02,worker03
[root@VM_0_11_centos ~]# docker run -it -h worker01 --name worker01 centos/demo /bin/bash
[root@worker01 /]# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several problems.
[root@worker01 /]#
[root@VM_0_11_centos ~]# docker run -it -h worker02 --name worker02 centos/demo /bin/bash
[root@worker02 /]# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several problems.
[root@worker02 /]#
[root@VM_0_11_centos ~]# docker run -it -h worker03 --name worker03 centos/demo /bin/bash
[root@worker03 /]# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several problems.
[root@worker03 /]#
- 分别打开/etc/hosts可以查看本机的ip和主机名信息,最后得到四个ip和主机地址信息如下:
[root@master /]# vi /etc/hosts
172.17.0.2 master
[root@worker01 /]# vi /etc/hosts
172.17.0.3 worker01
[root@worker02 /]# vi /etc/hosts
172.17.0.4 worker02
[root@worker03 /]# vi /etc/hosts
172.17.0.5 worker03
- 最后把上述四个地址信息分别复制到master, worker01, worker02, worker03的/etc/hosts.如下
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 master
172.17.0.3 worker01
172.17.0.4 worker02
172.17.0.5 worker03
- 打开master上的workers文件,输入三个worker的主机名:
[root@master /]# cd /usr/local/hadoop/etc/hadoop
[root@master hadoop]# vi workers
#将localhost替换成三个worker的主机名
worker01
worker02
worker03
- 在master终端上,进入/usr/local/hadoop,然后运行如下命令
[root@master hadoop]# cd
[root@master ~]# cd /usr/local/hadoop
[root@master hadoop]# bin/hdfs namenode -format
[root@master hadoop]# sbin/start-all.sh
- 这时Hadoop集群就已经开启,我们可以在master, worker01, worker02, worker03上分别运行命令jps查看运行结果
[root@master hadoop]# jps
576 SecondaryNameNode
289 NameNode
852 ResourceManager
1195 Jps
[root@worker01 /]# jps
67 DataNode
292 Jps
183 NodeManager
[root@worker02 /]# jps
68 DataNode
310 Jps
184 NodeManager
[root@worker03 /]# jps
68 DataNode
293 Jps
184 NodeManager
- 问题1:
每次关机再开机后,执行start-all.sh后,namenode并没有启动。出现这个问题的主要原因是hadoop的临时文件 默认位置为{HADOOP_HOME}/tmp目录,该目录在系统开机时会自动清空,存储在里面的namenode信息也就丢失了。
解决办法:创建目录比如{HADOOP_HOME}/hadoop.tmp,并修改core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/hadoop.tmp</value>
<description>Abase for other temporary directories.</description>
</property>
- 问题2:
每次关机开机后,执行start-all.sh后,会显示找不到worker01,worker02,worker03,需要重新设置/etc/hosts,添加ip地址与主机名,以及source /etc/profile ,参考最后的步骤.
参考:
CentOS7.5 通过wget下载文件到指定目录
[Hadoop安装文件镜像网站]
(http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.0/)
Attempting to operate on hdfs namenode as root
在linux服务器上安装jdk
centos7创建支持ssh服务的docker镜像
(centos7)搭建基于docker的hadoop集群:一
(centos7)搭建基于docker的hadoop集群:二
docker-image container 基本操作 -常用命令
hadoop搭建四个配置文件(core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml )的简单介绍
hadoop配置文件详解系列(一)-core-site.xml篇
《hadoop学习》关于hdfs中的core-site.xml,hdfs-site.xml,mapred-site.xml文件配置详解