Alex 的 Hadoop 菜鸟教程: 第5课 YARN 安装以及helloworld (基于centos的CDH)
原帖地址:http://blog.csdn.net/nsrainbow/article/details/36627675
新老MapReduce的比较
MRv1 (MapReduce v1)的架构图
- 首先用户程序 (JobClient) 提交了一个 job,job 的信息会发送到 Job Tracker 中,Job Tracker 是 Map-reduce 框架的中心,他需要与集群中的机器定时通信 (heartbeat), 需要管理哪些程序应该跑在哪些机器上,需要管理所有 job 失败、重启等操作。
- TaskTracker 是 Map-reduce 集群中每台机器都有的一个部分,他做的事情主要是监视自己所在机器的资源情况。
- TaskTracker 同时监视当前机器的 tasks 运行状况。TaskTracker 需要把这些信息通过 heartbeat 发送给 JobTracker,JobTracker 会搜集这些信息以给新提交的 job 分配运行在哪些机器上。上图虚线箭头就是表示消息的发送 - 接收的过程。
YARN的架构图
- 重构根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控
- 上图中 ResourceManager 支持分层级的应用队列,这些队列享有集群一定比例的资源。从某种意义上讲它就是一个纯粹的调度器,它在执行过程中不对应用进行监控和状态跟踪。同样,它也不能重启因应用失败或者硬件错误而运行失败的任务。ResourceManager 是基于应用程序对资源的需求进行调度的 ; 每一个应用程序需要不同类型的资源因此就需要不同的容器。
- 上图中 NodeManager 是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况 (CPU,内存,硬盘,网络 ) 并且向调度器汇报。
- 每一个应用的 ApplicationMaster 负责相应的调度和协调。一个应用程序无非是一个单独的传统的 MapReduce 任务或者是一个 DAG( 有向无环图 ) 任务。每一个应用的 ApplicationMaster 的职责有:向调度器索要适当的资源容器,运行任务,跟踪应用程序的状态和监控它们的进程,处理任务的失败原因。
安装YARN
安装
ResouceManager安装
sudo yum install hadoop-yarn-resourcemanager
启动服务
service hadoop-yarn-resourcemanager start
在所有datanode上安装nodemanager和mapreduce
sudo yum install hadoop-yarn-nodemanager hadoop-mapreduce
启动服务
service hadoop-yarn-nodemanager start
安装Hadoop-client
yum -y install hadoop-client
安装好后会多出这个文件夹
/usr/lib/hadoop/client-0.20
安装JobHistory
yum -y install hadoop-mapreduce-historyserver
配置
修改mapred-site.xml
<configuration><property> <name>mapreduce.framework.name</name> <value>yarn</value> </property><property><name>mapreduce.jobhistory.address</name><value>host1:10020</value> </property><property><name>mapreduce.jobhistory.webapp.address</name><value>host1:19888</value> </property>
<property><name>yarn.app.mapreduce.am.staging-dir</name><value>/user</value></property>
</configuration>
- mapreduce.jobhistory.address 和 mapreduce.jobhistory.webapp.address 是用于配置 jobHistory 的地址的。jobHistory会记录job运行的历史记录,强烈建议打开!
- yarn.app.mapreduce.am.staging-dir 是job运行时的临时文件夹,默认值是/tmp/hadoop-yarn/staging
修改yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>host1</value> </property>
建立yarn在hdfs上的日志文件夹
sudo -u hdfs hadoop fs -mkdir -p /var/log/hadoop-yarn
sudo -u hdfs hadoop fs -chown yarn:mapred /var/log/hadoop-yarn
并根据你的hdfs-site.xml 里面的 fs.defaultFS 这项的属性来修改所有节点上的 yarn-site.xml文件里面的 yarn.nodemanager.remote-app-log-dir 属性值。比如我的fs.defaultFS里面配置为hdfs://mycluster ,那么我的 yarn.nodemanager.remote-app-log-dir 变成这样
继续修改yarn-site.xml
<property><description>Where to aggregate logs to.</description><name>yarn.nodemanager.remote-app-log-dir</name><value>hdfs://mycluster/var/log/hadoop-yarn/apps</value>
</property>
在我这个例子中,就是把 host1 和 host2 上的这个文件都改了,并且重启服务
service hadoop-yarn-nodemanager restart
修改core-site.xml
增加jobHistory 相关配置
<property><name>hadoop.proxyuser.mapred.groups</name><value>*</value></property><property><name>hadoop.proxyuser.mapred.hosts</name><value>*</value></property>
Yarn运行job的时候需要一个临时文件夹,默认是用 /tmp/hadoop-yarn/staging ,最好改一下
编辑mapred-site.xml
<property><name>yarn.app.mapreduce.am.staging-dir</name><value>/user</value>
</property>
然后在hdfs上建立相应的文件夹
sudo -u hdfs hdfs dfs -mkdir -p /user/history
sudo -u hdfs hdfs dfs -chmod -R 1777 /user/history
sudo -u hdfs hdfs dfs -chown mapred:hadoop /user/history
这是mapred-site.xml最终的样子
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>mapreduce.jobhistory.address</name><value>host1:10020</value></property><property><name>mapreduce.jobhistory.webapp.address</name><value>host1:19888</value></property><property><name>yarn.app.mapreduce.am.staging-dir</name><value>/user</value></property>
</configuration>
这是core-site.xml最终的样子
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><property><name>hadoop.tmp.dir</name><value>/data/hdfs/tmp</value></property><property><name>ha.zookeeper.quorum</name><value>host1:2181,host2:2181</value></property><property><name>hadoop.proxyuser.mapred.groups</name><value>*</value></property><property><name>hadoop.proxyuser.mapred.hosts</name><value>*</value></property>
</configuration>
重启服务令配置生效
service hadoop-mapreduce-historyserver start
Helloworld
环境
- 装了CDH5的hadoop
- 本例子在之前安装的2台server (host1, host2) 搭成的hadoop集群之上运行
- 根据cdh官方文档的教程做一个简单的例子,但是cdh的教程写的不严谨,有很多坑等着你去跳,所以我改造了一下写成了这篇文章
STEP 1 在HDFS文件系统上建立input文件夹
HDFS就像是在我们实际的文件空间上虚拟出来的一个文件空间,而且这个文件空间是跨好多台电脑的,在这个空间里面也可以建立文件夹,建立文件等操作
现在我们登陆到部署好hadoop的server上( host1),cd到home目录下,然后切换到hdfs的世界里:
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/cloudera
$ hdfs dfs -ls /user
Found 1 items
drwxr-xr-x - root hadoop 0 2014-07-02 14:52 /user/cloudera
$ hdfs dfs -mkdir /user/cloudera/wordcount /user/cloudera/wordcount/input
说明
有些教程会把命令写成 “hadoop fs -ls /” 这样的写法,这种写法是老hadoop的写法,现在新的写法是 hdfs dfs -ls ,所以请使用新的写法。其实hadoop开发组目前是极力的把hadoop 跟 hdfs 的概念分清楚,以免大家有误解,hadoop其实是HDFS跟MapReduce两种技术的总和,存储部分是hdfs,所以现在hadoop的开发组希望大家了解这种概念,进而使用hdfs这样更专业和精确的术语
补充
如果在 / 根目录下看不到tmp目录,就请先建立这个目录,并分配权限为hdfs.hdfs以免别的程序比如hive或者hbase建立了这个目录,如果这样的话tmp文件夹的所有者就未必是hdfs了,会对别的程序造成影响
[root@host1 ~]# sudo -u hdfs hdfs dfs -mkdir /tmp
[root@host1 ~]# sudo -u hdfs hdfs dfs -chmod -R 1777 /tmp
STEP 2 建立测试的文本
$ echo "Hello World Bye World" > file0
$ echo "Hello Hadoop Goodbye Hadoop" > file1
$ hdfs dfs -put file* /user/cloudera/wordcount/input
STEP 3 编译 WordCount.java
$ vim WordCount.java
把下面的代码粘贴进去
package org.myorg;import java.io.IOException;
import java.util.*;import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;public class WordCount {public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {String line = value.toString();StringTokenizer tokenizer = new StringTokenizer(line);while (tokenizer.hasMoreTokens()) {word.set(tokenizer.nextToken());output.collect(word, one);}}}public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {int sum = 0;while (values.hasNext()) {sum += values.next().get();}output.collect(key, new IntWritable(sum));}}public static void main(String[] args) throws Exception {JobConf conf = new JobConf(WordCount.class);conf.setJobName("wordcount");conf.setOutputKeyClass(Text.class);conf.setOutputValueClass(IntWritable.class);conf.setMapperClass(Map.class);conf.setCombinerClass(Reduce.class);conf.setReducerClass(Reduce.class);conf.setInputFormat(TextInputFormat.class);conf.setOutputFormat(TextOutputFormat.class);FileInputFormat.setInputPaths(conf, new Path(args[0]));FileOutputFormat.setOutputPath(conf, new Path(args[1]));JobClient.runJob(conf);}
}
然后编译它
$ mkdir wordcount_classes
$ javac -cp <classpath> -d wordcount_classes WordCount.java
这边的 <classpath> 可以填的值根据版本不一样不同:
CDH 4/5
Parcel installation - /opt/cloudera/parcels/CDH/lib/hadoop/*:/opt/cloudera/parcels/CDH/lib/hadoop/client-0.20/*
Package installation - /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/*
CDH3 - /usr/lib/hadoop-0.20/hadoop-0.20.2-cdh3u6-core.jar
我们是CDH5
所以完整的命令是
$ javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* -d wordcount_classes WordCount.java
成功的话没有任何回应,但是在 wordcount_classes 里面出现了org文件夹
STEP 4 创建JAR
$ jar -cvf wordcount.jar -C wordcount_classes/ .
执行这条命令的时候注意最后还有一个点符号, 千万别漏掉了
然后把这个 wordcount.jar移动到 /data/ 目录下后面会使用到
STEP 5 运行程序
$ sudo su - hdfs
因为hdfs用户的根目录是/var/lib/hadoop-hdfs,所以我们要cd到刚刚有jar文件的目录
$ cd /data
$ hadoop jar wordcount.jar org.myorg.WordCount /user/cloudera/wordcount/input /user/cloudera/wordcount/output
14/07/03 09:44:16 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
14/07/03 09:44:16 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
14/07/03 09:44:16 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
...
输出了很多东西之后我们去看下结果
注意
15/01/06 07:18:40 INFO mapreduce.Job: The url to track the job: http://host1:8088/proxy/application_1420470115119_0002/
这句话说的地址去查看日志
vim /var/log/hadoop-yarn/yarn-yarn-nodemanager-host1.localdomain.log
根据日志来排查问题是最高效的
STEP 6 查看结果
$ hdfs dfs -cat /user/cloudera/wordcount/output/part-00000
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
还可以到 http://host1:19888/ 去查看job历史记录
STEP 7 删除结果
如果你想再运行一次教程就要先删除掉结果
$ hdfs dfs -rm -r /user/cloudera/wordcount/output
hdfs还提供了几个选项用于传递信息给应用(wordcount就是一个应用):
-files 允许应用指定几个在运行目录下的文件(逗号分隔)给应用
-libjars 允许应用添加jar到maps 和 reduces 的 classpath
-archives 可以把归档文件当做参数传递给应用。归档文件:解压开或者unjared(打jar包的相反动作)成一个文件夹,然后用这个文件夹建立一个link,并且这个link的名字是一个zip或者jar文件(以.zip 或者 .jar 结尾)
参考资料
- http://www.educity.cn/wenda/578863.html
- http://www.cloudera.com/content/cloudera/en/documentation/cdh5/v5-0-0/CDH5-Installation-Guide/cdh5ig_yarn_cluster_deploy.html?scroll=topic_11_4_3_unique_1 这是官方原版的文档,强烈建议做完例子再去看一遍
Alex 的 Hadoop 菜鸟教程: 第5课 YARN 安装以及helloworld (基于centos的CDH)相关推荐
- Alex 的 Hadoop 菜鸟教程: 第10课 Hive 安装和使用教程
原帖地址: http://blog.csdn.net/nsrainbow/article/details/41748863 最新课程请关注原作者博客 声明 本文基于Centos 6.x + CDH 5 ...
- 阿里云服务器菜鸟教程选配、宝塔面板安装到WordPress网站上线
阿里云服务器新手教程从云服务器选配购买.云服务器配置到网站上线全过程,阿里云服务器如何购买?购买后如何使用?新手站长抽时间写了一篇详细的阿里云服务器新手教程,从云服务器选配到网站上线全过程: 阿里云服 ...
- 【菜鸟教程】小乌龟git的安装,配置(TortoiseGit安装)
# 下载 官方地址:进行下载 安装 一路下一步:
- python写脚本入门-学习Python的教程?:python 脚本菜鸟教程
学习Python的教程? Python作为一门面向对象的性语言,其实它的学习也很简单 - 配置 - Python基础(语法..数据类型.高级变量.函数.Python高级特性) - 面向对象编程.面向对 ...
- python菜鸟教程100例-对菜鸟教程的Python一百例的个别改进
开篇语 好吧,其实是我小妹子Python公选课结课,所以我来帮忙做个大作业(简单到哭的大作业好吗?)!她的大作业就是老师把菜鸟教程的Python一百例扒下来做成文档,然后让学生自己找三个验证下!我们当 ...
- python 菜鸟-python菜鸟教程
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 除了常见的循环控制语句,python 中还有if,if else和if ...
- 如何系统的自学python-怎样才能彻底系统的自学python?!白Python菜鸟教程
零基础学Python应该学习哪些入门知识 黑马python3的视频教程可以先看看简单易学 从哪里下载Python学习路线及全套视频教程? 淘宝这搜一大学习教程你可以看菜鸟教程,最基础分,然后这分学习完 ...
- 超级简单的Python爬虫教程,python爬虫菜鸟教程官网
毫无基础的人如何入门 Python ? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编 ...
- python菜鸟教程100实例-python菜鸟教程官网
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 之后的某节会讲到如何给mac中的python安装其他模块,比如比较常用的numpy ...
最新文章
- PHP实现常见排序算法
- The Road to learn React书籍学习笔记(第三章)
- PYTHON_DACORATOR
- php定义枚举,PHP中Enum(枚举)用法实例详解
- 15家大数据公司被调查,数据行业面临大清洗?
- Databricks:2015 Spark调查报告(部分译文)
- net读取exchange数据
- 兵马未至,数据先行,且看如何进行数据挖掘!
- Linux系统编程---13(线程控制函数,创建线程,循环创建多个线程,线程间共享全局变量)
- leetcode - 931. 下降路径最小和
- 十年游戏建模师给想学次世代游戏建模同学的一些忠告,太受益了
- 玩转流量,天下无锅——IT运维人员的九阳神功(上)
- Word怎么删除空白页? 告诉你6招技巧
- Joomla 插件 attachments 使用时出现不支持ZIP文件上传的错误
- HiC-Pro | HiC数据处理工具
- nginx—动静分离
- C# LeetCode刷题 - Leetcode 306. 累加数 - 题解
- 2019年创业做什么有前景?
- Xbox 360抢鲜测评
- 藏在今日头条、喜马拉雅背后的神秘天使:龚挺 | 捕捉隐秘猎手
热门文章
- java实现简单RPG小游戏的角色创建
- 基于uniapp开发的ZEBRA(斑马) PDA使用广播扫码监听功能(文件配置+插件使用)
- stm32 软件怎么设置写保护_STM32 , 写保护问题! (amobbs.com 阿莫电子论坛)
- 荐在vue中最好用的编辑器 —— vue-json-editor
- 通讯录管理系统 C语言课程设计实验报告
- 数控机床传动装置机械及PLC电气控制系统设计
- rtx服务器修改登录端口,rtx服务器端口设置
- React 教程及其API接口文档
- 【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
- 尚硅谷谷粒商城项目P16前端项目renren-fast-vue的bug,耗时三天终于运行起来了