本文的主要目的
本文主要记录了通过windows10上的IDEA向远程HADOOP集群提交应用的配置过程。之前写的不是很详细,现在做一下补充。
安装配置HADOOP集群
略
安装配置IDEA
略
配置windows端HADOOP客户端
- 复制集群中的hadoop文件夹到windows,作为windows上的hadoop客户端。
- 配置windows hadoop环境变量
# hadoop的home目录所在位置
HADOOP_HOME=D:\hadoop-ocdp3.5
HADOOP_BIN_PATH=%HADOOP_HOME%\bin
HADOOP_PREFIX=%HADOOP_HOME%
# 在path后追加
;%HADOOP_HOME%\sbin;%HADOOP_HOME%\bin;
- 配置hosts文件
如果你的hadoop配置文件中的相关地址使用的是域名,而非IP地址,你需要在windows的hosts文件中添加域名解析。
Windows系统hosts文件位于:C:\Windows\System32\drivers\etc,其映射格式同Linux,可以直接将hadoop namenode节点的/etc/hosts文件中的域名映射直接复制到windows hosts文件中。 - 验证HADOOP
执行hadoop version
,不报错即可。如图
- 备注
可能还需要hadoop.dll
,winutils.exe
,相关下载地址:http://www.downxia.com/downinfo/201744.html。 下载完成后,将以上两个文件放于HADOOP_HOME/bin
的目录下。
配置IDEA(针对MAVEN项目)
非MAVEN项目的话,可以自己从
HADOOP_HOME/share/hadoop
文件夹下导入jar包。
- 配置maven依赖
下面贴出我自己的maven文件,仅供参考
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pers.zhaopy</groupId>
<artifactId>bigdata</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.6.0</version>
</dependency>
<!--Unit test -->
<!-- https://mvnrepository.com/artifact/org.apache.mrunit/mrunit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.mrunit/mrunit -->
<dependency>
<groupId>org.apache.mrunit</groupId>
<artifactId>mrunit</artifactId>
<version>1.1.0</version>
<scope>test</scope>
<classifier>hadoop2</classifier>
</dependency>
</dependencies>
<repositories>
<!--<!– 阿里云 –>-->
<!--<repository>-->
<!--<id>maven-ali</id>-->
<!--<url>http://maven.aliyun.com/nexus/content/groups/public//</url>-->
<!--<releases>-->
<!--<enabled>true</enabled>-->
<!--</releases>-->
<!--<snapshots>-->
<!--<enabled>true</enabled>-->
<!--<updatePolicy>always</updatePolicy>-->
<!--<checksumPolicy>fail</checksumPolicy>-->
<!--</snapshots>-->
<!--</repository>-->
<repository> <!-- Maven 自带的中央仓库使用的Id为central 如果其他的仓库声明也是用该Id 就会覆盖中央仓库的配置 -->
<!--<id>mvnrepository</id>-->
<id>central</id>
<name>mvnrepository</name>
<url>http://www.mvnrepository.com/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
- 配置生成可执行jar包
编写涉及到本地运行的代码。
// 指定日志文件位置,必须使用绝对路径,可以直接使用hadoop配置文件中的log4j.properties,也可单独建立
PropertyConfigurator.configure("D:\\IJworkspace\\bigdata\\src\\main\\resources\\hadoop\\log4j.properties");
// 添加配置文件
Configuration conf = new Configuration();
conf.addResource("hadoop/hdfs-site.xml");
conf.addResource("hadoop/core-site.xml");
conf.addResource("hadoop/mapred-site.xml");
conf.addResource("hadoop/yarn-site.xml");
// 如果要从windows系统中运行这个job提交客户端的程序,则需要加这个跨平台提交的参数
conf.set("mapreduce.app-submission.cross-platform","true");
// 指定jar文件,该jar文件为mapreduce程序,需要是可执行jar包,文件路径可以是本地文件路径或hdfs路径
Job job = Job.getInstance(conf);
// 此处路径之前设置的jar文件路径
job.setJar("D:\\IJworkspace\\bigdata\\out\\artifacts\\bigdata_jar\\bigdata.jar");
配置运行参数,以下图为例进行配置,此处可配置命令行参数
运行
以上配置完成后点击三角
运行即可
实例
此处使用LocalRunner
类封装了一下,相关路径已经写死了
项目Github地址
package common;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.Job;
import org.apache.log4j.PropertyConfigurator;
import java.io.IOException;
/**
* 打包win提交时的运行参数
*/
public class LocalRunner {
static {
PropertyConfigurator.configure("D:\\IJworkspace\\bigdata\\src\\main\\resources\\hadoop\\log4j.properties");
}
/**
* 向配置中添加hadoop集群配置文件
* @param conf Configuration 实例
*/
public static void packageConfiguration(Configuration conf) {
conf.addResource("hadoop/hdfs-site.xml");
conf.addResource("hadoop/core-site.xml");
conf.addResource("hadoop/mapred-site.xml");
conf.addResource("hadoop/yarn-site.xml");
// 如果要从windows系统中运行这个job提交客户端的程序,则需要加这个跨平台提交的参数
conf.set("mapreduce.app-submission.cross-platform","true");
}
/**
* 返回一个包装过的job实例
* @param conf Configuration 实例
* @return Job 包装过的job实例
*/
public static Job packageJob(Configuration conf) throws IOException {
Job job = Job.getInstance(conf);
job.setJar("D:\\IJworkspace\\bigdata\\out\\artifacts\\bigdata_jar\\bigdata.jar");
return job;
}
}
使用时调用如下即可
package chapter6.v2;
/*
* @date 2018/11/5
*/
import common.LocalRunner;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class MaxTemperatureDriver extends Configured implements Tool {
public int run(String[] strings) throws Exception {
if (strings.length != 2) {
System.out.printf("[Usage]: %s [generic options] <output> <output>\n", getClass().getSimpleName());
ToolRunner.printGenericCommandUsage(System.err);
return -1;
}
Configuration conf = getConf();
// 本地提交
LocalRunner.packageConfiguration(conf);
Job job = LocalRunner.packageJob(conf);
job.setJobName("Max Temperature Test");
job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setCombinerClass(MaxTemperatureReducer.class);
FileSystem fs = FileSystem.get(conf);
fs.delete(new Path(strings[1]), true);
FileInputFormat.addInputPath(job, new Path(strings[0]));
FileOutputFormat.setOutputPath(job, new Path(strings[1]));
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
return job.waitForCompletion(true) ? 0: 1;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new MaxTemperatureDriver(), args);
System.exit(exitCode);
}
}