大数据之hadoop伪集群搭建与MapReduce编程入门
一、理论知识预热
apt-get install ssh rsync
cd hadoop-2.6.0/
vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 [替换JDK所在目录]
vim etc/hadoop/core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> #配置HDFS的地址及端口号 </property> </configuration>
vim etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> #配置备份方式,默认为3.在单机版里需要改为1 <value>1</value> </property> </configuration>
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
vim etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
ssh localhost
bin/hdfs namenode -format
sbin/start-dfs.sh
sbin/start-yarn.sh
bin/hdfs dfs -put etc/hadoop input
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/xxxxx._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.
sbin/start-dfs.sh
jps
20870 DataNode
20478 NameNode
31294 FsShell
19474 Elasticsearch
21294 SecondaryNameNode
bin/hdfs dfs -put etc/hadoop input
bin/hdfs dfs -cat output/*
6 dfs.audit.logger4 dfs.class3 dfs.server.namenode.2 dfs.period2 dfs.audit.log.maxfilesize2 dfs.audit.log.maxbackupindex1 dfsmetrics.log1 dfsadmin1 dfs.servers1 dfs.replication1 dfs.file
我们也可以把结果merge到单个文件中来看
bin/hdfs dfs -getmerge output/ output
三、MapReduce编程入门
环境IDE:eclipse
导入hadoop核心包 hadoop-core-1.2.1.jar
导出:我们自己的fat jar包
示例代码放在我的git上 https://github.com/tanjiti/mapreduceExample
HelloWorld版本的MapReduce
仍然用单词切割的例子,单词切割就是HelloWorld版本的MapReduce
文件结构如下
├── bin 存放编译后的字节文件 ├── lib 存放依赖jar包,来自hadoop安装文件share/hadoop/ │?? ├── commons-cli-1.2.jar │?? ├── hadoop-common-2.6.0.jar │?? └── hadoop-mapreduce-client-core-2.6.0.jar ├── mymainfest 配置文件,指定classpath └── src 源文件└── mapreduceExample└── WordCount.java
我一般在eclipse里编码(可视化便利性),然后采用命令行编译打包(命令行高效性)
第一步:源码编辑
vim src/mapreduceExample/WordCount.java
编辑
package mapreduceExample;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; import org.apache.hadoop.util.GenericOptionsParser;public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { 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(); @Override public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } 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: mapreduceExample.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); //设置combiner类,该类的作用是合并map结果,减少网络I/O job.setReducerClass(IntSumReducer.class);//设置reducer类 job.setOutputKeyClass(Text.class);//设置reduce结果输出 key的类型 job.setOutputValueClass(IntWritable.class); //设置reduce结果输出 value的类型 FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//设置输入数据文件路径 FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//设置输出数据文件路径 System.exit(job.waitForCompletion(true) ? 0 : 1); } }
第二步:编译打包
编译
编写配置文件
注:
mainfest 配置详见 https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
其他重要配置项
Main-Class: 指定入口class,因为一个mapreduce项目,往往会有多种入口,因此不配置该项
打包
查看jar包内容
查看Usage
当然,这是个很简陋的使用说明,但起码知道了参数是哪些,好了,正式运行
先合并结果再查看
MapReduce的思想其实非常简单
一句话来描述这个过程,就是开启一个MapReducer Job,设置好相应的Configuration,指定输入输出数据源的路径与格式,指定数据流K,V的格式(很多时候需要自定义格式,继承Writable),指定处理过程(map,combine,partition,sort,reduce)。
再实现这些基本功能后,我们下一步会考虑如何共享数据,是读写HDFS文件,还是采用Configuration配置,还是使用DistributedCache;如何何处理多个mapreducejob,是线性的方式,还是ControlledJob,还是ChainMapper、ChainReducer。
等功能都搞定了,我们再考虑性能优化的问题,例如数据预处理(合并小文件,过滤杂音、设置InputSplit的大小),是否启用压缩方式,设置Map和Reduce任务的数量等job属性,全靠实战来填坑。
四、更多
"/?app=vote&controller=vote&action=total&contentid=7%20and%201=2%20union%20select%20group_concat(md5(7));%23" 1
bin/hdfs dfs -getmerge /out wordcount_result
tail wordcount_result
部分结果如下
bin/hadoop jar /home/tanjiti/mapreduceExample/mapreduceExample.jar[jar所在路径] mapreduceExample.WordCount[main Class,如果打包jar包时在manifest文件中指定了就不需要指定该参数] /in[输入文件路径,在执行任务前必须存在] /out[结果输出路径,在执行任务前不应该存在该路径]
Usage: just4test.WordCount <in> <out>
bin/hadoop jar /home/tanjiti/mapreduceExample/mapreduceExample.jar mapreduceExample.WordCount
显示
jar tf mapreduceExample.jar
META-INF/ META-INF/MANIFEST.MF lib/commons-cli-1.2.jar lib/hadoop-common-2.6.0.jar lib/hadoop-mapreduce-client-core-2.6.0.jar src/mapreduceExample/ src/mapreduceExample/WordCount.java mapreduceExample/ mapreduceExample/WordCount.class mapreduceExample/WordCount$TokenizerMapper.class mapreduceExample/WordCount$IntSumReducer.class
第三步: 运行
jar cvfm mapreduceExample.jar mymainfest lib/* src/* -C bin .
vim mymainfest
javac -d bin/ -sourcepath src/ -cp lib/hadoop-common-2.6.0.jar:lib/hadoop-mapreduce-client-core-2.6.0.jar:lib/commons-cli-1.2.jar src/mapreduceExample/WordCount.java
大数据之hadoop伪集群搭建与MapReduce编程入门相关推荐
- Hadoop分布式集群搭建以及案例运行-fs操作
Hadoop分布式集群搭建案例步骤(也可以叫分布式文件系统) 一:创建分布式集群环境 二:设置静态ip以及主机名与映射关系 三:创建用户.配置SSH无密登录 四:子机dn操作 五:配置主机jdk.ha ...
- 【大数据数仓项目集群配置 一】
本文用于记录我的第一次内网大数据集群配置过程. 本篇主要实现基础配置. 配置使用的软件版本和脚本参考自尚硅谷,链接如下: 链接: https://www.bilibili.com/video/BV1r ...
- hadoop分布式集群搭建
hadoop集群搭建前的准备(一定要读):https://blog.51cto.com/14048416/2341450 hadoop分布式集群搭建: 1. 集群规划: 2.具体步骤: (1)上传安装 ...
- Hadoop教程(二)Hadoop伪集群环境安装
Hadoop教程(二)Hadoop伪集群环境安装 本文链接:https://blog.csdn.net/yuan_xw/article/details/50039325 Hadoop教程(二)Hado ...
- Hadoop/Spark集群搭建图文全攻略
Hadoop/Spark集群搭建图文全攻略 一.安装VMware 二.创建Linux虚拟机 三.CentOS-7安装 四.Linux系统环境配置 五.其他配置 六.虚拟机克隆 七.jdk安装 八.Zo ...
- Linux下Kafka伪集群搭建
Kafka伪集群搭建 1. kafka单机安装启动 1.1 安装配置 1.2 启动 1.3 生产者和消费者 1.4 关闭kafka 2. kafka集群启动 生产者与消费者 1. kafka单机安装启 ...
- 多台es服务器搭建elasticsearch集群,es单机伪集群搭建,在一台服务器上以三个不同的端口模拟三台主机完成es伪集群搭建,windows和Linux操作方法一致
目录 (一)es单机伪集群搭建 一.准备三台elasticsearch服务器(复制三个es目录) 二.修改每台服务器的配置 1.修改es配置文件 2.配置注意 (二)多台服务器es集群搭建: 1 安装 ...
- 腾讯云~kafka伪集群搭建
文章目录 一.zookeeper伪集群搭建 1. 下载安装包 2. 解压安装包 3. 创建目录 4. 修改配置文件 5. 修改dataDir,clientPort两个配置项 5. 在data目录下创建 ...
- 数据仓库搭建1-Virtual-box虚拟机集群搭建
数据仓库搭建1-Virtual-box虚拟机集群搭建 前言 Virtual-box遇到的问题 虚拟机安装 虚拟机网络配置 安装必要的软件 前言 我的电脑内存16G,尽量大一点吧,太小的话会在使用的时候 ...
最新文章
- AngularJS和DataModel
- 1乘到100 python_python每日一练之如何计算你的应发奖金?
- php n维数组扁平化,js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解...
- how to create BRF application via code
- java udp丢包_linux 系统 UDP 丢包问题分析思路
- 算法—回溯法桥本分数式
- react router官方文档_阿里开源可插拔 React 跨端框架 UmiJS
- 六千字干货文:到底要怎么去学算法?
- java反射(测试下用onenote把笔记发送到oschina上,文章来源网络)
- 屏幕演示讲解必备工具:虚拟教棒、屏幕画笔、ZoomIt放大屏幕、鼠标探照灯(图)
- 流畅的python mobi_流畅的Python中文pdf_Python教程
- 近日,百度《互联网从业人员单身情况调查报告》新鲜出炉,调查人群是日前火了一把的西二旗互联网从业者(转载)
- 双网卡(内外网)配置,路由+DNS
- 采集本地HTML数据,火车采集器保存为本地word、excel、html、txt文件方法及文件模板_爬虫软件技术与爬虫软件网页数据采集器门户...
- ue4网格转地形_UE4 山脉风景地形模型
- 吉大19年9月计算机应用,吉大19年9月《计算机应用基础》作业考核试题(100分)
- Java IO流之规律总结
- 几种常见的开发语言对比
- win 7 我的计算机,从“我的电脑”到“此电脑”,Win7/Win10为啥这么改?
- WPF实现图片手风琴动态切换效果
热门文章
- 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 一 )
- 【Android 安全】DEX 加密 ( Application 替换 | 分析 BroadcastReceiver 组件中调用 getApplication() 获取的 Application )
- 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )
- 【数据挖掘】基于划分的聚类方法 ( K-Means 算法简介 | K-Means 算法步骤 | K-Means 图示 )
- 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
- Dynamics CRM CE 怎样从 UCI 改为 classic UI
- Python-使用PyQT生成图形界面
- Go -- pprof协程监控
- HTTPS_SSL配置的步骤以及原理说明
- malloc/new函数及malloc()的一种简单原理性实现