当前位置:首页>开发>正文

如何添加Hadoop依赖通过Maven maven怎么添加hadoop依赖

2023-06-26 17:15:43 互联网 未知 开发

 如何添加Hadoop依赖通过Maven maven怎么添加hadoop依赖

如何添加Hadoop依赖通过Maven

Hadoop开发中需要用到至少不下10个的依赖包,它们相互间的依赖关系比较复杂,不同版本的依赖关系也有所不同,而间接依赖导致的程序错误并不会在运行之前报错,因此确定适合一个版本的依赖包,会耗费相当多的时间。Maven是一个依赖管理和项目构建的工具,它利用惯例组织Java项目的结构,并允许通过简单的配置定义直接依赖,而直接依赖所需的其他依赖则会通过事先定义好的关系列表自动下载,大大节省了开发者本身的工作量。

maven怎么添加hadoop依赖

关于Maven的使用就不再啰嗦了,网上很多,并且这么多年变化也不大,这里仅介绍怎么搭建Hadoop的开发环境。

1. 首先创建工程
[plain] view plain copy
mvn archetype:generate -DgroupId=my.hadoopstudy -DartifactId=hadoopstudy -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false  

2. 然后在pom.xml文件里添加hadoop的依赖包hadoop-common, hadoop-client, hadoop-hdfs,添加后的pom.xml文件如下

[html] view plain copy
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
4.0.0  
my.hadoopstudy  
hadoopstudy  
jar  
1.0-SNAPSHOT  
hadoopstudy  
http://maven.apache.org  

  
  
org.apache.hadoop  
hadoop-common  
2.5.1  
  
  
org.apache.hadoop  
hadoop-hdfs  
2.5.1  
  
  
org.apache.hadoop  
hadoop-client  
2.5.1  
  

  
junit  
junit  
3.8.1  
test  
  
  
  

3. 测试
3.1 首先我们可以测试一下hdfs的开发,这里假定使用上一篇Hadoop文章中的hadoop集群,类代码如下

[java] view plain copy
package my.hadoopstudy.dfs  

import org.apache.hadoop.conf.Configuration  
import org.apache.hadoop.fs.FSDataOutputStream  
import org.apache.hadoop.fs.FileStatus  
import org.apache.hadoop.fs.FileSystem  
import org.apache.hadoop.fs.Path  
import org.apache.hadoop.io.IOUtils  

import java.io.InputStream  
import java.net.URI  

public class Test {  
public static void main(String[] args) throws Exception {  
String uri = "hdfs://9.111.254.189:9000/"  
Configuration config = new Configuration()  
FileSystem fs = FileSystem.get(URI.create(uri), config)  

// 列出hdfs上/user/fkong/目录下的所有文件和目录  
FileStatus[] statuses = fs.listStatus(new Path("/user/fkong"))  
for (FileStatus status : statuses) {  
System.out.println(status)  
}  

// 在hdfs的/user/fkong目录下创建一个文件,并写入一行文本  
FSDataOutputStream os = fs.create(new Path("/user/fkong/test.log"))  
os.write("Hello World!".getBytes())  
os.flush()  
os.close()  

// 显示在hdfs的/user/fkong下指定文件的内容  
InputStream is = fs.open(new Path("/user/fkong/test.log"))  
IOUtils.copyBytes(is, System.out, 1024, true)  
}  
}  

3.2 测试MapReduce作业
测试代码比较简单,如下:

[java] view plain copy
package my.hadoopstudy.mapreduce  

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  

import java.io.IOException  

public class EventCount {  

public static class MyMapper extends Mapper{  
private final static IntWritable one = new IntWritable(1)  
private Text event = new Text()  

public void map(Object key, Text value, Context context) throws IOException, InterruptedException {  
int idx = value.toString().indexOf(" ")  
if (idx > 0) {  
String e = value.toString().substring(0, idx)  
event.set(e)  
context.write(event, one)  
}  
}  
}  

public static class MyReducer 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)  
}  
}  

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: EventCount  ")  
System.exit(2)  
}  
Job job = Job.getInstance(conf, "event count")  
job.setJarByClass(EventCount.class)  
job.setMapperClass(MyMapper.class)  
job.setCombinerClass(MyReducer.class)  
job.setReducerClass(MyReducer.class)  
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)  
}  
}  
运行“mvn package”命令产生jar包hadoopstudy-1.0-SNAPSHOT.jar,并将jar文件复制到hadoop安装目录下
这里假定我们需要分析几个日志文件中的Event信息来统计各种Event个数,所以创建一下目录和文件
[plain] view plain copy
/tmp/input/event.log.1  
/tmp/input/event.log.2  
/tmp/input/event.log.3  

因为这里只是要做一个列子,所以每个文件内容可以都一样,假如内容如下

[plain] view plain copy
JOB_NEW ...  
JOB_NEW ...  
JOB_FINISH ...  
JOB_NEW ...  
JOB_FINISH ...  

然后把这些文件复制到HDFS上
[plain] view plain copy
$ bin/hdfs dfs -put /tmp/input /user/fkong/input  

运行mapreduce作业
[plain] view plain copy
$ bin/hadoop jar hadoopstudy-1.0-SNAPSHOT.jar my.hadoopstudy.mapreduce.EventCount /user/fkong/input /user/fkong/output  

查看执行结果
[plain] view plain copy
$ bin/hdfs dfs -cat /user/fkong/output/part-r-00000

mapreduce依赖于哪些组件

目前开源hadoop只包含hdfs,mr,和yarn,yarn是hadoop2新增组件。
hdfs是hadoop分布式文件系统,主要采用多备份方式存储文件,可以对接hive和hbase等产品并存储对应数据。
mapreduce是大数据处理并行框架,用户可以编写自己的程序调用mr框架并行的处理大数据,在调用过程中可以调整m和r的数目。不过总的来说编程相对复杂,因此诞生了hive.
yarn作为新生控件,主要管理hadoop各个模块运行过程中的任务调度,目前主要有公平调度与容量调度两种模型.

如果需要其他组件,需要单独下载安装。

hadoop云计算


Hadoop是由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。
   Hadoop能够对大量数据进行分布式处理的软件框架。但是Hadoop是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务器,因此它的成本比较低,任何人都可以使用,,,我这里有一套很好的教程可以分享给你

我使用emapreduce hadoop jar依赖的jar怎么上传

主要有4个方式:
1、把引用的所有的第三方jar包打到一个jar包内,形成一个超大包。
优点:简单,执行相对比较简单
缺点:一些版本升级较为麻烦,需要重新升级包
例如在maven可以添加以下配置项:
org.apache.maven.plugins maven-shade-plugin 2.4.2 false ${project.build.directory}/shaded/examples-${project.version}-shaded.jar package shade

2、把引用到所有第三方包放到Hadoop的lib目录下
优点:执行运行即可。
缺点:需要重新启动集群,不容易维护
不推荐
3、把引用到所有第三方包放到集群中固定的一台机器上,使用libjars命令加载第三方jar
优点:只需要维护hadoop集群中的一台机器上的lib库,易于系统的维护;
缺点:只能在存放jar的机器上去执行hadoop jar 命令执行程序,且执行命令较复杂;
个人对这种方式还可以接受,不过并不是我最喜欢的方式。
在这里,我进行了测试,WordCount的代码不变,打成WordCount_libjarscmd.jar,注意在打包的过程中不要选择lib中的jar文件,然后把OperateHDFS.jar放到集群中的一台机器上面,执行的命令如下所示:
hadoop jar WordCount_libjarscmd.jar com.hadoop.examples.WordCount -libjars OperateHDFS.jar input libjarscmdoutput

4、把jar包放在HDFS或者OSS上,动态加载第三方jar包
优点:程序可以方便的在集群上的任何一个节点运行,且执行命令的机器没有限制;
执行命令:
jar ossref://yourBucket/yourPath/wordcoun