Hadoop原理与安装
Hadoop的两大核心原理:MapReduce和HDFS,在安装Hadoop之前一定要深入的理解这些原理,才有助于安装过程中的故障排查以及以后使用中的问题分析。
HDFS:就是分布式的一群存储拼接成一个大存储,集群内数据做分片、备份、元数据管理、消息通信等,这些对于使用者来说是透明的。
Block(数据块):最基本的存储单元,一个文件可以存为多个block,每个block可以在多个datanode上保留副本,默认为3份。
Datanode(数据节点-需要重点掌握):真正负责存储的节点。
Namenode(元数据节点-需要重点掌握):负责管理文件目录、文件与block的对应关系,以及block与datanode的关系。Namenode的元数据是在内存中管理的,相关的有2个文件,fsimage - 它是在NameNode启动时对整个文件系统的快照;edit logs -它是在NameNode启动后,对文件系统的改动序列。显然edit logs将会随运行越久不断增长直到下次重启。
SecondaryNameNode:就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。
以上是HDFS相关的定义,下面再来看下运行时Hadoop各个节点间是如何协作的。对HDFS的操作主要是读和写。
HDFS的写:Client负责拆分block
HDFS的读:Client负责append block
HDFS优点:高可用性、高扩展性、低成本
缺点:延时性、不支持多用户写入、无法高效管理海量小文件
MapReduce经历了1.0时代和2.0时代,2.0又叫YARN。
Mapreduce1.0原理
JobClient:门户,代理,拉皮条的,提交job给jobTracker
JobTracker负责管理job的失败、重启等
TaskTracker,真正干活的节点
MapReduce存在的缺陷:
1 Job Tracker 存在单点故障
2 Job Tracker 完成太多任务,当MR任务非常多时,造成很大的内存开销
3 Task Tracker 端,如果两个大内存消耗的任务一起调度,容易出现OOM,如果只有Map任务或Reduce任务时会造成资源浪费
MapReduce2.0-YARN原理
ResourceManager:YARN资源框架控制中心,负责集群资源管理调度
NodeManager:是resourceManager在每台机器上的代理,负责容器管理,监控资源使用情况(CPU、内存、磁盘、网络等)
container:真正干活的容器,容器里运行task和applicationMaster,可以是任何命令(例如java、python、C++)
applicationMaster:任务大总管,负责向resourceManager申请资源,请求nodeManager启动container并告知container要做什么事情
与老的MapReduce相比,YARN把资源管理与任务调度的工作分离开来(交给ApplicationMaster去做),减少了MapReduce中Job Tracker的压力
我准备搭建3节点的Hadoop集群:
192.168.226.135 master
192.168.226.133 slaver1
192.168.226.136 slaver2
1规划集群
我准备搭建一个3节点的hadoop集群,master、slaver1、slaver2,我现在有3台虚拟机(centos7.0),先配置好操作系统的hostname和hosts
机器1:192.168.226.135à mastr
修改/etc/hostname,机器名修改为master
修改/etc/hosts,添加其它两个节点的映射:
192.168.226.133 slaver1
192.168.226.136 slaver2
机器2:192.168.226.133à slaver1
修改/etc/hostname,机器名修改为slaver1
修改/etc/hosts,添加其它两个节点的映射:
192.168.226.135 master
192.168.226.136 slaver2
机器3:192.168.226.136à slaver2
修改/etc/hostname,机器名修改为slaver2
修改/etc/hosts,添加其它两个节点的映射:
192.168.226.135 master
192.168.226.133 slaver1
2设置SSH免登录
hadoop的进程之间通信使用ssh方式,需要每次都要输入密码。为了实现自动化操作,需要配置ssh免密码登陆方式。
2.1 /etc/ssh/sshd_config去掉2行注解
#RSAAuthentication yes
#PubkeyAuthentication yes
2.2 ssh-keygen-t rsa,生成key,使用默认的一直回车,/root下就会生成.ssh文件夹
2.3 合并所有节点的/root/.ssh/id_rsa.pub文件到一起
cat id_rsa.pub>> authorized_keys
ssh root@slaver1 cat/root/.ssh/id_rsa.pub>> authorized_keys
2.4 把Master服务器的authorized_keys复制到Slave服务器的/root/.ssh目录
在slaver节点上scproot@master:/root/.ssh/authorized_keys.
下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.9.0/
我的目录/home/hadoop/java/jdk1.8.0_162
Hadoop的配置都在/hadoop_home/etc/hadoop下
<configuration>
<property><name>fs.defaultFS</name><value>hdfs://master:9000</value></property><property><name>hadoop.tmp.dir</name><value>file:/home/hadoop/tmp</value></property><property><name>io.file.buffer.size</name><value>131702</value></property>
</configuration>
<configuration>
<property><name>dfs.namenode.name.dir</name><value>file:/home/hadoop/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/home/hadoop/dfs/data</value></property><property><name>dfs.replication</name><value>3</value>
</property>
</configuration>
<configuration>
<property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
修改yarn-site.xml:
<configuration><!-- Site specific YARN configuration properties -->
<property><name>yarn.resourcemanager.hostname</name><value>master</value></property><property><description>The address of the applications manager interface in the RM.</description><name>yarn.resourcemanager.address</name><value>${yarn.resourcemanager.hostname}:8032</value></property><property><description>The address of the scheduler interface.</description><name>yarn.resourcemanager.scheduler.address</name><value>${yarn.resourcemanager.hostname}:8030</value></property><property><description>The http address of the RM web application.</description><name>yarn.resourcemanager.webapp.address</name><value>${yarn.resourcemanager.hostname}:8088</value></property><property><description>The https adddress of the RM web application.</description><name>yarn.resourcemanager.webapp.https.address</name><value>${yarn.resourcemanager.hostname}:8090</value></property><property><name>yarn.resourcemanager.resource-tracker.address</name><value>${yarn.resourcemanager.hostname}:8031</value></property><property><description>The address of the RM admin interface.</description><name>yarn.resourcemanager.admin.address</name><value>${yarn.resourcemanager.hostname}:8033</value></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.scheduler.maximum-allocation-mb</name><value>2048</value><discription>每个节点可用内存,单位MB,默认8182MB</discription></property>
<property><name>yarn.scheduler.minimum-allocation-mb</name><value>512</value><discription>每个节点可用内存,单位MB,默认8182MB</discription></property><property><name>yarn.nodemanager.vmem-pmem-ratio</name><value>2.1</value></property><property><name>yarn.nodemanager.resource.memory-mb</name><value>2048</value>
</property><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value>
</property>
</configuration>
Slaves中把内容清空,添加slaves节点的hostname
slaver1
slaver2
6创建目录,在/home/hadoop目录下创建tmp、dfs、dfs/data、dfs/name(根据自己etc里的配置创建)
7设置环境变量
Hadoop_home和java_home先配置好,虽然hadoop_home不是必须的,但是后面命令行操作hdfs会非常麻烦,所以建议一起配置好
Vi /etc/profile
exportHADOOP_HOME=/home/hadoop/hadoop-2.9.0
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_162
exportPATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
systemctl stop firewalld.service
systemctl disable firewalld.service
先初始化以下hdfs“硬盘”:bin/hdfs namenode -format
我建议第一次先启动dfs再启动yarn,一个个排查下,因为第一次直接成功的概率不大,start-all不方便排查问题。
DFS启动之后,master机器上2个服务nameNode和secondaryNameNode,两台slaver机器上都是dataNode。
YARN启动之后master机器会多个ResourceManager,slaver节点会多个NodeManager
在hdfs上创建个目录先,如果能成功并不代表服务是好的,只能代表nameNode是好的。
hadoop dfs –put yourfile /input/newfilename
如果这一步成功说明master能将文档分段后存储到slaver上了,证明dataNode是好的。
PS:输出文件不能重复,如果/output已经存在了那就删掉或者换一个文件名。
WordCount代码解析:
public class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable>{//map输出的value类型,常量1private final IntWritable one = new IntWritable(1);//map输出的key类型private Text word = new Text();public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();StringTokenizer parse = new StringTokenizer(line);while(parse.hasMoreTokens()) {word.set(parse.nextToken());context.write(word, one);}}}
public class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable>{public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{int sum = 0;for (IntWritable val : values) {sum += val.get();}context.write(key, new IntWritable(sum));}
}
public class WordCount {public static void main(String[] args) throws Exception{//先设置job的整体配置Configuration conf = new Configuration();Job job = new Job(conf);job.setJarByClass(WordCount.class);job.setJobName("yejingtao-wordcount");//在设置job的入参和出参类型和参数/*** TextInputFormat是Hadoop默认的输入方法,在TextInputFormat中,每个文件(或其一部分)都会单独作为Map的输入,之后,* 每一行数据都会产生一个<key,value>形式:其中key值是每个数据的记录在数据分片中的字节偏移量,而value值是每行的内容*/job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));//设置map-reducer的处理类job.setMapperClass(WordCountMap.class);job.setReducerClass(WordCountReduce.class);//详细给出出参的键值对格式job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);job.waitForCompletion(true);}
}
WordCount数据流图示:
运行中遇到个很妖的错误:
卡在Map 0% Reduce 0%,无法正常执行map-reduce的运算
这是个巨头疼的问题,我在这个问题上卡了很久。
追踪到application的日志卡在了
Going to preempt 1 due to lack of space formaps
查了网络的资料,怀疑是内存不足,于是修改了yarn的配置并扩展了内存,但是仍没有解决问题,后来无意中看到了yarn有这么一项配置:
再linux命令查看了一下自己的磁盘df –hl 已经占用了90%(由于企业没有坏境,我是在自己PC上搭建的VM集群,所以磁盘比较紧张),已经超过了配置说明中75%的界限。于是扩展了VM的磁盘后,问题解决!
PS:linux磁盘空间扩展请参考Linux需要掌握的常用命令和配置
Hadoop原理与安装相关推荐
- Hadoop实战-中高级部分 之 Hadoop 集群安装
Hadoop RestFul Hadoop HDFS原理1 Hadoop HDFS原理2 Hadoop作业调优参数调整及原理 Hadoop HA Hadoop MapReduce高级编程 Hadoop ...
- 单机安装 hadoop 环境(Hadoop伪分布式安装)
任务描述: 作为某公司运维工程师,需在单机安装 hadoop 环境(Hadoop伪分布式安装).本环节需要使用 root用户完成相关配置,具体部署要求如下: 1. 关闭虚拟机防火墙 2. 修改&quo ...
- 第六天 - 安装第二、三台CentOS - SSH免密登陆 - hadoop全分布式安装、配置、集群启动
第六天 - 安装第二.三台CentOS - SSH免密登陆 - hadoop全分布式安装.配置.集群启动 第六天 - 安装第二.三台CentOS - SSH免密登陆 - hadoop全分布式安装.配置 ...
- Hadoop三种安装模式
2019独角兽企业重金招聘Python工程师标准>>> Hadoop三种安装模式:单机模式,伪分布式,真正分布式 一 单机模式standalone 单机模式是Hadoop的默认模式. ...
- hadoop 2.x安装:不能加载本地库 - 解决libc.so.6 version GLIBC_2.14 not found问题
hadoop 2.x安装:不能加载本地库 - 解决libc.so.6 version GLIBC_2.14 not found问题 参考文章: (1)hadoop 2.x安装:不能加载本地库 - 解决 ...
- puppet完全攻略(一)puppet应用原理及安装部署
puppet完全攻略(一)puppet应用原理及安装部署 puppet简介 puppet官方网站:http://www.puppetlabs.com/ puppet中文wiki:http://pu ...
- Ubuntu16.04下Hadoop的本地安装与配置
一.系统环境 os : Ubuntu 16.04 LTS 64bit jdk : 1.8.0_161 hadoop : 2.6.4 部署时使用的用户名为hadoop,下文中需要使用用户名的地方请更改为 ...
- 使用LVS实现负载均衡原理及安装配置详解
使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均 ...
- Hadoop集群安装与配置
转载自Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS 本教程讲述如何配置 Hadoop 集群,默认读者已经掌握了 Hadoop 的单机伪分布式配置,否则请先查看Had ...
- hadoop hive 的安装问题
origin: http://blog.163.com/songyalong1117@126/blog/static/1713918972014124481752/ hadoop hive 的安装问题 ...
最新文章
- 自学python要到什么程度-学好深度学习,Python 得达到什么程度?
- vb.net2019- 机器学习ml.net情绪分析(1)
- 森汉姆算法(AS3)-检测两点之间所经过的节点
- 今天的离离原上草的飞鸽传书
- iOS字符串常用用法
- C函数形参列表与汇编寄存器的对应关系
- I9 9900K线程_收藏党抓紧了!英特尔停产i9-9900K特色包装,只因运输太浪费
- Java I/O操作
- python装饰器详解-Python装饰器基础详解
- php的闭包函数bingto_php的闭包
- mysql frm、MYD、MYI数据文件恢复,导入MySQL中
- [Android6.0][MTK6737] 启动流程分析
- Android - 一种相似图片搜索算法的实现
- 电子制造业如何快速回复客户订单交期?
- 白苹果了怎么办_建行储蓄卡云闪付bug还款玩法(苹果和安卓机攻略)
- IOS王者荣耀修改荣耀战区最实用教程
- Activity软盘配置
- Vertica:C-Store 七年之痒
- Python3网络爬虫(十二):初识Scrapy之再续火影情缘
- python画正切函数_python的pygal模块绘制反正切函数图像方法