赞
踩
1 设计要求
1.1 功能要求
Hadoop框架的广泛性,大多数的电脑都可以使用,HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
1.2 架构要求
使用cmd命令进行相关的键入和输出,使用的主要框架是Hadoop框架和eclipse软件进行代码的编写。
1.3 性能要求
Hadoop处理数据的速度非常快而且Hadoop按位存储和处理数据的能力非常可靠。
(对应的共同好友问题也是如此)
2 hadoop下载、安装与配置
1)hadoop2.7.2下载与安装
3)复制上述7个文件到: C:\zl\hadoop-2.7.2\bin下。
4)复制hadoop.dll和winutils.exe到: C:\Windows\System32下。(这里注意一定要导入到相关的目录下面否则在后期程序运行的时候会出现Hadoop的错误)
JDK的下载安装和配置的多余步骤这里就不作多余的解释,需要的可以私聊我。
3)hadoop环境变量设置
HADOOP_HOME 设置
配置你安装的路径即可
CLASSPATH 设置
新建classpath变量
内容:%HADOOP_HOME%\bin;%HADOOP_HOME%\lib;(注意这个引号的形式应该是英文形式的,否则输入之后会报错)
4)hadoop参数配置
进入C:\wh\hadoop-2.7.2\etc\hadoop目录,找到
1)Hadoop-env.cmd 配置,该文件主要用于设置Hadoop和Yarn的的环境变量。
打开该文件,在文件末位增加:
set JAVA_HOME=C:\Java\jdk1.8.0_92
set HADOOP_HOME=C:\wh\hadoop-2.7.2
set HADOOP_PREFIX=C:\wh\hadoop-2.7.2
set HADOOP_CONF_DIR=%HADOOP_PREFIX%\etc\hadoop
set YARN_CONF_DIR=%HADOOP_CONF_DIR%
set PATH=%PATH%;%HADOOP_PREFIX%\bin
2)core-site.xml 配置: 该文件主要用于namenode的IP地址和端口
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://0.0.0.0:19000/</value> (0.0.0.0表示本机地址)
</property>
</configuration>
3)hdfs-site.xml 配置
<configuration>
<property>
<name>dfs.replication</name> (数据的副本数)
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/C:/wh/txtfile/namenodedata</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/C:/wh/txtfile/datanodedata</value>
</property>
</configuration>
4)mapred-site.xml的配置,配置mapreduce框架相关的位置
<configuration> <property> <name>mapreduce.job.user.name</name> <value>%USERNAME%</value> </property> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.apps.stagingDir</name> <value>/user/%USERNAME%/staging</value> </property> <property> <name>mapreduce.jobtracker.address</name> <value>local</value> </property> </configuration>
<configuration> <property> <name>yarn.server.resourcemanager.address</name> <value>0.0.0.0:8020</value> </property> <property> <name>yarn.server.resourcemanager.application.expiry.interval</name> <value>60000</value> </property> <property> <name>yarn.server.nodemanager.address</name> <value>0.0.0.0:45454</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.server.nodemanager.remote-app-log-dir</name> <value>/app-logs</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/dep/logs/userlogs</value> </property> <property> <name>yarn.server.mapreduce-appmanager.attempt-listener.bindAddress</name> <value>0.0.0.0</value> </property> <property> <name>yarn.server.mapreduce-appmanager.client-service.bindAddress</name> <value>0.0.0.0</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>1</value> </property> <property> <name>yarn.application.classpath</name> <value>%HADOOP_CONF_DIR%,%HADOOP_COMMON_HOME%/share/hadoop/common/*,%HADOOP_COMMON_HOME%/share/hadoop/common/lib/*,%HADOOP_HDFS_HOME%/share/hadoop/hdfs/*,%HADOOP_HDFS_HOME%/share/hadoop/hdfs/lib/*,%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/*,%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/lib/*,%HADOOP_YARN_HOME%/share/hadoop/yarn/*,%HADOOP_YARN_HOME%/share/hadoop/yarn/lib/*</value> </property> </configuration>
3、hadoop 格式化与启动
1) 切换到hadoop目录下
etc/hadoop
2) 运行hadoop-env.cmd脚本
3) 格式化HDFS文件系统
运行 %HADOOP_PREFIX%\bin\hdfs namenode -format 命令,格式化hadoop文件系统
(注意:如果已经格式化,系统会提示是否重新格式化。 这步操作不是每次必须执行的,执行过一次就行了,以后再启动hadoop时候,不需要执行这一步操作。)
4)启动HDFS
运行%HADOOP_PREFIX%\sbin\start-dfs.cmd ,启动hadoop文件系统
(弹出两个窗口,中间没有shut down代表着Hadoop运行起来了)
5) 启动yarn
2、新建类StepFirst和StepSecond
5 实验步骤代码解释 5.1 将数据加载到hadoop的平台,在导入到eclipse的Hadoop1当中 hdfs dfs -mkdir /invert 先创建在hadoop创建一个invert文件 hdfs dfs -put D:/cloudtest/fr3.txt /invert 成功的导入到Hadoop的平台和eclipse的Hadoop1当中 5.2 将选课的原始数据进行相关的切割,并且进行相关的拼接 <1>map1 protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, Text>.Context context)throws IOException, InterruptedException String line = value.toString();//传入的value 12018001:。。。。,吧value转换为字符串,line表示行数据,就为学号 String[] arr = line.split(":");//分割字符串 最后进行循环便遍历,以<科目,学号>的形式进行输出 这是第一个map所作的事情 <2>reduce1 protected void reduce(Text friend, Iterable<Text> users,Context context)throws IOException, InterruptedException { StringBuffer buf = new StringBuffer();//上面是传入数据,下面是建立一个buffer来存放有该科目的学号们 for (Text user : users) { buf.append(user).append(",");//遍历学号,将学号放在buffer中,“,”分割 } context.write(new Text(friend), new Text(buf.toString())); } 最后进行循环遍历,科目为key,学号为value进行输出,样式为 科目 学号1,学号2,学号3 <3>main主函数 public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf);//实例化job job.setJarByClass(StepFirst.class);//设置主类名 job.setOutputKeyClass(Text.class);//设置job的key job.setOutputValueClass(Text.class); job.setMapperClass(FirstMapper.class); job.setReducerClass(FirstReducer.class); FileInputFormat.setInputPaths(job, new Path(args[0]));//输入wh中的class FileOutputFormat.setOutputPath(job, new Path(args[1]));//输出cut1中 job.waitForCompletion(true); } 到此为止,第一步的输入和输出都已经结束了,但是输入和输出需要在run configs中手动进行配置 hdfs://0.0.0.0:19000/invert/wh.txt/ hdfs://0.0.0.0:19000/invert/cut1/ 输入和输出的端口号在eclipse的配置中都有进行相关的说明,注意输入的格式是txt格式 5.3 将第一步的数据进行切割进行最后的拼接输出 <1>map2 protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, Text>.Context context)throws IOException, InterruptedException { String line = value.toString();//将Accounting12018001,12018003,12018007传入“\t分割” String[] friend_users = line.split("\t");//得到科目和学号 String friend = friend_users[0];//0的位置就是Accounting String[] users = friend_users[1].split(",");//分割字符串得到每一个学号 Arrays.sort(users);//把学号进行排序,防止重复 for (int i = 0; i < users.length-1; i++) { for (int j = i+1; j < users.length; j++) {//学号——学号为key,科目为value传到reducer2 context.write(new Text(users[i]+"-"+users[j]), new Text(friend));//进行循环遍历 <2>reduce2 protected void reduce(Text user_user, Iterable<Text> friends,Context context)throws IOException, InterruptedException { StringBuffer buf = new StringBuffer();//传入的学号-学号 科目 新建buffer用来存储学号们的共同科目 or (Text friend : friends) { buf.append(friend).append(" "); }//遍历所有的科目,把其放在buf中 context.write(user_user, new Text(buf.toString())); }//科目为key 用户为value 传入下一个mapper <3>main主函数 public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(StepSecond.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setMapperClass(SecondMapper.class); job.setReducerClass(SecondReducer.class); FileInputFormat.setInputPaths(job, new Path(args[0]));//输入路径cut1的值 FileOutputFormat.setOutputPath(job, new Path(args[1]));//shuchu路径cut2中的值 job.waitForCompletion(true); 到此为止,第二步的输入和输出都已经结束了,但是输入和输出需要在run configs中手动进行配置 hdfs://0.0.0.0:19000/invert/cut1/ hdfs://0.0.0.0:19000/invert/cut2/ 输入和输出的端口号在eclipse的配置中都有进行相关的说明 5.4 在cmd命令行中键入查看命令和端口号进行查询 注意在键入命令的时候要到具体的Hadoop的目录下面,否则会产生报错,无法进行查看 键入hdfs dfs –cat /invert/cut1/part-r-00000/ 和cut2
对运行参数进行配置:
第一次切割
1.被统计的文件路径:hdfs://0.0.0.0:19000/invert/wh.txt/
2.统计结果保存文件路径:hdfs://0.0.0.0:19000/invert/cut1/
第二次切割
1.被统计的文件路径:hdfs://0.0.0.0:19000/invert/cut1/
2.统计结果保存文件路径:hdfs://0.0.0.0:19000/invert/cut2/
(需要在运行之后才能对参数进行配置)
第一次mapreduce的切割输出
第二次切割输出
在cmd命令行里的键入命令和相关的显示
6 实验代码
package duo_MapReduce; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; 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 StepFirst { static class FirstMapper extends Mapper<LongWritable,Text,Text,Text>{ @Override protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, Text>.Context context)throws IOException, InterruptedException { String line = value.toString(); String[] arr = line.split(":"); String user = arr[0]; String friends = arr[1]; for (String friend : friends.split(",")) { context.write(new Text(friend), new Text(user)); } } static class FirstReducer extends Reducer<Text, Text, Text, Text>{ @Override protected void reduce(Text friend, Iterable<Text> users,Context context)throws IOException, InterruptedException { StringBuffer buf = new StringBuffer(); for (Text user : users) { buf.append(user).append(","); } context.write(new Text(friend), new Text(buf.toString())); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(StepFirst.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setMapperClass(FirstMapper.class); job.setReducerClass(FirstReducer.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); } } import java.util.Arrays; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; 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 StepSecond { static class SecondMapper extends Mapper<LongWritable,Text,Text,Text>{ @Override protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, Text>.Context context)throws IOException, InterruptedException { String line = value.toString(); String[] friend_users = line.split("\t"); String friend = friend_users[0]; String[] users = friend_users[1].split(","); Arrays.sort(users); for (int i = 0; i < users.length-1; i++) { for (int j = i+1; j < users.length; j++) { context.write(new Text(users[i]+"-"+users[j]), new Text(friend)); } } } } static class SecondReducer extends Reducer<Text, Text, Text, Text>{ @Override protected void reduce(Text user_user, Iterable<Text> friends,Context context)throws IOException, InterruptedException { StringBuffer buf = new StringBuffer(); for (Text friend : friends) { buf.append(friend).append(" "); } context.write(user_user, new Text(buf.toString())); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(StepSecond.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setMapperClass(SecondMapper.class); job.setReducerClass(SecondReducer.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); }
**7 可能遇见的问题描述**
(1)在Hadoop的配置过程中出现了很多问题比如在配置相关的配置环境变量的时候Java home的时候应该把具体的路径打进去。
(2)还有在格式化了Hadoop之后,Hadoop挂掉了,应该把上一次运行的name文件删除掉在进行运行。
(3)在运行eclipse的代码的时候,出现了jdk找不到main的错误,是应该把电脑中的原来的jdk卸载掉在进行配置,因为以前的eclipse当中默认运行的以前的jdk。
(4)加之在配置两个mapreduce文件的run configs的时候应该注意的第一个文件的输入路径是第二个文件的输入路径问题。
(5)如果出现了log4三排日志文件的问题具体原因可以百度,就是在file里面加入日志文件之后就不会出现红色报错问题。
**最后感谢我的大数据老师张玲给与我的帮助**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。