YARN 和 MapReduce的内存分配公式 http://linxiao.iteye.com/blog/2270021
eclipse/intellij idea 远程调试hadoop 2.6.0 http://www.cnblogs.com/yjmyzz/p/how-to-remote-debug-hadoop-with-eclipse-and-intellij-idea.html
intellij IDEA下远程调试hadoop http://blog.csdn.net/lastsweetop/article/details/8964520
Hadoop操作HDFS命令 http://blog.csdn.net/bigdatahappy/article/details/10068881
hdfs下的文件操作常用命令总结 https://segmentfault.com/a/1190000002672666
Hadoop调优 https://github.com/mattshma/bigdata/blob/master/hadoop/hdfs/tune.md
Hive几种数据导入方式 https://www.iteblog.com/archives/949
技术解释:
hadoop之NameNode,DataNode,Secondary NameNode http://www.cnblogs.com/zhanghuijunjava/archive/2013/04/23/NameNode_DataNode_SecondaryNameNode.html
Hadoop日记Day1—Hadoop介绍 http://www.cnblogs.com/sunddenly/p/3977011.html 这里对名词做了大概介绍
HDFS架构
(1) 主从结构
•主节点,只有一个: nameNode
•从节点,有很多个: dataNodes
(2) nameNode负责:管理
•接收用户操作请求,可以实现对文件系统的操作(一般的操作方式有两种,命令行方式和Java API方式)
•维护文件系统的目录结构(用来对文件进行分类管理)。
•管理文件与block之间关系(文件被划分成了Block,Block属于哪个文件,以及Block的顺序好比电影剪辑),block与datanode之间关系。
(3) dataNode负责:存储
•存储文件
•文件被分成block(block一般是以64M来划分,但每个Block块所占用的空间是文件实际的空间)存储在磁盘上,将大数据划分成相对较小的block块,这样可以充分利用磁盘空间,方便管理。
•为保证数据安全,文件会有多个副本(就好比配钥匙,都是为了预防丢失),这些副本会一块一块复制,分别存储在不同的DataNode上。
Client:切分文件;访问HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。
NameNode:Master节点,在hadoop1.X中只有一个,管理HDFS的名称空间和数据块映射信息,配置副本策略,处理客户端请求。
DataNode:Slave节点,存储实际的数据,汇报存储信息给NameNode。
Secondary NameNode:辅助NameNode,分担其工作量;定期合并fsimage和fsedits,推送给NameNode;紧急情况下,可辅助恢复NameNode,但Secondary NameNode并非NameNode的热备。
MapReduce架构
(1)主从结构
•主节点,只有一个: JobTracker
•从节点,有很多个: TaskTrackers
(2)JobTracker 负责:
•接收客户提交的计算任务
•把计算任务分给TaskTrackers执行
•监控TaskTracker的执行情况
(3)TaskTrackers负责:
•执行JobTracker分配的计算任务
JobTracker:Master节点,只有一个,管理所有作业,作业/任务的监控、错误处理等;将任务分解成一系列任务,并分派给TaskTracker。
TaskTracker:Slave节点,运行Map Task和Reduce Task;并与JobTracker交互,汇报任务状态。
Map Task:解析每条数据记录,传递给用户编写的map(),并执行,将输出结果写入本地磁盘(如果为map-only作业,直接写入HDFS)。
Reducer Task:从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行。
ApplicationMaster 负责一个 Job 生命周期内的所有工作,类似老的框架中 JobTracker。但注意每一个 Job(不是每一种)都有一个 ApplicationMaster,它可以运行在 ResourceManager 以外的机器上。
NodeManager 功能比较专一,就是负责 Container 状态的维护,并向 RM 保持心跳。
ResourceManager 负责作业与资源的调度,是基于应用程序对资源的需求进行调度的 ; 每一个应用程序需要不同类型的资源因此就需要不同的容器。资源包括:内存,CPU,磁盘,网络等等。
Application Timeline Server可认为YARN提供给应用程序的用于共享信息的共享存储模块,可以将metric等信息存到该模块中,不仅仅是历史作业运行信息。
NameNode 主要功能提供名称查询服务
DataNode 数据节点,保存Block块信息, 分布式情况下,一台服务器都会运行一个DataNode
Secondary Namenode 有人翻译为第二NameNode,我认为翻译为辅助NameNode更为合理, 1:主要工作保存namenode中对HDFS metadata的信息的备份; 2:主要工作帮助NameNode合并edit log,减少NameNode的启动时间.
源码知识:
Hadoop学习笔记 http://www.cnblogs.com/beanmoon/category/438867.html
Hadoop编程笔记(一):Mapper及Reducer类详解 http://www.cnblogs.com/beanmoon/archive/2012/12/06/2804594.html
Hadoop学习笔记(二):从map到reduce的数据流 http://www.cnblogs.com/beanmoon/archive/2012/12/08/2805636.html
[Hadoop源码解读](一)MapReduce篇之InputFormat http://blog.csdn.net/posa88/article/details/7897963
[Hadoop源码解读](二)MapReduce篇之Mapper类 http://blog.csdn.net/posa88/article/details/7901304
[Hadoop源码解读](三)MapReduce篇之Job类 http://blog.csdn.net/posa88/article/details/7902709
[Hadoop源码解读](四)MapReduce篇之Counter相关类 http://blog.csdn.net/posa88/article/details/7904720
[Hadoop源码解读](五)MapReduce篇之Writable相关类 http://blog.csdn.net/posa88/article/details/7906426
[Hadoop源码解读](六)MapReduce篇之MapTask类 http://blog.csdn.net/posa88/article/details/7956767
在 Hadoop 上编写 MapReduce 程序 —— 上下文 https://www.oschina.net/translate/writing-hadoop-map-reduce-program-in-java
一个例子: 直接在eclipse或者idea上执行的例子
- 统计单词
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
package com.first; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public class WordCountEx1 { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { System.out.println("Mapper===>key="+key.toString()+" , ==>value="+value.toString()); StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { System.out.println("Reducer==>key="+key.toString()+" , values="+values.toString()); int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } /** * 运行的时候, 要右键, run configuration, 设定argments: * 传入地址: 非最后一个参数, 是输入要处理的文件, 最后一个参数是输出位置, IP是hdfs服务器的域名或者IP * HDFS --> Configs --> Advanced -->Advanced core-site --> fs.defaultFS 这个参数 * hdfs://192.168.0.31:8020/tmp/input/words_01.txt * hdfs://192.168.0.31:8020/tmp/output/ * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args) .getRemainingArgs(); if (otherArgs.length < 2) { System.err.println("Usage: wordcount <in> [<in>...] <out>"); System.exit(2); } Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCountEx1.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); for (int i = 0; i < otherArgs.length - 1; ++i) { FileInputFormat.addInputPath(job, new Path(otherArgs[i])); } SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); FileOutputFormat.setOutputPath( job, new Path(otherArgs[otherArgs.length - 1] + "/" + format.format(new Date()))); System.exit(job.waitForCompletion(true) ? 0 : 1); } } |
2. 统计单词, 但要求单词长度大于等于5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
package com.first; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountEx { public static void main(String[] args) throws Exception { //配置信息 Configuration conf = new Configuration(); //job名称 Job job = Job.getInstance(conf, "mywordcount"); job.setJarByClass(WordCountEx.class); job.setMapperClass(MyMapper.class); // job.setCombinerClass(IntSumReducer.class); job.setReducerClass(MyReduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //输入、输出path FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); //结束 System.exit(job.waitForCompletion(true) ? 0 : 1); } /** * 做了点DIY,排除了字母长度小于5的数据,方便大家对比理解程序。 * @author pandy * */ static class MyMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { // 分割字符串 StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { // 排除字母少于5个的 String tmp = itr.nextToken(); if (tmp.length() < 5) continue; word.set(tmp); context.write(word, one); } } } /** * 我们将map的结果乘以2,然后输出的内容的key加了个前缀。 * @author pandy * */ static class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); private Text keyEx = new Text(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { // 将map的结果放大,乘以2 sum += val.get() * 2; } result.set(sum); // 自定义输出key keyEx.set("输出:" + key.toString()); context.write(keyEx, result); } } } |
使用jdbc访问hive数据, 关于驱动问题, 查看: http://blog.csdn.net/lanchunhui/article/details/50864137
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<properties> <hadoop.jdbc.version>2.1.0</hadoop.jdbc.version> <hadoop.version>2.7.3</hadoop.version> </properties> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.5</version> </dependency> <!-- hadoop --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>${hadoop.version}</version> </dependency> <!-- hive --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hadoop.jdbc.version}</version> <exclusions> <exclusion> <artifactId>pentaho-aggdesigner-algorithm</artifactId> <groupId>org.pentaho</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hadoop.jdbc.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> <version>${hadoop.jdbc.version}</version> </dependency> </dependencies> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.pandy.hadoop.hive;/** * Created by pandy on 16-11-3. */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** * 项目名称: workspace * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 16-11-3. * 创建时间: 上午10:38. * 修改历史: * ----------------------------------------------- */ public class JdbcHive { public static void main(String[] args) throws Exception { try { Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection con = DriverManager.getConnection("jdbc:hive2://192.168.0.63:10000/default", "hive", "ambari"); Statement stm = con.createStatement(); ResultSet rs = stm.executeQuery("select * from t "); while (rs.next()) { String info = rs.getString(1); info += ", " + rs.getString(2); info += ", " + rs.getString(3); System.out.println(info); } } catch (Exception ex) { ex.printStackTrace(); } } } |
输出:
1, eZkvtxiv, 8348
2, lHfcqlIy, 4119
3, OfdLeKDe, 4681
4, tUvGFNjp, 452
5, qOTRePCg, 79
6, AxFASxiz, 4178
7, WoXVlNSj, 1034
8, XygGaThm, 1433