Hadoop概论
Hadoop是一个由 Apache基金会所开发的分布式系统基础架构。
主要解决,海量数据的存储和海量数据的分析计算问题。
广义上来说, Hadoop通常是指一个更广泛的概念 Hadoop生态圈。
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
Apache 版本最原始(最基础)的版本,对于入门学习最好。
Cloudera 内部集成了很多大数据框架 。 对应产品 CDH 。用的最多,方便
Hortonworks文档较好。对应产品HDP。
高可靠性: Hadoop底层维护多个数据副本 , 所以即使 Hadoop 某个计算元素或存储出现故障 , 也不会导致数据的丢失。
2)高扩展性:在集群间分配任务数据,可便的扩展数以千计的节点。
3)高效性:在 MapReduce的思想下, Hadoop 是并行工作的 ,以加快任务处理速度。
4)高容错性:能够自动将失败的任务重新分配
Hadoop组成 计算+资源调度+存储
1.x中MapReduce负责计算和资源调度
2.x中MapReduce负责计算,Yarn负责资源调度,解耦
HDFS 存储
Hadoop Distributed File System
NameNode:nn,文件元数据。 文件名,目录结构,属性,文件所在dn列表
DataNode:dn,实际存储块数据。 块数据以及校验和
Secondary NameNode:不是nn的热备,是nn的助手,不能顶替nn,
YARN 资源调度(资源指的是CPU内存等等)
每个知道自己的集群在干什么事情。
RM:常驻进程 Resource Manager 处理客户端请求 ,监控每一个Node Manager,启动或者监控AM, 资源调度和分配
NM:常驻进程Node Manager,每一个节点负责人。 处理RM和AM的指令
AM:有任务才创建ApplicationMaster,任务临时主管,决定任务需要多少资源并且申请资源。数据切分资源分配给任务,任务监控容错
Container:有任务才创建。节点资源的抽象。CPU内存网络硬盘的多维度资源
MapReduce MapReduce将计算过程分为两个阶段:Map和Reduce
1)Map阶段并行处理输入数据
2)Reduce阶段对Map结果进行汇总
Hadoop环境搭建 创建备用虚拟机 这里使用的链接克隆的虚拟机,更方便
镜像下载:https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/
三台虚拟机内存4G,硬盘50G
最小安装
自带vi编辑器,没有vim
修改静态IP: 《paralles》
1 2 yum install lsof lsof -i:22
如果处于监听。直接使用ssh连接,没有则安装(有可以跳过)
1 2 3 4 5 6 7 sudo yum –y install openssh-server openssh-clients sudo systemctl start sshd sudo systemctl status sshd sudo systemctl enable sshd
需要配置允许远程root登录(有可以跳过)
1 sudo vim /etc/ssh/sshd_config
之后先远程连接,虚拟机自己的界面不可以复制粘贴!!
配置国内镜像源(否则安装依赖太慢)
1 2 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup vim /etc/yum.repos.d/CentOS-Base.repo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [base] name=CentOS-$releasever - Base - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-$releasever - Updates - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-$releasever - Extras - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [centosplus] name=CentOS-$releasever - Plus - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [contrib] name=CentOS-$releasever - Contrib - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
1 2 3 4 yum clean all yum makecache
1 2 3 sudo yum install -y epel-release sudo yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git
1 2 3 4 5 6 7 8 9 10 11 12 13 sudo systemctl stop firewalld sudo systemctl disable firewalld sudo useradd deltaqin sudo passwd 000000 vi sudo root ALL=(ALL) ALL deltaqin ALL=(ALL) ALL
至此,基础环境搭建完成,
设置如下,开机的时候直接后台运行,使用ssh连接
设置之后重启parallels。创建快照
新建克隆
连接之后更换静态IP
1 2 3 4 vim /etc/sysconfig/network-scripts/ifcfg-eth0 reboot
1 2 3 4 sudo hostnamectl --static set -hostname hadoop101 sudo vim /etc/hosts
当前机器再创建快照之后克隆两台,相关配置:
1 2 3 4 5 6 7 8 9 10 sudo hostnamectl --static set -hostname hadoop102 vim /etc/sysconfig/network-scripts/ifcfg-eth0 reboot sudo hostnamectl --static set -hostname hadoop103 vim /etc/sysconfig/network-scripts/ifcfg-eth0 reboot
最终效果
在/opt目录下创建安装文件夹
在/opt目录下创建module、software文件夹,修改module、software文件夹的所有者cd
1 2 sudo mkdir /opt/module /opt/software sudo chown deltaqin:deltaqin /opt/module /opt/software
安装JDK 卸载现有****JDK
rpm -qa | grep -i java | xargs -n1 sudo rpm -e –nodeps
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # java安装包上传之后 mkdir -p /usr/java/latest tar -zxf software/jdk-8u212-linux-x64.tar.gz -C /usr/java/latest # 不建议直接编辑profile文件,可以自己定义一个profile文件 sudo vim /etc/profile.d/my_env.sh # 添加如下内容 #JAVA_HOME export JAVA_HOME=/usr/java/latest/jdk1.8.0_212 export PATH=$PATH:$JAVA_HOME/bin source /etc/profile java -version
安装Hadoop hadoop-3.1.3.tar.gz导入到opt目录下面的software文件夹下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 cd /opt/software/tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/ pwd /opt/module/hadoop-3.1.3 sudo vim /etc/profile.d/my_env.shexport HADOOP_HOME=/opt/module/hadoop-3.1.3export PATH=$PATH :$HADOOP_HOME /binexport PATH=$PATH :$HADOOP_HOME /sbinsource /etc/profilehadoop version Hadoop 3.1.3 sync sudo reboot
ssh配置免密登录 无密登录****配置
生成公钥和私钥: (只是针对当前用户生成,不同用户需要再次生成)
1 2 su deltaqin ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免密登录的目标机器上
1 2 3 ssh-copy-id hadoop101 ssh-copy-id hadoop102 ssh-copy-id hadoop103
出现:
The authenticity of host ‘192.168.1.103 (192.168.1.103)’ can’t be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
解决方案如下:直接输入yes
注意 :
还需要在 hadoop102 上 采用deltaqin账号,配置一下无密登录到hadoop101 、 hadoop102 、 hadoop103 ;否则不能用101登录其他服务器
还需要在hadoop103 上 采用deltaqin账号,配置一下无密登录到hadoop101 、 hadoop102 、hadoop 103 服务器 上。 否则不能用103登录其他服务器
配置完之后就可以做到真正的三个机器互通
.ssh文件夹下(~/.ssh)的文件功能解释
known_hosts
记录ssh访问过计算机的公钥(public key)
id_rsa
生成的私钥
id_rsa.pub
生成的公钥
authorized_keys
存放授权过的无密登录此服务器公钥
快速分发文件到所有节点–编写集群分发脚本xsync scp(secure copy)安全拷贝(不用) scp可以实现服务器与服务器之间的数据拷贝
1 2 scp -r $pdir /$fname $user @hadoop$host :$pdir /$fname
在hadoop101上,将hadoop101中/opt/module目录下的软件拷贝到hadoop102上。
scp -r /opt/module root@hadoop102:/opt/module
在hadoop103上,将hadoop101服务器上的/opt/module目录下的软件拷贝到hadoop103上。
sudo scp -r root@hadoop101:/opt/module root@hadoop103:/opt/module
注意 :拷贝过来的 /opt/module目录 , 别忘了在 hadoop102 、 hadoop103 上 修改 所有 文件的,所有者和所有者组 。
sudo c hown deltaqin:deltaqin -R /opt/module
1 2 3 4 5 sudo scp /etc/profile root@hadoop102:/etc/profilesudo scp /etc/profile root@hadoop103:/etc/profile
注意 :拷贝过来的配置文件别忘了source一下 /etc/profile, 。
rsync远程同步工具(不用) rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别: 用 rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
1 2 rsync -av $pdir /$fname $user @hadoop$host :$pdir /$fname 命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
把hadoop101机器上的/opt/software目录同步到hadoop102服务器的root用户下的/opt/目录
rsync -av /opt/software/ hadoop102:/opt/software
xsync集群分发 脚本 (用)循环复制文件到所有节点的相同目录下
1 rsync -av /opt/module root@hadoop103:/opt/
期望脚本:xsync要同步的文件名称
1 2 cd /home/deltaqinvim xsync
在该文件中编写如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # !/bin/bash # 1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi # 2. 遍历集群所有机器 for host in hadoop101 hadoop102 hadoop103 do echo ==================== $host ==================== # 3. 遍历所有目录,挨个发送 for file in $@ do #4 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 修改脚本 xsync 具有执行权限 chmod +x xsync # 将脚本移动到/bin中,以便全局调用 sudo mv xsync /bin/ # 同步需要的文件 sudo xsync /opt/ sudo xsync /usr/java/ sudo xsync /bin/xsync sudo xsync /etc/profile.d/my_env.sh # 在接收服务器测试 source /etc/profile hadoop version
配置集群**** 注意:NameNode和SecondaryNameNode不要安装在同一台服务器
注意:ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
节点分布
hadoop101
hadoop102
hadoop103
HDFS
NameNode DataNode
DataNode
SecondaryNameNode DataNode
YARN
NodeManager
ResourceManager NodeManager
NodeManager
core-site.xml 核心配置文件 1 2 3 4 # 核心配置文件 cd /opt/module/hadoop-3.1.3/etc/hadoop/ # 配置core-site.xml vim core-site.xml
文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?> <configuration > <property > <name > fs.defaultFS</name > <value > hdfs://hadoop101:8020</value > </property > <property > <name > hadoop.data.dir</name > <value > /opt/module/hadoop-3.1.3/data</value > </property > <property > <name > hadoop.proxyuser.deltaqin.hosts</name > <value > *</value > </property > <property > <name > hadoop.proxyuser.deltaqin.groups</name > <value > *</value > </property > </configuration >
hdfs-site.xml HDFS配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?> <configuration > <property > <name > dfs.namenode.name.dir</name > <value > file://${hadoop.data.dir}/name</value > </property > <property > <name > dfs.datanode.data.dir</name > <value > file://${hadoop.data.dir}/data</value > </property > <property > <name > dfs.namenode.checkpoint.dir</name > <value > file://${hadoop.data.dir}/namesecondary</value > </property > <property > <name > dfs.client.datanode-restart.timeout</name > <value > 30</value > </property > <property > <name > dfs.namenode.secondary.http-address</name > <value > hadoop103:9868</value > </property > </configuration >
yarn-site.xml yarn配置文件
文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?> <configuration > <property > <name > yarn.nodemanager.aux-services</name > <value > mapreduce_shuffle</value > </property > <property > <name > yarn.resourcemanager.hostname</name > <value > hadoop102</value > </property > <property > <name > yarn.nodemanager.env-whitelist</name > <value > JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value > </property > </configuration >
mapred-site.xml MapReduce配置文件
1 2 3 4 5 6 7 8 9 <?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="configuration.xsl" ?> <configuration > <property > <name > mapreduce.framework.name</name > <value > yarn</value > </property > </configuration >
配置workers
1 2 3 hadoop101 hadoop102 hadoop103
注意 :该文件中添加的 内容结尾 不允许有空格 ,文件中不允许有空行。
1 2 3 4 # 在集群上分发配置好的Hadoop配置文件 sudo xsync /opt/module/hadoop-3.1.3/etc/hadoop/ # 查看文件分发情况 cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
集群单点启动(不用) 1 2 3 4 5 6 7 8 9 10 hdfs namenode -format hdfs --daemon start namenode 3461 NameNode hdfs --daemon start datanode
集群群起(用) 基础是配置好ssh的无密登录
配置好workers
启动集群
格式化NN 如果集群是第一次启动 ,需要在hadoop101节点格式化NameNode(注意 格式化之前,一定要 先 停止 上次 启动的所有 namenode 和datanode进程,然后再删除data 和 log数据,见最后的常见问题 )
上面输出没有报错就可以
启动HDFS
启动hadoop,报错Error JAVA_HOME is not set and could not be found 在hadoop-env.sh中,再显示地重新声明一遍JAVA_HOME
export JAVA_H OME= /usr/ local /java/jdk1.8.0_271
启动YARN **在配置了ResourceManager的节点(hadoop102 )**启动YARN
Web端查看SecondaryNameNode http://hadoop103:9868/status.html
http://hadoop101:9870/dfshealth.html#tab-datanode
坑
在102上执行:(注意生成deltaqin的秘钥,而不是root否则permission denied)
如果101里面缺少NameNode。说明创建失败,可以重新执行hdfs namenode -format查看错误原因,我的是权限不足,因此执行sudo chmod -R a+w /opt/module/hadoop-3.1.3/data。 给了权限之后再次执行即可成功
集群启动/停止方式总结 各个服务组件逐一启动/停止 1 2 3 4 hdfs –daemon start/stop namenode/datanode/secondarynamenode yarn --daemon start/stop resourcemanager/nodemanager
各个模块分开启动/停止(配置ssh是前提)常用 1 2 3 4 start-dfs.sh/stop-dfs.sh start-yarn.sh/stop-yarn.sh
配置历史服务器 为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
配置mapred-site.xml vi mapred-site.xml
在该文件里面增加如下配置。
1 2 3 4 5 6 7 8 9 10 11 <property > <name > mapreduce.jobhistory.address</name > <value > hadoop101:10020</value > </property > <property > <name > mapreduce.jobhistory.webapp.address</name > <value > hadoop101:19888</value > </property >
分发配置,启动 1 2 3 4 5 6 xsync $HADOOP_HOME /etc/hadoop/mapred-site.xml mapred --daemon start historyserver jps
查看JobHistory http://hadoop101:19888/jobhistory
配置日志的聚集 应用运行完成以后,将 程序 运行日志信息上传到HDFS系统上。 可以方便的查看到程序运行详情,方便开发调试。
注意 :开启日志聚集功能, 需要 重新启动NodeManager 、ResourceManager和HistoryManager 。
配置yarn-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 <property > <name > yarn.log-aggregation-enable</name > <value > true</value > </property > <property > <name > yarn.log.server.url</name > <value > http://hadoop101:19888/jobhistory/logs</value > </property > <property > <name > yarn.log-aggregation.retain-seconds</name > <value > 604800</value > </property >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 xsync $HADOOP_HOME /etc/hadoop/yarn-site.xml stop-yarn.sh mapred --daemon stop historyserver start-yarn.sh mapred --daemon start historyserver
查看日志
http://hadoop101:19888/jobhistory
http://hadoop101:9870/ 主要页面
http://hadoop102:8088/cluster/nodes
下面两个图都一致就基本对了
编写脚本查看集群状态 grep -v 排除输出
1 2 3 4 5 6 #!/bin/bash for i in hadoop101 hadoop102 hadoop103do echo "============= $i ================" ssh $i "jps" | grep -v Jps done
1 2 3 chmod +x jpsallsudo mv jpsall /bin/jpsall
报错
已经安装jdk,配置好jdk的环境变量,且本机执行jps命令没有问题!
三台机器都执行一下
sudo ln -s /usr/local/java/jdk1.8.0_271/bin/jps /usr/local/bin/jps
之后在101:
xsync /bin/jpsall
就可以了
常见错误 无法访问此网站connection refused:端口号不对
DNS PROBE FINISHED NXDOMAIN:本机host配置不对
用户不对
切换到相应用户即可
最后找不到问题解决:格式化重启 删除data以及logs文件夹
格式化
在hadoop101节点格式化NameNode(注意 格式化之前,一定要 先 停止 上次 启动的所有 namenode 和datanode进程,然后再删除data 和 logs数据)
此时启动,如果提示失败,无法写data以及logs,需要改变一下这两个文件夹的权限,自己自动创建的时候 就会变成root用户的。
注意是递归给权限。
1 chown -R deltaqin:deltaqin logs data
1 2 3 stop-dfs.sh start-dfs.sh start-yarn.sh
集群时间同步(选做) 关键是时间一致,不是时间准确
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
主时间服务器配置(必须root用户) 1 2 3 4 5 sudo systemctl status ntpdsu systemctl stop ntpd systemctl disable ntpd
1 2 3 4 5 6 7 vim /etc/ntp.conf 为 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst 为 server 127.127.1.0 fudge 127.127.1.0 stratum 10 vim /etc/sysconfig/ntpd SYNC_HWCLOCK=yes systemctl start ntpd systemctl enable ntpd
其他机器配置(必须root用户) 在其他机器配置10分钟与时间服务器同步一次
1 2 3 4 5 6 7 8 9 crontab -e */10 * * * * /usr/sbin/ntpdate hadoop101 date -s "2017-9-11 11:11:11" date
说明: 测试的时候可以将 10分钟 调整为 1分钟 ,节省时间。
看端口 netstat -nltp
netstat -nltp |grep 4380
iotop :磁盘读写性能
top :系统进程
tree
free -h 查看内存
df -h 磁盘分区大小
du -h . 查看当前文件夹所占的大小