前提:搭建zookeeper集群、java环境、无秘互通 注意:文中加粗部分表示需要按实际情况修改的部分

zookeeper可以参考:zookeeper传送门

下载安装包

https://mirrors.tuna.tsinghua.edu.cn/apache/ 是官网提供的安装包下载网站之一。

结构

| 主机名 | study | centos156 | client | | -------- | -------- | -------- | |IP|192.168.233.155 | 192.168.233.156 | 192.168.233.158 | | 服务1 | zookeeper 1 | zookeeper 2 | zookeeper 3 | |服务2|namenode|namenode|| |服务3|datanode|datanode|datanode| |服务4|journalnode|journalnode|| |服务5|nodemanager|nodemanager|nodemanager| |服务6|zkfc|zkfc|| |服务7|ResourceManager|||| 服务简介: zookeeper:分布式应用程序协调服务。 namenode:管理服务。管理元数据,维护目录树,响应请求。 datanode:hadoop中存储数据。 journalnode:实现namenode数据共享,保持数据的一致性。 ResourceManager:yarn集群中资源的统一管理和分配 nodemanager:ResourceManager在每台机器上的代理 参考文档:hadoop介绍 注:zookeeper和hadoop可以不装在一个台机器上,只需配置文件指定即可

开始安装

主节点1-study

检查java环境 java -version 如果能够显示版本说明jdk安装ok

#下载文件(可能因为版本更新生效) cd /tmp wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz #解压文件 tar axf** hadoop-2.7.5/hadoop-2.7.5.tar.gz** -C /usr/local #重命名,方便管理配置 cd /usr/local **rename hadoop-2.7.5 hadoop hadoop-2.7.5 ** #修改环境变量 vim /etc/profile 在文件最后添加如下内容

export HADOOP_HOME=/usr/local/hadoop export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${PATH} export HADOOP_MAPARED_HOME=${HADOOP_HOME} export HADOOP_COMMON_HOME=${HADOOP_HOME} export HADOOP_HDFS_HOME=${HADOOP_HOME} export HADOOP_YARN_HOME=${HADOOP_HOME} export YARN_HOME=${HADOOP_HOME} export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop export LD_LIBRARY_PATH=${HADOOP_HOME}/lib/native/:${LD_LIBRARY_PATH} export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"

#使其生效 source /etc/profile #创建文件存放目录 mkdir -p /usr/local/hadoop/{name,data,tmp,journal} #修改配置文件 cd $HADOOP_HOME/etc/hadoop #修改slaves文件,指定slave服务器 vim slaves

study centos156 client

#修改core-site.xml,指定hdfs集群,临时文件目录,zookeeper等 vim core-site.xml

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop</value> <description>HDFS的逻辑服务名,hadoop位置可以写成任何东西</description> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> <description>hadoop临时文件存放目录,也可写作file:/usr/local/hadoop/tmp</description> </property>

<property> <name>io.file.buffer.size</name> <value>4096</value> <description>指定执行文件IO缓存区大小,机器好可以设置大些</description> </property> <property> <name>ha.zookeeper.quorum</name> <value>study:2181,centos156:2181,client:2181</value> <description>指定zookeeper地址</description> </property> </configuration>

参考文档

vim hdfs-site.xml

<configuration> <property> <name>dfs.nameservices</name> <value>hadoop</value> <description>HDFS NN的逻辑名称,需要与core-site.xml中的HDFS的逻辑服务名一致,这里使用上面的hadoop</description> </property> <property> <name>dfs.ha.namenodes.hadoop</name> <value>study,centos156</value> <description>hadoop逻辑名namenode节点列表,hadoop对应逻辑名</description> </property> <property> <name>dfs.namenode.rpc-address.hadoop.study</name> <value>study:9000</value> <description>hadoop中study的rpc通信地址</description> </property> <property> <name>dfs.namenode.http-address.hadoop.study</name> <value>study:50070</value> <description>hadoop中study的http通信地址</description> </property> <property> <name>dfs.namenode.rpc-address.hadoop.centos156</name> <value>centos156:9000</value> <description>hadoop中centos156的rpc通信地址</description> </property> <property> <name>dfs.namenode.http-address.hadoop.centos156</name> <value>centos156:50070</value> <description>hadoop中centos156的http通信地址</description> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://study:8485;centos156:8485;client:8485/hadoop</value> <description> journalNode 的 URI 地址,活动的namenode会将edit log写入journalNode</description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/journal</value> <description>用于存放 editlog 和其他状态信息的目录</description> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <description>启动自动failover,详情请看参考文档</description> </property> <property> <name>dfs.client.failover.proxy.provider.hadoop</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>实现客户端与 active NameNode 进行交互的 Java类</description> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <description>解决HA集群脑裂问题,只允许一个nn写数据</description> </property> <property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value> <description>the location stored ssh key,指定用户密匙,建议不要用root,用于故障转移,可以不设置</description> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>5000</value>
<description>ssh连接超时时间,上面秘钥没设置这个也可以不设置</description> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/name</value> <description>namenode数据存放目录</description> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/data</value> <description>datanode数据存放目录</description> </property> <property> <name>dfs.replication</name> <value>2</value> <description>client参数,node level参数,指定一个文件在hdfs中有几个副本,设置2或3即可,不能错过datanode节点数</description> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> <description>允许webhdfs,用于数据读取</description> </property> </configuration>

webhdfs详解

vim mapred-site.xml

<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>mapreduce框架,一般用yarn</description> </property> </configuration> MapReduce详解

vim yarn-site.xml

<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> <description>nodemanager启动时加载services的方式为mapreduce分配</description> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> <description>实现mapreduce_shuffle的java类</description> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>study</value> <description>resourcemanager节点列表,一个namenode上有即可</description> </property> </configuration>

修改脚本文件中的JAVA_HOME vim hadoop-env.sh

export JAVA_HOME=/usr/local/jdk

注意 export HADOOP_SSH_OPTS是自动hadoop服务ssh使用端口,如果你没有使用默认的22号端口,请修改该选项,否则HA无法实现

vim yarn-env.sh

JAVA_HOME=/usr/local/jdk

主节点二-centos156

#将study节点上的hadoop文件拷贝到centos156的/usr/local目录下 scp -r study:/usr/local/hadoop /usr/local #修改环境变量 scp -r study:/etc/profile /etc/ source /etc/profile #如果你使用的是其他的用户执行hadoop,就需要修改hadoop文件的属主等信息

从节点-client

#与 主节点二-centos156操作一样 scp -r study:/usr/local/hadoop /usr/local scp -r study:/etc/profile /etc/ source /etc/profile

启动hadoop集群

第一次运行hadoop是需要格式化数据,启动会比较麻烦,之后的启动只需要start-all.sh停止stop-all.sh

前提:zookeeper状态正常,jdk状态正常,环境变量设置正常

主节点1-study

#创建命名空间 hdfs zkfc -formatZK #启动journalnode hadoop-daemon.sh start journalnode(最好三个节点一起启动) #格式化namenode hdfs namenode -format hadoop #启动namenode hadoop-daemon.sh start namenode #启动zfkc hadoop-daemon.sh start zkfc

主节点二-centos156

#启动journalnode hadoop-daemon.sh start journalnode #从hdfs namenode -bootstrapStandby获取格式化后的元数据 hdfs namenode -bootstrapStandby #启动namenode hadoop-daemon.sh start namenode #启动zfkc hadoop-daemon.sh start zkfc

从节点-client

#启动journalnode hadoop-daemon.sh start journalnode

上面三个节点命令运行完成后重启hadoop集群 关闭集群

stop-all.sh

启动集群

start-all.sh

访问状态页面 http://192.168.233.155:50070/dfshealth.html#tab-overview

http://192.168.233.156:50070/dfshealth.html#tab-overview

页面上的datanodes可以看到datanode的状态,utilities可以查看文件和日志

hadoop常用命令 关闭集群 stop-all.sh 启动集群 start-all.sh 单独启动namenode hadoop-daemon.sh start namenode 单独启动datanode hadoop-daemon.sh start datanode 单独启动journalnode hadoop-daemon.sh start journalnode 单独启动zkfc hadoop-daemon.sh start zkfc 手动转移活动namenode hdfs haadmin -transitionToActive --forcemanual study

查看/下面的文件 hadoop fs -ls / 上传文件到hadoop hadoop fs -put <原文件> <存放路径> i.e. hadoop fs -put /etc/passwd / hadoop中创建命令 hadoop fs –mkdir <绝对路径> i.e. hadoop fs -mkdir /tmp 创建空文件 hadoop fs -touchz <文件绝对路径> i.e. hadoop fs -touchz /tmp/hello 查看文件 hadoop fs -cat <文件绝对路径> i.e. hadoop fs -cat /passwd 移动或重命名 hadoop fs -mv <文件绝对路径> <新文件绝对路径\名称> 下载hadoop中的文件或目录到本地
hadoop fs -get <文件绝对路径> <本地路径> i.e. hadoop fs -get /passwd /tmp 修改文件权限 hadoop fs -chmod [-R] <文件绝对路径> i.e. hadoop fs -chmod 777 /passwd 删除文件 hadoop fs -rm <文件绝对路径> 删除目录 hadoop fs -rm -r <目录绝对路径>

hadoop数据迁移

数据备份

mkdir /tmp/hadoop chmod 777 /tmp/hadoop hadoop fs -copyToLocal hdfs://study:9000/ /tmp/hadoop

数据恢复 先用u盘或者其他的任何方式将文件传输到目标机器

hadoop fs -copyFromLocal /tmp/hadoop hdfs://study:9000/ hadoop fs -ls /

报错处理

master: Host key verification failed. 请检查authorized_keys 和known_hosts文件是是否有该主机的信息,ssh 主机名能不能连上

hadoop集群一个主节点namenode挂掉之后启动异常 2018-01-17 08:53:24,751 FATAL [hadoop1:16000.activeMasterManager] master.HMaster: Failed to become active master org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87) at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1774) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1313) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3850) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1011) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:843) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)

处理过程: 查看状态(看web页面)发现study的状态为standby,centos156状态为active 如果有一个active这集群状态依然是正常的,如果两个都是standby则为异常。

状态不正常可能是数据异常造成的,namenode挂的时间长了数据不同步,处理方法一、从centos 156节点将数据同步过来,方法二、删除所有节点上所有hadoop的数据,删除zk中hadoop-ha目录 本次使用的是方法二 所有节点删除${HADOOP_HOME}下name、data、logs、tmp目录下的所有文件 删除zk中的数据 zkCli.sh ls / rmr /hadoop-ha quit

重新生成数据 主节点1-study #创建命名空间 hdfs zkfc -formatZK #启动journalnode hadoop-daemon.sh start journalnode(最好三个节点一起启动) #格式化namenode hdfs namenode -format hadoop #启动namenode hadoop-daemon.sh start namenode #启动zfkc hadoop-daemon.sh start zkfc 主节点二-centos156 #启动journalnode hadoop-daemon.sh start journalnode #从hdfs namenode -bootstrapStandby获取格式化后的元数据 hdfs namenode -bootstrapStandby #启动namenode hadoop-daemon.sh start namenode #启动zfkc hadoop-daemon.sh start zkfc

从节点-client #启动journalnode hadoop-daemon.sh start journalnode

查看状态肯定是active,都是新的了

!!!!注意!!! 重新构建hadoop数据会导致hbase无法获取zookeeper中的数据,暂时不知道如何恢复,只能删除zookeeper中的/hbase/table表

参考

hadoop介绍 配置文件参考文档 webhdfs详解 hadoop HDFS常用文件操作命令 hadoop fs管理文件权限:https://www.cnblogs.com/linn/p/5526071.html