• 1. Hadoop入门指南刘明珠 Cloud_dev
  • 2. 什么是Hadoop如何使用HadoopHadoop的原理MapReduce进阶开发模式各类资源列表提纲
  • 3. Why Hadoop 数据规模爆炸式增长,大数据计算需要“高效”解决方案 多机环境中网络成为瓶颈 多机环境下的稳定性问题 如何平衡计算效率和开发效率 What Hadoop Google的GFS + MapReduce的山寨产品 Hadoop = HDFS + MapReduce HDFS:分布式“大文件”存储系统 MapReduce:分布式计算框架 计算逻辑必须符合Map-Reduce编程规范什么是Hadoop
  • 4. 关于MapReduceHadoop的主要部件 数据是用来计算的,存储通常是次要需求 字面解释有多种含义 最早来源于python等函数式编程语言 Map:映射器 输入:,输出,… Reduce:归约器 输入:…,输出 可以是表示编程模型 输入数据可以视为对 每个Key-value对可独立进行处理 输入数据经映射器函数映射后,同一个新key对应的数据可独立处理 可以是计算框架,用于运行符合MR编程模型的计算程序
  • 5. 日常开发: 晨曦集群 LA-test 业务专用: Zeus集群 LA集群 各业务专用集群 urllib/meepo/alex/zionSogou现有Hadoop集群
  • 6. 数据服务 Uigs/SogouRank公共数据由系统管理员管理 各个用户自行管理/user/目录下的数据 Hadoop Task Queue(任务管理) 方便管理大量任务:状态跟踪、task记录 支持任务调度、依赖关系、监控报警、错误恢复 Hadoop/Hbase工具类库 MapReduce InputFormat: Spider Pages/HBase数据/ComposeInputFormat Hdfs rsync/find工具、各种Hbase工具、QDB接口的HBaseDaemon 面向Pig语言的通用库:uigs日志解析器、MR结果入mysql库 Scribe 平台bug-fix、新功能支持、技术支持 平台组:cloud_dev@sogou-inc.comSogou的Hadoop生态系统
  • 7. 搭建Hadoop client环境 运行一键安装脚本(Linux Shell)(下载链接) 配置用户名密码 详见此处 搭建个人开发环境 安装JVM和eclipse(subclipse插件) 搜狗内部下载链接 安装eclipse插件:Help->Install new soft->add->archive 将Hadoop/Hbase的jar包拷贝到本地备用 /usr/lib/hadoop/lib/*.jar /usr/lib/hbase/*.jar /usr/lib/hbase/lib/*.jar 建议将这些jar包设置为Eclipse的公共Library: Window->Preferences->Java->Build Path->User Libraries->New… (可选)在Linux虚机上安装远程桌面 # yum groupinstall -y “GNOME Software Development” # yum install -y “xrdp” # service xrdp start 用windows上的远程桌面连接Hadoop Quick Start
  • 8. 如何使用HDFSHDFS是类似于Posix文件系统 mkdir/list/create/delete/rename open/close/append/read 用法 命令行 # hadoop fs <-mkdir|-ls|-touchz|-rmr|-mv> # hadoop fs <-put|-get|-text> Java程序 FileSystem fs = FileSystem.get(Conf); fs.open()/fs.append()/fs.mkdir()/fs.listStatus()
  • 9. 第一个MapReduce程序如何下手 注:请用eclipse的svn插件import下列工程 MapReduce示例工程 http://svn.sogou-inc.com/svn/websearch4/data_platform/samples/mapreduce/ 说明:最简单的WordCount写法 UigsTools示例工程 http://svn.sogou-inc.com/svn/websearch4/data_platform/samples/uigs-java/ UigsWordCount演示如何在用uigsTools时解析通用参数 WordCount演示ToolRunner同uigsTools的配合方式Hadoop Quick Start(续)
  • 10. MapReduce WordCount之Mapperpublic class TokenizerMapper extends Mapper { 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 { String valueStr = value.toString(); valueStr = new String(value.getBytes(), 0, value.getLength(), "GBK"); System.out.println("value:" + valueStr); StringTokenizer itr = new StringTokenizer(valueStr); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }
  • 11. MapReduce WordCount之Reducerpublic class IntSumReducer extends Reducer { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
  • 12. MapReduce WordCount之Driver Job job = new Job(conf, "word count"); // 必需:指定当前程序所在的jar文件。 // 如果不调用该函数,hadoop机群上的map/reduce可能会运行失败。 job.setJarByClass(WordCount.class); // 必需:指定mapper类 job.setMapperClass(TokenizerMapper.class); // 可选:指定Combiner类。根据程序逻辑决定是否需要。 // job.setCombinerClass(IntSumReducer.class); // 可选:指定Reducer类。根据程序逻辑决定。 job.setReducerClass(IntSumReducer.class); // 必需:指定reduce输出的Key的类型 job.setOutputKeyClass(Text.class); // 必需:指定reduce输出的Value的类型 job.setOutputValueClass(IntWritable.class); // 必需:指定输入路径 FileInputFormat.addInputPath(job, new Path(args[0])); // 必需:指定输出路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); // 提交作业 int ret = job.waitForCompletion(true);
  • 13. 步骤 将Hadoop的jar包添加到工程的Build Path中 Project上右键->Build Path->Add Libraries->User Libraries 开发Mapper/Reducer/主程序(main class)的代码 将代码打成jar包 从Eclipse export出jar包 或 采用fatjar插件生成jar包 或 采用ant/javac等命令行工具生成jar包 执行程序 # hadoop jar
    [other param] 查看执行状态 命令行:# hadoop job –list Web UIMapReduce一般开发模式
  • 14. 什么是Hadoop如何使用HadoopHadoop的原理MapReduce进阶开发模式各类资源列表提纲
  • 15. HDFS的基本原理基于块的分布式存储系统 DFSClient/NameNode/DataNode 通过备份机制实现容灾和负载均衡 强一致性,不支持随机写
  • 16. MapReduce的基本原理组成部分 JobClient/JobTracker/TaskTracker
  • 17. InputFormat getSplits() / getRecordReader() 决定Map的输入数据如何被解析并转换成K-V对 OutputFormat 决定reduce的输出被序列化写入存储的格式 Mapper/Reducer/Combiner Partitioner 分环策略 GroupingComparator/SortComparator 排序策略MapReduce运行机制
  • 18. 推荐开发步骤 单元测试 MRUnit/JUnit 本地模式调试 Eclipse 分布式模式调试 Counter 打日志,并通过Web UI查看调试 MapReduce程序
  • 19. MapReduce本地模式启用方法 将mapred.job.tracker设置为local conf.set(“mapred.job.tracker”, “local”); 修改mapred-site.xml中的参数值 HDFS本地模式启用方法 将fs.default.name设置为file:/// conf.set(“fs.default.name”, “file:///”) 修改core-site.xml中的参数值 本地模式要点 MapReduce和HDFS可以分别进行本地化 可以本地MapReduce处理分布式HDFS上的文件 可以本地MapReuce处理本地HDFS上的文件 不能用分布式Mapreduce处理本地HDFS上的文件 MapReduce本地模式是在本机本进程内执行Hadoop的本地模式
  • 20. 什么是Hadoop如何使用HadoopHadoop的原理MapReduce进阶开发模式各类资源列表提纲
  • 21. UigsTools Streaming HCE PigMapReduce进阶开发模式
  • 22. UigsTools的起源 MapReduce基础代码库 主要功能 解析uigs日志格式的工具类 搜索内部通用的InputFormat HBase工具集 文档见此处 后期整理,内容可能不全关于UigsTools
  • 23. 获取代码库 uigsTools.jar已经被整合到了hadoop安装包中 /usr/lib/hadoop/lib/uigsTools.jar 获得最新库:# yum update -y hadoop-0.20 主要功能: 获得Uigs日志的位置 com.sohu.hadoop.tool.UigsLogDriver new UigsLogDriver().getDataPaths(date, productName); 启动mapreduce: DriverTools.drive(date, productName, mapreduceConfs, outputdir); 如何使用UigsTools
  • 24. 用法 完成Mapper/Reducer/主程序 可以使脚本、可执行程序、java类等 执行程序 # hadoop org.apache.hadoop.streaming.HadoopStreaming –mapper -reducer -file <依赖的数据文件或库文件> 了解更多参数 # hadoop org.apache.hadoop.streaming.HadoopStreaming –hMapReduce进阶开发模式-Streaming
  • 25. 用Streaming实现的grep工具 准备实验数据 将文本文件通过hadoop fs -put上传 创建fgrep.sh,内容如下(两行): fgrep “20120714” exit 0; # 第二行很重要 执行grep操作 # hadoop org.apache.hadoop.streaming.HadoopStreaming -input input_test.txt -mapper "sh fgrep.sh" -output temp_out –file fgrep.sh 查看输出目录temp_outStreaming MapReduce示例
  • 26. 什么是HCE Hadoop C++ Extension 基于Streaming实现的C++ MapReduce API 也叫HSCE(Hadoop Streaming C++ Extension) 用法 下载HCE的头文件 svn地址 编写Mapper/Reducer对应的cpp代码 类Java api接口:HCE::Mapper/HCE::Reducer 编译生成可执行程序 g++ -o -lhsce 执行: hadoop org.apache.hadoop.streaming.HadoopStreaming \ –mapper “ -t mapper” \ -reducer “ -t reducer” \ -file <其他依赖的数据文件或库文件> MapReduce进阶开发模式-HCE
  • 27. 步骤 (可选)在pig shell环境下调试pig语句 # hadoop jar pig.jar 编写pig脚本 执行任务 #hadoop jar pig.jar xxx.pig Pig示例 平台组现在提供 解析UIGS/SogouRank/Resin格式日志的Store类 pig数据入mysql库的工具 根据“数据类型 + 时间”定位日志路径的接口MapReduce进阶开发模式-Piguigsdata = LOAD ‘/uigs_log/web/*20120703*’ AS (…); qt = GROUP uigsdata BY uigsdata.query; c = FOREACH qt GENERATE COUNT(uigsdata); STORE c into ‘/user/guest/outdir’
  • 28. Pig是对Google Sawzall语言的山寨产品 目的是提升大数据计算代码的开发效率 几行pig即可完成几十行java mapreduce代码的功能 语言特点 天然支持任务级联,为系统级优化MapReduce提供了可能性 通过Streaming功能提供了扩展机制 强类型: 标量类型:chararray,int,float 向量类型:bag,tuple,map 封装了hdfs操作 # fs -mkdir abc关于Pig
  • 29. 主要缺点扩展性开发效率Java MapRedce开发代码量大,调试步骤繁琐★★★★StreamingMapReduce API非原生支持★★★★★☆HCEMapReduce API非原生支持★★☆★★☆Hive数据schema扩展性比较差★★★★Pig默认不提供数据计算以外的API(如socket/IO)★★☆★★★MapReduce各种开发模式对比
  • 30. 平台组技术文章 Sogou Hadoop代码的文档 常用开发工具下载 cloud_dev@sogou-inc.com http://dev.sogou-inc.com/?q=node/8 各类资源列表