首先咱们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。它实际上是将一个大文件分红若干块保存在不一样服务器的多个节点中。经过联网让用户感受像是在本地同样查看文件,为了下降文件丢失形成的错误,它会为每一个小文件复制多个副本(默认为三个),以此来实现多机器上的多用户分享文件和存储空间。html
Hadoop主要包含三个模块:java
本节将会介绍Hadoop集群的配置,目标主机咱们能够选择虚拟机中的多台主机或者多台阿里云服务器。node
注意:如下全部操做都是在root用户下执行的,所以基本不会出现权限错误问题。linux
VMware虚拟机有三种网络模式,分别是Bridged(桥接模式)、NAT(网络地址转换模式)、Host-only(主机模式):web
桥接:选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系,至关于链接在同一交换机上;算法
NAT:NAT模式就是虚拟机要联网得先经过宿主机才能和外面进行通讯;apache
具体区别能够参考博客:Vmware虚拟机下三种网络模式配置。vim
VMware Workstation Pro 15中文破解版下载地址:http://www.zdfans.com/html/16025.html,参考安装破解教程进行安装。centos
CentOS7下载地址;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso。安全
在Vmware中安装CentOS7的步骤能够参考博客:VMware安装Centos7超详细过程(图文)(包含克隆模式)。
一、网络模式配置为桥接模式,CentOS7网络IP配置参考博客:Centos7虚拟机桥接模式设置静态ip。
二、配置主机名
vi /etc/sysconfig/network
三、配置Host
vi /etc/hosts
192.168.1.100为CentOS7网络IP配置中设置的本机的静态IP地址。
四、关闭防火墙和selinux
service iptables stop
vim /etc/sysconfig/selinux
若是能够申请到阿里云服务器推荐使用阿里云服务器,这里申请的时CentOS 7.2,相关步骤能够参考博客:大数据 -- zookeeper和kafka集群环境搭建第一节。
查看防火墙状态:
systemctl status firewalld
若是是开启,须要利用命令将防火墙关闭:
systemctl stop firewalld
systemctl disable firewalld
JDK安装能够参考博客大数据 -- zookeeper和kafka集群环境搭建第二节。
Hadoop部署模式主要有:本地模式、伪分布模式、彻底分布式模式、HA彻底分布式模式。
区分的依据是NameNode、DataNode、ResourceManager、NodeManager等模块运行在几个JVM进程、几个机器。
模式名称 | 各个模块占用的JVM进程数 | 各个模块运行在几个机器数上 |
---|---|---|
本地模式 | 1个 | 1个 |
伪分布式模式 | N个 | 1个 |
彻底分布式模式 | N个 | N个 |
HA彻底分布式 | N个 | N个 |
下面我选择将Hadoop伪分布式模式安装在阿里云服务器zy1主机上。伪分布式模式能够看做是彻底分布式,可是跑在一个节点上,全部的进程都配置在一个节点上,拥有分布式文件系统,只不过这个系统只有一个节点。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz tar -zxvf hadoop-2.8.5.tar.gz -C /opt/bigdata
从新命名:
mv hadoop-2.8.5 hadoop
vim /etc/profile
追加配置:
export HADOOP_HOME=/opt/bigdata/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
使配置生效:
. /etc/profile
echo $HADOOP_HOME
修改hadoop-env.sh:
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
修改JAVA_HOME参数为:
export JAVA_HOME=/usr/lib/jvm/java
vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
添加内容以下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://zy1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/bigdata/data/hadoop</value> </property> </configuration>
建立临时目录:
mkdir -p /opt/bigdata/data/hadoop
vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
添加内容以下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
dfs.replication配置的是HDFS存储时的备份数量,由于这里是伪分布式环境只有一个节点,因此这里设置为1。
hdfs namenode -format
注意:若是格式化成功了,不能够再继续格式化,若是想继续格式化能够参考Hadoop1从新格式化HDFS。若是没有格式化成功,须要一直格式化。
格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/bigdata/data/hadoop目录)指定的目录下是否有了dfs目录,若是有,说明格式化成功。
ll /opt/bigdata/data/hadoop
其中/opt/bigdata/data/hadoop/dfs/name/current下文件以下:
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
jps
HDFS上建立目录:
hdfs dfs -mkdir /demo1
上传本地文件到HDFS上:
hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /demo1
读取HDFS上的文件内容:
hdfs dfs -cat /demo1/core-site.xml
从HDFS上下载文件到本地:
hdfs dfs -get /demo1/core-site.xml
更多hdfs文件系统的命令能够查看:
hdfs dfs
默认没有mapred-site.xml文件,可是有个mapred-site.xml.template配置模板文件。复制模板生成mapred-site.xml:
cd /opt/bigdata/hadoop/
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
添加配置
vim etc/hadoop/mapred-site.xml
指定mapreduce运行在yarn框架上。
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
vim etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services配置了yarn的默认混洗方式,选择为mapreduce的默认混洗算法。
yarn.resourcemanager.hostname指定了Resourcemanager运行在哪一个节点上。
<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>zy1</value>
</property>
</configuration>
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
能够看到ResourceManager、NodeManager已经启动成功了。
YARN的Web客户端端口号是8088,经过http://106.15.74.155:8088/能够查看当前执行的job。
注意:因为使用到了8088端口。须要在阿里云中配置入规则,具体能够参考阿里云官方收藏:同一个地域、不一样帐号下的实例实现内网互通 。
hdfs的Web客户端端口号是50070,经过http://106.15.74.155:50070/能够查看。
在Hadoop的share目录里,自带了一些jar包,里面带有一些mapreduce实例小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar,能够运行这些例子体验刚搭建好的Hadoop平台,咱们这里来运行最经典的WordCount实例。
在hdfs文件系统上建立测试用的Input文件:
hdfs dfs -mkdir -p /wordcountdemo/input
建立原始文件:
在本地/opt/bigdata/data/hadoop目录建立一个文件wc.input,vim /opt/bigdata/data/hadoop/wc.input内容以下:
doop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop
将wc.input文件上传到HDFS的/wordcountdemo/input目录中:
hdfs dfs -put /opt/bigdata/data/hadoop/wc.input /wordcountdemo/input
运行WordCount MapReduce Job:
cd /opt/bigdata/hadoop yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /wordcountdemo/input /wordcountdemo/output
注意:若是执行一直卡在map 0% reduce 0%,多是因为硬件配置较低的缘由:
更多错误能够查看日志:$HADOOP_HOME/logs:
more $HADOOP_HOME/logs/yarn-root-nodemanager-zy1.log more $HADOOP_HOME/logs/yarn-root-resourcemanager-zy1.log
若是运行成功,查看输出结果目录:
hdfs dfs -ls /wordcountdemo/output
output目录中有两个文件:
查看输出文件内容:
hdfs dfs -cat /wordcountdemo/output/part-r-00000
结果是按照键值排好序的。
hadoop-daemon.sh stop namenode hadoop-daemon.sh stop datanode hadoop-daemon.sh stop secondarynamenode yarn-daemon.sh stop resourcemanager yarn-daemon.sh stop nodemanager
Hadoop开启历史服务能够在web页面上查看Yarn上执行job状况的详细信息。能够经过历史服务器查看已经运行完的Mapreduce做业记录,好比用了多少个Map、用了多少个Reduce、做业提交时间、做业启动时间、做业完成时间等信息。
mr-jobhistory-daemon.sh start historyserver
开启后,能够经过Web页面查看历史服务器:http://106.15.74.155:19888/
MapReduce是在各个机器上运行的,在运行过程当中产生的日志存在于各个机器上,为了可以统一查看各个机器的运行日志,将日志集中存放在HDFS上,这个过程就是日志汇集。
Hadoop默认是不启用日志汇集的。在yarn-site.xml文件里配置启用日志汇集。
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>106800</value> </property>
yarn.log-aggregation-enable:是否启用日志汇集功能。
yarn.log-aggregation.retain-seconds:设置日志保留时间,单位是秒。
重启Yarn进程:
stop-yarn.sh start-yarn.sh
重启HistoryServer进程:
mr-jobhistory-daemon.sh stop historyserver mr-jobhistory-daemon.sh start historyserver
测试日志汇集:运行一个demo MapReduce,使之产生日志:
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /wordcountdemo/input /wordcountdemo/output
运行Job后,就能够在历史服务器Web页面查看各个Map和Reduce的日志了。
彻底分部式是真正利用多台Linux主机来进行部署Hadoop,对Linux机器集群进行规划,使得Hadoop各个模块分别部署在不一样的多台机器上。
若是以前你是在虚拟机上建立了zy1主机,那么你能够利用Vmware的克隆功能建立zy二、zy3主机,而后你须要按照第二节的步骤,配置网络、主机名、Host、这里就不过多介绍了。
下面咱们以阿里云的三台主机zy一、zy二、zy3为例,搭建彻底分布式。
zy1 | zy2 | zy3 |
---|---|---|
NameNode | ResourceManage | |
DataNode | DataNode | DataNode |
NodeManager | NodeManager | NodeManager |
HistoryServer | SecondaryNameNode |
在zy1节点安装新的Hadoop:
为了和以前zy1机器上安装伪分布式Hadoop区分开来,咱们将zy1上的Hadoop服务都中止掉,将伪分布式hadoop的安装目录改成hadoop-wei,修改配置core-site.xml,中的hadoop.tmp.dir为/opt/bigdata/data/hadoop-wei,而后/opt/bigdata/下安装另一个Hadoop。
hadoop-daemon.sh stop namenode hadoop-daemon.sh stop datanode hadoop-daemon.sh stop secondarynamenode yarn-daemon.sh stop resourcemanager yarn-daemon.sh stop nodemanager
cd /opt/bigdata
mv hadoop hadoop-wei
vim hadoop-wei/etc/hadoop/core-site.xml #修改hadoop.tmp.dir
mv /opt/bigdata/data/hadoop /opt/bigdata/data/hadoop-wei
咱们采用先在第一台机器上解压、配置Hadoop,而后再分发到其余两台机器上的方式来安装集群。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz tar -zxvf hadoop-2.8.5.tar.gz -C /opt/bigdata
mv hadoop-2.8.5 hadoop
因为在伪分布式安装时,咱们已经配置了hadoop的环境变量,这里就不须要再重复配置了。咱们能够经过如下命令验证:
echo $HADOOP_HOME
好比修改hadoop-env.sh:
vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
修改JAVA_HOME参数为:
export JAVA_HOME=/usr/lib/jvm/java
vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
添加内容以下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://zy1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/bigdata/data/hadoop</value> </property>
<property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data</value> </property> </configuration>
mkdir /opt/bigdata/data/hadoop
注意:NameNode使用到了9000端口,用于创建与datanode节点的通讯。所以namenode节点须要在阿里云中配置入规则,具体能够参考阿里云官方收藏:同一个地域、不一样帐号下的实例实现内网互通 。
vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
添加如下内容:
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>zy3:50090</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.client.use.datanode.hostname</name> <value>true</value> </property> <property> <name>dfs.datanode.use.datanode.hostname</name> <value>true</value> </property> </configuration>
fs.client.use.datanode.hostname:是否客户端应该使用DN的HostName,在链接DN时,默认是使用IP;(必须设置为true)
dfs.datanode.use.datanode.hostname:是否DN应该使用HostName链接其它DN,在数据传输时。默认是是IP。(必须设置为true)
cd hadoop
vim etc/hadoop/masters
vim etc/hadoop/slaves
masters修改成:
slavers:
masters文件是指定HDFS的主节点。
slaves文件是指定HDFS上有哪些DataNode节点。
默认没有mapred-site.xml文件,可是有个mapred-site.xml.template配置模板文件。复制模板生成mapred-site.xml:
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
添加配置:
vim etc/hadoop/mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>zy1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>zy1:19888</value> </property> </configuration>
vim etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>zy2</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>106800</value> </property> </configuration>
yarn.log-aggregation-enable
是配置是否启用日志汇集功能;yarn.log-aggregation.retain-seconds
是配置汇集的日志在HDFS上最多保存多长时间;Hadoop集群中的各个机器间会相互地经过SSH访问,每次访问都输入密码是不现实的,因此要配置各个机器间的SSH是无密码登陆的。
在zy1上生成公钥:
ssh-keygen -t rsa
一路回车,都设置为默认值,而后再当前用户的Home目录下的.ssh
目录中会生成公钥文件(id_rsa.pub)
和私钥文件(id_rsa)
。
分发公钥:
ssh-copy-id zy1 ssh-copy-id zy2 ssh-copy-id zy3
设置zy二、zy3到其余机器的无密钥登陆:一样的在zy二、zy3上生成公钥和私钥后,将公钥分发到三台机器上。
经过Scp分发:Hadoop根目录下的share/doc目录是存放的hadoop的文档,文件至关大,建议在分发以前将这个目录删除掉,能够节省硬盘空间并能提升分发的速度。
cd /opt/bigdata rm -rf hadoop/share/doc scp -r /opt/bigdata/hadoop/ zy2:/opt/bigdata scp -r /opt/bigdata/hadoop/ zy3:/opt/bigdata
在每一个节点下执行:
mkdir /opt/bigdata/data/hadoop
在使用hadoop以前,全新的HDFS安装须要进行格式化。经过建立存储目录和初始化版本的namenode持久数据结构,格式化将建立一个空的文件系统。
在NameNode机器上(节点zy1)执行格式化:
hdfs namenode -format
注意:若是须要从新格式化NameNode,须要先将原来NameNode和DataNode下的文件所有删除,否则会报错,NameNode和DataNode所在目录是在core-site.xml中hadoop.tmp.dir、dfs.namenode.name.dir、dfs.datanode.data.dir属性配置的。
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://zy1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/bigdata/data/hadoop</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data</value> </property> </configuration>
每次格式化,默认是建立一个集群ID,并写入NameNode的VERSION文件中(VERSION文件所在目录为dfs/name/current )。
此时并无将集群ID写入DataNode的VERSION之中,因为namenode管理全部的文件系统的元数据,datanode能够动态的加入或离开集群,因此初始的格式化过程不涉及datanode。
只有在启动HDFS时,才会将ID写入DataNode的VERSION之中。若是咱们从新格式化HDFS,从新格式化时,默认会生成一个新的集群ID,若是不删除原来的数据目录,会致使namenode中的VERSION文件中是新的集群ID,而DataNode中是旧的集群ID,不一致时会报错。
在zy1节点运行如下命令:
start-dfs.sh
zy3中的QuorumPeerMain进程不用管,这个是zookeeper进程。
咱们来查看如下各个节点的NameNode和DataNode目录:
能够看到已经将集群ID写入DataNode的VERSION之中:
start-yarn.sh
在zy2上启动ResourceManager:
yarn-daemon.sh start resourcemanager
由于咱们规划的是在zy1服务器上运行MapReduce日志服务,因此要在zy1上启动:
mr-jobhistory-daemon.sh start historyserver
如今来查看如下每一个节点下的日志文件:
hdfs的Web客户端端口号是50070,经过http://106.15.74.155:50070/能够查看。
YARN的Web客户端端口号是8088,因为ResourceManager设置在zy2节点上,所以经过http://47.103.134.70:8088/查看当前执行的job。
测试部分能够参考伪分布式测试内容http://www.javashuo.com/article/p-hsmxgagy-by.html。
在测试时会出现以下错误:
咱们须要配置阿里云的入规则,开放三个节点的50010端口:
此外,咱们还须要在阿里云安全组规则入规则开放每一个节点的803一、803二、50020等等。每一个节点具体须要开放什么端口,咱们能够经过查看日志得到,以节点zy2,为例:
cat logs/hadoop-root-datanode-zy2.log
cat logs/yarn-root-nodemanager-zy2.log
经过如下命令,能够查看该节点监听的端口:
netstat -ant
若是实在不知道须要在阿里云安全组规则中配置哪些端口,那就打开所有端口,可是这样可能并不安全:
Hadoop更多端口相关的配置参考:hadoop端口号配置信息、ResourceManager相关配置参数。
更多Hadoop的参数配置能够惨开:hadoop 参数配置。
在各个节点下运行以下命令:
cd /opt/bigdata/hadoop sbin/stop-all.sh
在每一个节点运行以下命令:
cd /opt/bigdata/hadoop sbin/stop-all.sh rm -rf logs/* rm -rf ../data/hadoop/*
在namenode节点(zy1)运行:
hdfs namenode -format
而后在每一个节点运行相应启动hadoop的命令。
若是hadoop启动出现出错,要学会查看日志,日志位于hadoop安装路径下的logs目录下。
外网没法方位HDFS能够参考:外网没法访问云主机HDFS文件系统。
参考文章