当前位置:
文档之家› 《hadoop培训》PPT课件
《hadoop培训》PPT课件
Blocksize指数据尾 加上数据尾部之后 补齐的长度,多用 于64M边界处的数据 段,大于或等于 Datasize
Data/Tails
Garbage data
垃圾数据,用于补齐 数据到64M边界用。 以保证每一个分块被 map读取时都能读到 完整的data。在非 64M边界处,该段长 度为0,否则为恰好 补齐64M的长度
Page 13
Streaming编程框架
自定义Streaming支持的文件内数据结构
Datasize 指 本数据的数 据尾总长 度,(不包括 头部)
One data One data One data One … data … … … … … … … … … … … … One data
16bit uuid/date Key/Head 4bit Datasize Sdata 4bit Blocksize Sblock 231bit the rest of head data
Page 16
Байду номын сангаас
Streaming编程框架
子程序的调试方法
数据的准备,可使用fetchdata_hdp.jar工具从hdfs上下载到文件中 的一块作为调试程序的输入文件分块 调试环境的准备,将提交任务时的命令行作为调试命令行,提交 任务时上传的文件作为资源文件放在执行目录下 IDE的选择: linux下使用gdb或者codelite windows下使用visual studio,调试过程和普通的C++/C程序一致
提交任务过程:用户与JobTracker交互,提交任务资源和配置 运行任务过程:JobTracker将队列中的tasks按调度算法分配给各 tasktracker的空闲槽,tasktracker随后就运行之并监视汇报tasks 的运行情况。
Page 8
hadoop任务运行原理--通过hadoop编程接口提交任务
这个程序其实和普通的java程序没有区别,其实现了 mapper,reducer接口,并通过main函数加载配置和参数, 上传jar,提交任务并监控运行情况
Page 9
hadoop编程接口,hadoop任务运行原理
以一个任务的提交为例:WordCount.jar 其main函数如下,其中就包含了提交任务的流程:
Streaming工具的调试方法
在本地使用eclipse即可像调试java程序一样调试Streaming工具
除非要改写得到自己的partitioner,否则不要修改Streaming工具
Page 17
编写Streaming框架下程序时的常见问题
1.为什么包含了相应的库,但是编译的时候显示undefined function xxxxxxx? 答:有可能是因为你呃库为C语言,这时候cpp程序包含的C头文件需要加上extern “C” 比如 exter “C”{ #include “MapInput.h” } 2.在一个库A依赖另一个库B的函数c时,我先后链接了两个库A,B,为什么仍然有库A中引用的函数显示undefined function c? 答:在可执行程序中没有直接引用c时,链接程序先引用A时不会提取出c备用,所以在链接到B库时,其中引用的c符号就找不到了。 这个时候需要先链接B库再链接A库。 3.为什么Streaming启动后无缘无故报错,提示IOException … Array Out of Bound等错误? 答:这时很可能是由于输入的打包文件的64M边界处没有处理好,需要检查打包程序。 在linux下可以通过如下步骤检查: split –b64m file.pak #这时文件夹中会有xaa xab等一大堆文件,每个文件都是从file.pak中解散出来的64M分块 #这时只需要检查xab、xac、xad等的开头是否完整的数据条目即可。 4.如何使用带动态链接库的程序? 答:我们的修改版Streaming程序中默认将当前执行目录下的bin文件夹加入了LD_LIBRARY_PATH环境变量中了。这样在执行这样的Streaming任务时就可以通过 – cacheArchive参数将所有动态链接库打包成的tar包下载到每台机器上并解压到当前目录的bin目录下即可。但是由于-cacheArchive使用的是软链接方式创建的bin目录,所以 不能将动态链接库文件分散放在多个tar下,这样会引起冲突。 5.为什么程序持续出现timeout 600现象导致task被kill? 答:导致这个问题的有两种原因: 1.tasktracker所在机器繁忙,这个的解决需要酌情减少tasktracker上的map和reduce槽数。 2.子程序有bug,刘丹目前碰到了这个问题,他的程序中有部分析构代码进入了死循环,所以其程序无法自行了结导致了tasktracker一直在忙等。 6.关于strtok的常见错误? 答:strtok不能嵌套使用,比如line=strtok(B,”xx”) 然后word = strtok(line,”a”)后又想通过line=strtok(NULL,”xx”)得到B之后的line是行不通的。 strtok中的参数不能使用静态字符串。比如不能用line=strtok(“abcd abdc”,” “) 7.关于RecordReader256报错,wrong data,什么原因? 答:原因可能是由于打包数据的程序处理不当导致打包成的文件的块交接处出错。或者由于上传的数据不完整导致最后数据没有完全读入。
Streaming编程框架 任务的调试和查错
Page 2
hadoop的软件结构和安装方法
软件结构(我们目前主要使用的)
DFS模块,包含了 Namenode, Secondary Namenode, Datanode等模 块,这些模块分别会运行在 主节点和从节点上,通过 http协议进行交互
Blocksize指数据尾 加上数据尾部之后 补齐的长度,多用 于64M边界处的数据 段,大于或等于 Datasize size :S Tail 1 第一个尾 数据
Data/Tails
Tail 2 ... Garbage data
垃圾数据,用于补齐 数据到64M边界用。 以保证每一个分块被 map读取时都能读到 完整的data。在非 64M边界处,该段长 度为0,否则为恰好 补齐64M的长度
jar : 读取配置运行java程序
Streaming.jar myjob.jar wordcount.jar ...
???admin:管理和查看hadoop上的详细状态
...
...
Page 7
hadoop任务运行原理
hadoop任务(Job)由多个子任务(Task)组成,tasks 由以下两部分
Page 4
hadoop的接口
通过接口了解hadoop内部的情况
web接口 部分命令行接口
通过接口控制hadoop的运行和态
web接口(需开启配置中web控制选项) 命令行接口
通过接口提交任务
命令行接口结合编程接口
Page 5
hadoop的web接口
hdfs,默认用浏览器访问namenode节点的50070端口即 可
Page 11
Streaming编程框架
Streaming? Streaming也就是一个java编写的任务提交工具
Streaming自己实现的mapper
Streaming自己的reducer 输入输出接口
额外的针对子进程的输入输出接口 针对输入输出文件的输入输出接口
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> <out>"); System.exit(2); } Job job = new Job(conf, "word count"); //新建任务对象 job.setJarByClass(WordCount.class);//主类 job.setMapperClass(TokenizerMapper.class);//mapper job.setCombinerClass(IntSumReducer.class);//作业合成类 job.setReducerClass(IntSumReducer.class);//reducer job.setOutputKeyClass(Text.class);//设置作业输出数据的关键类 job.setOutputValueClass(IntWritable.class);//设置作业输出值类 FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//文件输入 FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//文件输出 System.exit(job.waitForCompletion(true) ? 0 : 1);//提交任务,等待完成退出. }
以一个任务的提交为例:WordCount.jar 其代码结构如下:
public class WordCount{ public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{} public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {} public static void main(String[] args){} }