• 1. Hadoop实用指南刘明珠 Cloud_dev
  • 2. Sogou的Hadoop生态系统 Hadoop Quick Start 深入MapReduce 了解MapReduce运行机制 如何调试MapReduce MultiInput & MultiOutput 数据Join操作 关于UigsTools MapReduce进阶开发模式 各类资源列表提纲
  • 3. 数据服务 Uigs/SogouRank公共数据由系统管理员管理 各个用户自行管理/user/目录下的数据 Hadoop任务管理系统 替代crontab 方便管理大量任务 支持任务依赖关系、监控报警 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生态系统
  • 4. 日常开发: 晨曦集群 LA-test 定时执行的关键业务: Zeus集群 LA集群 各业务专用集群 urllib/meepo/alex/zionSogou现有Hadoop集群
  • 5. 搭建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
  • 6. 第一个MapReduce程序如何下手 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(续)
  • 7. 步骤 将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一般开发模式
  • 8. Client/JobTracker/TaskTracker InputFormat getSplits() / getRecordReader() OutputFormat Mapper/Reducer/Combiner Partitioner 分环策略MapReduce运行机制
  • 9. 推荐开发步骤 单元测试 MRUnit/JUnit 本地模式调试 Eclipse 分布式模式调试 Counter 打日志,并通过Web UI查看调试 MapReduce程序
  • 10. 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的本地模式
  • 11. NameTypeDescriptionmapred.job.idStringThe job idmapred.jarStringjob.jar location in job directoryjob.local.dirStringThe job specific shared scratch spacemapred.tip.idStringThe task idmapred.task.idStringThe task attempt idmapred.task.is.mapboolean Is this a map taskmapred.task.partitionint The id of the task within the jobmap.input.fileStringThe filename that the map is reading frommap.input.startlongThe offset of the start of the map input splitmap.input.length long The number of bytes in the map input splitmapred.work.output.dirString The task's temporary output directoryMapper通过Configuation获取的信息
  • 12. MultiInput 以多种文件为输入的Job,不同文件采用不同的InputFormat和Mapper 用法:在job初始化阶段 MultipleInputs.addInputPath( job, path, inputformat_class [, mapperClass] ) 局限性: 仅针对文件类型 MultiOutput 一个Job中产生多种输出文件 用法稍微复杂一些,见下页PPT 局限性: 仅针对文件类型MultiInput & MultiOutput
  • 13. 任务创建阶段 MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, LongWritable.class, Text.class); 多次执行以指定多种输出数据 每种输出数据需要指定对应的OutputFormat/output key class/output value class。 输出阶段(通常为Reducer) 重载setup方法,执行MultipleOutputs的初始化 重载cleanup方法,调用MultipleOutputs.close() 执行过程中,用MultipleOutputs.write()替代context.write(); 示例代码见下页MultiOutput用法
  • 14. public class MOReduce extends Reducer { private MultipleOutputs mos; public void setup (Context context) { ... mos = new MultipleOutputs(context); } public void reduce (WritableComparable key, Iterator values, Context context) throws IOException { ... mos.write("text", , key, new Text("Hello")); mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a"); mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b"); mos.write(key, new Text("value"), generateFileName(key, new Text("value"))); ... } public void cleanup (Context) throws IOException { mos.close(); ... } }
  • 15. 大数据进行Join 数据都作为Input Mapper根据文件名或文件格式进行区分处理 大数据和小数据进行join 小数据通过DistributedCache分发 文件需要先上传到hdfs DistributedCache.addCacheFile(URI,conf) Mapper程序自行加载小数据,开发者编码实现数据Join操作
  • 16. UigsTools的起源 主要功能 封装了通用日志的具体位置 解析uigs日志格式的工具类 计算pv/uv的api 数据入Mysql库 将多个任务串起来执行 文档见此处 后期整理,内容可能不全关于UigsTools
  • 17. 获取代码库 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
  • 18. UigsTools已知的问题 早期设计的局限性 目录规范不合理 所有文件都堆放在/root/CustomResult 未来计划采用Pig、Hive替代它UigsTools的现状和未来
  • 19. Streaming HCE PigMapReduce进阶开发模式
  • 20. 用法 完成Mapper/Reducer/主程序 可以使脚本、可执行程序、java类等 执行程序 # hadoop org.apache.hadoop.streaming.HadoopStreaming –mapper -reducer -file <依赖的数据文件或库文件> 了解更多参数 # hadoop org.apache.hadoop.streaming.HadoopStreaming –hMapReduce进阶开发模式-Streaming
  • 21. 用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示例
  • 22. 什么是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
  • 23. 步骤 (可选)在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’
  • 24. Pig是对Google Sawzall语言的山寨产品 目的是提升大数据计算代码的开发效率 几行pig即可完成几十行java mapreduce代码的功能 语言特点 天然支持任务级联,为系统级优化MapReduce提供了可能性 通过Streaming功能提供了扩展机制 强类型: 标量类型:chararray,int,float 向量类型:bag,tuple,map 封装了hdfs操作 # fs -mkdir abc关于Pig
  • 25. 主要缺点扩展性开发效率Java MapRedce开发代码量大,调试步骤繁琐★★★★StreamingMapReduce API非原生支持★★★★★☆HCEMapReduce API非原生支持★★☆★★☆Hive数据schema扩展性比较差★★★★Pig默认不提供数据计算以外的API(如socket/IO)★★☆★★★MapReduce各种开发模式对比
  • 26. 平台组技术文章 Sogou Hadoop代码的文档 常用开发工具下载 cloud_dev@sogou-inc.com http://dev.sogou-inc.com/?q=node/8 各类资源列表