Hadoop环境搭建

开始正式搭建Hadoop环境,之所以分开写,也是便于阅读及以后参考。

Hadoop环境的搭建过程中,需要配置几个XML文件,接下来简单介绍下这几个XML文件的作用

core-site.xml

主要配置NameNode的一些信息,主要属性如下:

<configuration>
    <!-- 指定hdfs的nameservice名称空间为ns -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns</value>
    </property>
    <!-- 指定hadoop临时目录,默认在/tmp/{$user}目录下,不安全,每次开机都会被清空-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/hdpdata/</value>
        <description>需要手动创建hdpdata目录</description>
    </property>
    <!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node01:2181,node02:2181,node03:2181</value>
        <description>zookeeper地址,多个用逗号隔开</description>
    </property>
</configuration>

hdfs-site.xml

主要配置hdfs

<configuration>
    <!-- NameNode HA配置 -->
    <property>
        <name>dfs.nameservices</name>
        <value>ns</value>
        <description>指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致</description>
    </property>
    <property>
        <name>dfs.ha.namenodes.ns</name>
        <value>nn1,nn2</value>
        <description>ns命名空间下有两个NameNode,逻辑代号,随便起名字,分别是nn1,nn2</description>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns.nn1</name>
        <value>node01:9000</value>
        <description>nn1的RPC通信地址</description>
    </property>
    <property>
        <name>dfs.namenode.http-address.ns.nn1</name>
        <value>node01:50070</value>
        <description>nn1的http通信地址</description>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns.nn2</name>
        <value>node02:9000</value>
        <description>nn2的RPC通信地址</description>
    </property>
    <property>
        <name>dfs.namenode.http-address.ns.nn2</name>
        <value>node02:50070</value>
        <description>nn2的http通信地址</description>
    </property>
    <!--JournalNode配置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node03:8485;node04:8485;node05:8485/ns</value>
        <description>指定NameNode的edits元数据在JournalNode上的存放位置</description>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/local/hadoop/journaldata</value>
        <description>指定JournalNode在本地磁盘存放数据的位置</description>
    </property>
    <!--namenode高可用主备切换配置 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
        <description>开启NameNode失败自动切换</description>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.ns</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>配置失败自动切换实现方式,使用内置的zkfc</description>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
        <description>配置隔离机制,多个机制用换行分割,先执行sshfence,执行失败后执行shell(/bin/true),/bin/true会直接返回0表示成功</description>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
        <description>使用sshfence隔离机制时需要ssh免登陆</description>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
        <description>配置sshfence隔离机制超时时间</description>
    </property>
    <!--dfs文件属性设置-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <description>设置block副本数为3</description>
    </property>

    <property>
        <name>dfs.block.size</name>
        <value>134217728</value>
        <description>设置block大小是128M</description>
    </property>
</configuration>

yarn-site.xml

yarn的一些配置信息
由于我们是在虚拟机中配置,hadoop默认集群内存大小为8192MB,一般来说是不够的,需要加参数限制,见下方对内存的设置,当然土豪随意

<configuration>
    <!-- 开启RM高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!-- 指定RM的cluster id,一组高可用的rm共同的逻辑id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-ha</value>
    </property>
    <!-- 指定RM的名字,可以随便自定义 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <!-- 分别指定RM的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>node01</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>${yarn.resourcemanager.hostname.rm1}:8088</value>
        <description>HTTP访问的端口号</description>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>node02</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>${yarn.resourcemanager.hostname.rm2}:8088</value>
    </property>
    <!-- 指定zookeeper集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node01:2181,node02:2181,node03:2181</value>
    </property>
    <!--NodeManager上运行的附属服务,需配置成mapreduce_shuffle,才可运行MapReduce程序-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 开启日志聚合 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 日志聚合HDFS目录 -->
    <property>
        <name>yarn.nodemanager.remote-app-log-dir</name>
        <value>/data/hadoop/yarn-logs</value>
    </property>
    <!-- 日志保存时间3days,单位秒 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>259200</value>
    </property>
        <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>2048</value>
        <discription>单个任务可申请最少内存,默认1024MB</discription>
     </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
        <discription>nodemanager默认内存大小,默认为8192MB(value单位为MB)</discription>
        </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>1</value>
                 <discription>nodemanager cpu内核数</discription>
    </property>
</configuration>

环境搭建

主机名 IP 安装软件 运行的进程
node01 192.168.47.10 JDK、Hadoop、Zookeeper NameNode(Active)、DFSZKFailoverController(zkfc)、ResourceManager(Standby)、QuorumPeerMain(Zookeeper)
node02 192.168.47.11 JDK、Hadoop、Zookeeper NameNode(Standby)、DFSZKFailoverController(zkfc)、ResourceManager(Active)、QuorumPeerMain(Zookeeper)、Jobhistory
node03 192.168.47.12 JDK、Hadoop、Zookeeper DataNode、NodeManager、QuorumPeerMain(Zookeeper)、JournalNode
node04 192.168.47.13 JDK、Hadoop DataNode、NodeManager、JournalNode
node05 192.168.47.14 JDK、Hadoop DataNode、NodeManager、JournalNode

本次环境搭建规划如下:

主机名 IP 安装软件 运行的进程
node01 192.168.47.10 JDK、Hadoop、Zookeeper NameNode(Active)、DFSZKFailoverController(zkfc)、ResourceManager(Standby)、QuorumPeerMain(Zookeeper)
node02 192.168.47.11 JDK、Hadoop、Zookeeper NameNode(Standby)、DFSZKFailoverController(zkfc)、ResourceManager(Active)、QuorumPeerMain(Zookeeper)、Jobhistory
node03 192.168.47.12 JDK、Hadoop、Zookeeper DataNode、NodeManager、QuorumPeerMain(Zookeeper)、JournalNode
node04 192.168.47.13 JDK、Hadoop DataNode、NodeManager、JournalNode
node05 192.168.47.14 JDK、Hadoop DataNode、NodeManager、JournalNode

搭建过程中,无特殊说明,均为使用hadoop用户

  • 上传hadoop安装包,本次采用hadoop2.7.4版本
  • 解压tar -xzvf hadoop-2.7.4.tar.gz目录放在hadoop用户家目录apps下
  • 切换root用户,创建软链接ln -s /home/hadoop/apps/hadoop-2.7.4 /usr/local/hadoop
  • 修改属主chown -R hadoop:hadoop /usr/local/hadoop
  • 修改环境变量:vim /etc/profile,添加如下变量,其中,PATH为追加变量
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=$HADOOP_HOME
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  • 编译环境变量source /etc/profile
  • 切换回hadoop用户,进入hadoop配置文件路径cd /usr/local/hadoop/etc/hadoop
  • 修改hadoop-env.sh中JAVA_HOME为jdk安装路径/快捷路径
  • 配置core-site.xml为之前xml内容
  • 配置hdfs-site.xml为之前内容
  • 配置yarn-site.xml为之前内容
  • 配置mapred-site.xml为如下内容(Hadoop安装文件中此文件给的为mapred-site.xml.template,需修改为mapred-site.xml)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <description>指定mr框架为yarn方式 </description>
    </property>
    <!-- 历史日志服务jobhistory相关配置 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>node02:10020</value>
        <description>历史服务器端口号</description>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>node02:19888</value>
        <description>历史服务器的WEB UI端口号</description>
    </property>
    <property>
        <name>mapreduce.jobhistory.joblist.cache.size</name>
        <value>2000</value>
        <description>内存中缓存的historyfile文件信息(主要是job对应的文件目录)</description>
    </property>
</configuration>
  • 手动创建指定的临时目录:mkdir /usr/local/hadoop/hdpdata
  • 修改slaves文件,设置datanode和nodemanager启动节点主机名称
    在slaves文件中添加节点的主机名称
    node03
    node04
    node05

配置hadoop用户免密码登录

需要配置集群之间的免密码登录

  • 在所有节点产生秘钥及公钥ssh-keygen -t rsa
  • 在每个节点上,将公钥copy到node01ssh-copy-id -i node01
  • 将node01节点上的authorized_keys copy到其他节点scp authorized_keys hadoop@node02:/home/hadoop/.ssh
  • 每个节点分别尝试与其他节点的ssh登录,包括自己ssh node01,如果需要输入密码,则是第一次登录,输入就好

在其他节点配置hadoop

  • 将配置好的hadoop安装目录copy到其他节点(切换到hadoop安装目录)scp -r hadoop-2.7.4 hadoop@node02:/home/hadoop/apps
  • 创建软链接,修改软链接属主
  • 添加环境变量
    至此,集群环境准备工作基本就绪,检查一下防火墙是否关闭(iptables -L),及SELinux的状态(getenforce),防止启动时出错
    防火墙关闭但selinux不正常.jpg

    上图中,防火墙状态正常,但SELinux不对,设置SELinuxsetenforce 0,再看状态变为Permissive

启动集群

  • 切换回hadoop用户
  • 启动journalnode(分别在node03、node04、node05上启动)/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode启动成功后,jps会看到多了如下进程JournalNode
  • 格式化HDFS 在node01上执行命令hdfs namenode -format,格式化成功后会在core-site.xml中的hadoop.tmp.dir指定的路径下生成dfs文件夹,将该文件夹拷贝到node02的相同路径下
    scp -r hdpdata hadoop@node02:/usr/local/hadoop
  • 在node01上执行格式化ZKFC的操作hdfs zkfc -formatZK执行成功,日志输出如下信息
    INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK
    格式化zkfc成功.jpg
  • 在node01上启动HDFSsbin/start-dfs.sh
    启动成功后,在node03、node04、node05会出现datanode进程,在node01、node02会出现NameNode进程及DFSZKFailoverController进程
  • 在node02上启动YARNsbin/start-yarn.sh
  • 在node01单独启动一个ResourceManger作为备份节点sbin/yarn-daemon.sh start resourcemanager
  • 在node02上启动JobHistoryServersbin/mr-jobhistory-daemon.sh start historyserver
  • 至此,hadoop启动完成
HDFS HTTP访问地址
NameNode (active):http://192.168.47.10:50070
NameNode (standby):http://192.168.47.11:50070
ResourceManager HTTP访问地址
ResourceManager :http://192.168.47.11:8088
历史日志HTTP访问地址
JobHistoryServer:http://192.168.47.11:19888

集群验证

  • 验证HDFS 是否正常工作及HA高可用
  1. 向hdfs上传一个文件 hadoop fs -put /usr/local/hadoop/README.txt /
  2. 在active节点手动关闭active的namenodesbin/hadoop-daemon.sh stop namenode
  3. 通过HTTP 50070端口查看standby namenode的状态是否转换为active,再手动启动上一步关闭的namenodesbin/hadoop-daemon.sh start namenode
  • 验证YARN是否正常工作及ResourceManager HA高可用
  1. 运行测试hadoop提供的demo中的WordCount程序:
hadoop fs -mkdir /wordcount
hadoop fs -mkdir /wordcount/input 
hadoop fs -mv /README.txt /wordcount/input 
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /wordcount/input  /wordcount/output

注意:HDFS 上/wordcount/output 为输出路径不能存在,否则任务不能执行

  • 验证ResourceManager HA
  1. 手动关闭node02的ResourceManagersbin/yarn-daemon.sh stop resourcemanager
  2. 通过HTTP 8088端口访问node01的ResourceManager查看状态
  3. 手动启动node02 的ResourceManagersbin/yarn-daemon.sh start resourcemanager

附录:

  • 关闭Journalnode: hadoop目录下:sbin/hadoop-daemon.sh stop journalnode
  • 在刚开始搭建时,没有配置nodemanager内存大小,导致nodemanager启动不起来,查看日志,通过网络搜索,发现是内存不够,需要配置nodemanager的内存参数,见上文,内存参数为后来补充
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342