Hadoop: Intellij结合Maven本地运行和调试MapReduce程序 (无需搭载Hadoop和HDFS环境)
Hadoop: Run and Debug Hadoop MapReduce Applications with Intellij IDEA and Maven locally, without Hadoop and HDFS environment.
前言
Hadoop可以运行在三种模式下:
- 单机模式
- 伪分布模式
- 完全分布式模式
相信初学者入门Hadoop的第一堂课就是伪分布模式Hadoop系统的安装,相信一定是血泪史各种翻教程各种重装。而实际上,基于Hadoop的MapReduce程序在单机上运行,并不一定需要安装伪分布模式Hadoop系统,甚至,并不一定需要安装Hadoop。
运行和调试MapReduce程序只需要有相应的Hadoop依赖包就行,可以完全当成一个普通的JAVA程序。本文就将介绍这种简单方便的方法。
简介
正如上文所说,在单机模式下,可以将MapReduce程序当成一个普通的JAVA程序;对比伪分布模式,其主要不足就在于没有Hadoop的整个管理控制系统,如JobTracker面板,而只是用来运行和调试程序;而其优点就在于开发调试方便,编写的程序通常不需要修改即可在真实的分布式Hadoop集群下运行。
Maven
Maven是一个项目管理工具,我们这里主要用到的是它的依赖管理系统。通常我们在开发Hadoop MapReduce程序时,首先要下载对应版本的镜像,然后加载镜像中的JAR依赖包,开始编写代码。这个步骤说起来容易但经常会碰到错综复杂的依赖关系,而利用Maven就能轻松解决这个问题。只需要在Maven配置文件中指定Hadoop依赖包名字和版本号,Maven就能自动搞定这些依赖,你只需要专心写代码就好了。
Intellij IDEA
为什么不用Eclipse呢?这里没有贬低Eclipse的意思,只是我认为Eclipse用户体验太差,而且各种操作过于繁琐。Intellij用起来更顺手,内置了Maven的支持,而且看起来似乎更有前景,就使用Intellij了。
环境要求
- JDK 1.7(1.8似乎也可以,但Hadoop官方推荐1.7)
- Intellij
不需要安装任何模式的Hadoop。
WordCount
这里以Hadoop的官方示例程序WordCount为例,演示如何一步步编写程序直到运行。
新建项目
在Intellij中点击File
->New
->Project
,在弹出的对话框中选择Maven
,JDK选择1.7,点击Next
。
接下来填写Maven的GroupId
和ArtifactId
,随便填,点击Next
。
然后是Project name,这里填写WordCount
,点击Finish
。
这样就新建好了一个空的项目,别着急,还有一个地方可能需要修改。打开Intellij的Preference偏好设置,定位到Build, Execution, Deployment
->Compiler
->Java Compiler
,将WordCount的Target bytecode version
修改为1.7。
配置依赖
新建项目后,在Intellij左上方会有项目文件结构,双击以编辑pom.xml
,这就是Maven的配置了。
添加源
pom.xml
初始内容如下
<?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>com.polarxiong</groupId>
<artifactId>hadoop</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
在project
内尾部添加
<repositories>
<repository>
<id>apache</id>
<url>http://maven.apache.org</url>
</repository>
</repositories>
添加apache源。
添加依赖
这里只需要用到基础依赖hadoop-core
和hadoop-common
;如果需要读写HDFS,则还需要依赖hadoop-hdfs
和hadoop-client
;如果需要读写HBase,则还需要依赖hbase-client
。
在project
内尾部添加
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
</dependencies>
这里hadoop-core
的version
一般为1.2.1,hadoop-common
的version
可以依照你的实际需要来。
修改pom.xml完成后,Intellij右上角会提示Maven projects need to be Imported
,点击Import Changes
以更新依赖
附上完整的pom.xml
<?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>com.polarxiong</groupId>
<artifactId>hadoop</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
<repository>
<id>apache</id>
<url>http://maven.apache.org</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
</dependencies>
</project>
WordCount
在src
->main
->java
下新建一个WordCount
类,添加内容
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;
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();
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();
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();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
此代码来自Hadoop官方教程,出处见参考。
配置输入文件
WordCount对输入文件字符进行计数,输出计数的结果。首先需要配置输入路径,这里在WordCount
下(src
同级目录)新建一个文件夹input
,并添加一个或多个文本文件到input
中,作为示例。
这里还有一件事情,点击File
->Project Structure
,在弹出来的对话框中选择Modules
项,点击Sources
选项卡,将Language level
调整为7。(如果你用到版本控制的话,可以在这里将input
文件夹标记为Excluded
。
配置运行参数
这里我们需要配置此程序运行时的Main class,以及WordCount需要的输入输出路径。
在Intellij菜单栏中选择Run
->Edit Configurations
,在弹出来的对话框中点击+
,新建一个Application
配置。配置Main class
为WordCount
(可以点击右边的...
选择),Program arguments
为input/ output/
,即输入路径为刚才创建的input
文件夹,输出为output
。
运行和调试
运行
上述配置完成后,点击菜单栏Run
->Run 'WordCount'
即开始运行此MapReduce程序,Intellij下方会显示Hadoop的运行输出。待程序运行完毕后,Intellij左上方会出现新的文件夹output
,其中的part-r-00000
就是运行的结果了!
由于Hadoop的设定,下次运行时务必删除output
文件夹!
调试
断点调试也很容易,在需要设置的代码前单击加上断点,点击菜单栏Run
->Debug 'WordCount'
即开始调试,程序会在断点处停下。
Windows下的权限问题
Windows下运行可能会出错,提示
ERROR security.UserGroupInformation: PriviledgedActionException as ...
这是因为当前用户没有权限来设置路径权限(Linux无此问题),一个解决方法是给hadoop打补丁,参考Failed to set permissions of path: tmp,因为这里使用的Maven,此方法不太适合。另一个方法是将当前用户设置为超级管理员(“计算机管理”,“本地用户和组”中设置),或以超级管理员登录运行此程序。
不过我觉得最好的解决方法是在Linux或macOS上跑hadoop。
小结
上面描述的步骤有些多,但逻辑上都是很清晰的,有过一次经验以后就之后就容易多了,主要就是在pom.xml的配置和运行参数的配置上。删除WordCount程序的运行不需要任何的Hadoop开发环境,并且依赖问题全部交给Maven解决了,怎么样?是不是非常简单?
DEMO
本示例程序代码放在Github上,参见zhantong/Hadoop-WordCount。
Connected to the target VM, address: '127.0.0.1:62636', transport: 'socket'
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) at org.apache.hadoop.util.Shell.runCommand(Shell.java:149) at org.apache.hadoop.util.Shell.run(Shell.java:134) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:286) at org.apache.hadoop.util.Shell.execCommand(Shell.java:354) at org.apache.hadoop.util.Shell.execCommand(Shell.java:337) at org.apache.hadoop.fs.RawLocalFileSystem.execCommand(RawLocalFileSystem.java:481) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:473) at org.apache.hadoop.fs.FilterFileSystem.setPermission(FilterFileSystem.java:280) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:266) at org.apache.hadoop.mapred.JobClient.configureCommandLineOptions(JobClient.java:573) at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:761) at org.apache.hadoop.mapreduce.Job.submit(Job.java:432) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447) at WordCount.main(WordCount.java:60)20/06/25 22:39:08 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
20/06/25 22:39:27 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
Exception in thread "main" java.io.IOException: Cannot run program "chmod": CreateProcess error=2, 系统找不到指定的文件。
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.<init>(ProcessImpl.java:444) at java.lang.ProcessImpl.start(ProcessImpl.java:140) at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) ... 14 moreDisconnected from the target VM, address: '127.0.0.1:62636', transport: 'socket'
Process finished with exit code 1
安装cygwin后,将它的bin目录加入到path中就可以了
你好,我按上述步骤,(在application那一步main class选择WordCount为红色的)run后出现以下情况:
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691) at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126) at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942) at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936) at org.apache.hadoop.mapreduce.Job.submit(Job.java:550) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580) at WordCount.main(WordCount.java:59)"C:Program FilesJavajdk1.7.0_80binjava.exe" "-javaagent:D:new program filesintellijIntelliJ IDEA 2018.3.5libidea_rt.jar=12604:D:new program filesintellijIntelliJ IDEA 2018.3.5bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.7.0_80jrelibcharsets.jar;C:Program FilesJavajdk1.7.0_80jrelibdeploy.jar;C:Program FilesJavajdk1.7.0_80jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.7.0_80jrelibextdnsns.jar;C:Program FilesJavajdk1.7.0_80jrelibextjaccess.jar;C:Program FilesJavajdk1.7.0_80jrelibextlocaledata.jar;C:Program FilesJavajdk1.7.0_80jrelibextsunec.jar;C:Program FilesJavajdk1.7.0_80jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.7.0_80jrelibextsunmscapi.jar;C:Program FilesJavajdk1.7.0_80jrelibextzipfs.jar;C:Program FilesJavajdk1.7.0_80jrelibjavaws.jar;C:Program FilesJavajdk1.7.0_80jrelibjce.jar;C:Program FilesJavajdk1.7.0_80jrelibjfr.jar;C:Program FilesJavajdk1.7.0_80jrelibjfxrt.jar;C:Program FilesJavajdk1.7.0_80jrelibjsse.jar;C:Program FilesJavajdk1.7.0_80jrelibmanagement-agent.jar;C:Program FilesJavajdk1.7.0_80jrelibplugin.jar;C:Program FilesJavajdk1.7.0_80jrelibresources.jar;C:Program FilesJavajdk1.7.0_80jrelibrt.jar;E:360安全浏览器下载wordcounttargetclasses;C:Usersasus.m2repositoryorgapachehadoophadoop-core1.2.1hadoop-core-1.2.1.jar;C:Usersasus.m2repositorycommons-clicommons-cli1.2commons-cli-1.2.jar;C:Usersasus.m2repositoryxmlencxmlenc0.52xmlenc-0.52.jar;C:Usersasus.m2repositorycomsunjerseyjersey-core1.8jersey-core-1.8.jar;C:Usersasus.m2repositorycomsunjerseyjersey-json1.8jersey-json-1.8.jar;C:Usersasus.m2repositoryorgcodehausjettisonjettison1.1jettison-1.1.jar;C:Usersasus.m2repositorystaxstax-api1.0.1stax-api-1.0.1.jar;C:Usersasus.m2repositorycomsunxmlbindjaxb-impl2.2.3-1jaxb-impl-2.2.3-1.jar;C:Usersasus.m2repositoryjavaxxmlbindjaxb-api2.2.2jaxb-api-2.2.2.jar;C:Usersasus.m2repositoryjavaxxmlstreamstax-api1.0-2stax-api-1.0-2.jar;C:Usersasus.m2repositoryjavaxactivationactivation1.1activation-1.1.jar;C:Usersasus.m2repositoryorgcodehausjacksonjackson-jaxrs1.7.1jackson-jaxrs-1.7.1.jar;C:Usersasus.m2repositoryorgcodehausjacksonjackson-xc1.7.1jackson-xc-1.7.1.jar;C:Usersasus.m2repositorycomsunjerseyjersey-server1.8jersey-server-1.8.jar;C:Usersasus.m2repositoryasmasm3.1asm-3.1.jar;C:Usersasus.m2repositorycommons-iocommons-io2.1commons-io-2.1.jar;C:Usersasus.m2repositorycommons-httpclientcommons-httpclient3.0.1commons-httpclient-3.0.1.jar;C:Usersasus.m2repositoryjunitjunit3.8.1junit-3.8.1.jar;C:Usersasus.m2repositorycommons-codeccommons-codec1.4commons-codec-1.4.jar;C:Usersasus.m2repositoryorgapachecommonscommons-math2.1commons-math-2.1.jar;C:Usersasus.m2repositorycommons-configurationcommons-configuration1.6commons-configuration-1.6.jar;C:Usersasus.m2repositorycommons-digestercommons-digester1.8commons-digester-1.8.jar;C:Usersasus.m2repositorycommons-beanutilscommons-beanutils1.7.0commons-beanutils-1.7.0.jar;C:Usersasus.m2repositorycommons-beanutilscommons-beanutils-core1.8.0commons-beanutils-core-1.8.0.jar;C:Usersasus.m2repositorycommons-netcommons-net1.4.1commons-net-1.4.1.jar;C:Usersasus.m2repositoryorgmortbayjettyjetty6.1.26jetty-6.1.26.jar;C:Usersasus.m2repositoryorgmortbayjettyservlet-api2.5-20081211servlet-api-2.5-20081211.jar;C:Usersasus.m2repositoryorgmortbayjettyjetty-util6.1.26jetty-util-6.1.26.jar;C:Usersasus.m2repositorytomcatjasper-runtime5.5.12jasper-runtime-5.5.12.jar;C:Usersasus.m2repositorytomcatjasper-compiler5.5.12jasper-compiler-5.5.12.jar;C:Usersasus.m2repositoryorgmortbayjettyjsp-api-2.16.1.14jsp-api-2.1-6.1.14.jar;C:Usersasus.m2repositoryorgmortbayjettyservlet-api-2.56.1.14servlet-api-2.5-6.1.14.jar;C:Usersasus.m2repositoryorgmortbayjettyjsp-2.16.1.14jsp-2.1-6.1.14.jar;C:Usersasus.m2repositoryantant1.6.5ant-1.6.5.jar;C:Usersasus.m2repositorycommons-elcommons-el1.0commons-el-1.0.jar;C:Usersasus.m2repositorynetjavadevjets3tjets3t0.6.1jets3t-0.6.1.jar;C:Usersasus.m2repositoryhsqldbhsqldb1.8.0.10hsqldb-1.8.0.10.jar;C:Usersasus.m2repositoryorooro2.0.8oro-2.0.8.jar;C:Usersasus.m2repositoryorgeclipsejdtcore3.1.1core-3.1.1.jar;C:Usersasus.m2repositoryorgcodehausjacksonjackson-mapper-asl1.8.8jackson-mapper-asl-1.8.8.jar;C:Usersasus.m2repositoryorgapachehadoophadoop-common2.7.2hadoop-common-2.7.2.jar;C:Usersasus.m2repositoryorgapachehadoophadoop-annotations2.7.2hadoop-annotations-2.7.2.jar;C:Program FilesJavajdk1.7.0_80libtools.jar;C:Usersasus.m2repositorycomgoogleguavaguava11.0.2guava-11.0.2.jar;C:Usersasus.m2repositoryorgapachecommonscommons-math33.1.1commons-math3-3.1.1.jar;C:Usersasus.m2repositorycommons-collectionscommons-collections3.2.2commons-collections-3.2.2.jar;C:Usersasus.m2repositoryjavaxservletservlet-api2.5servlet-api-2.5.jar;C:Usersasus.m2repositoryjavaxservletjspjsp-api2.1jsp-api-2.1.jar;C:Usersasus.m2repositorycommons-loggingcommons-logging1.1.3commons-logging-1.1.3.jar;C:Usersasus.m2repositorylog4jlog4j1.2.17log4j-1.2.17.jar;C:Usersasus.m2repositorycommons-langcommons-lang2.6commons-lang-2.6.jar;C:Usersasus.m2repositoryorgslf4jslf4j-api1.7.10slf4j-api-1.7.10.jar;C:Usersasus.m2repositoryorgslf4jslf4j-log4j121.7.10slf4j-log4j12-1.7.10.jar;C:Usersasus.m2repositoryorgcodehausjacksonjackson-core-asl1.9.13jackson-core-asl-1.9.13.jar;C:Usersasus.m2repositoryorgapacheavroavro1.7.4avro-1.7.4.jar;C:Usersasus.m2repositorycomthoughtworksparanamerparanamer2.3paranamer-2.3.jar;C:Usersasus.m2repositoryorgxerialsnappysnappy-java1.0.4.1snappy-java-1.0.4.1.jar;C:Usersasus.m2repositorycomgoogleprotobufprotobuf-java2.5.0protobuf-java-2.5.0.jar;C:Usersasus.m2repositorycomgooglecodegsongson2.2.4gson-2.2.4.jar;C:Usersasus.m2repositoryorgapachehadoophadoop-auth2.7.2hadoop-auth-2.7.2.jar;C:Usersasus.m2repositoryorgapachehttpcomponentshttpclient4.2.5httpclient-4.2.5.jar;C:Usersasus.m2repositoryorgapachehttpcomponentshttpcore4.2.4httpcore-4.2.4.jar;C:Usersasus.m2repositoryorgapachedirectoryserverapacheds-kerberos-codec2.0.0-M15apacheds-kerberos-codec-2.0.0-M15.jar;C:Usersasus.m2repositoryorgapachedirectoryserverapacheds-i18n2.0.0-M15apacheds-i18n-2.0.0-M15.jar;C:Usersasus.m2repositoryorgapachedirectoryapiapi-asn1-api1.0.0-M20api-asn1-api-1.0.0-M20.jar;C:Usersasus.m2repositoryorgapachedirectoryapiapi-util1.0.0-M20api-util-1.0.0-M20.jar;C:Usersasus.m2repositoryorgapachecuratorcurator-framework2.7.1curator-framework-2.7.1.jar;C:Usersasus.m2repositorycomjcraftjsch0.1.42jsch-0.1.42.jar;C:Usersasus.m2repositoryorgapachecuratorcurator-client2.7.1curator-client-2.7.1.jar;C:Usersasus.m2repositoryorgapachecuratorcurator-recipes2.7.1curator-recipes-2.7.1.jar;C:Usersasus.m2repositorycomgooglecodefindbugsjsr3053.0.0jsr305-3.0.0.jar;C:Usersasus.m2repositoryorgapachehtracehtrace-core3.1.0-incubatinghtrace-core-3.1.0-incubating.jar;C:Usersasus.m2repositoryorgapachezookeeperzookeeper3.4.6zookeeper-3.4.6.jar;C:Usersasus.m2repositoryionettynetty3.7.0.Finalnetty-3.7.0.Final.jar;C:Usersasus.m2repositoryorgapachecommonscommons-compress1.4.1commons-compress-1.4.1.jar;C:Usersasus.m2repositoryorgtukaanixz1.0xz-1.0.jar" WordCount input output\
19/03/25 06:58:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/03/25 06:58:54 ERROR security.UserGroupInformation: PriviledgedActionException as:Mr.Wang cause:java.io.IOException: Failed to set permissions of path: tmphadoop-Mr.WangmapredstagingMr.Wang1246714728.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: tmphadoop-Mr.WangmapredstagingMr.Wang1246714728.staging to 0700
博主你好,我在联系的时候出现了这个问题。还请您帮忙解决一下
at org.apache.hadoop.util.Shell.runCommand(Shell.java:585) at org.apache.hadoop.util.Shell.run(Shell.java:482) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:776) at org.apache.hadoop.util.Shell.execCommand(Shell.java:869) at org.apache.hadoop.util.Shell.execCommand(Shell.java:852) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:733) at org.apache.hadoop.fs.RawLocalFileSystem.mkOneDirWithMode(RawLocalFileSystem.java:491) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:532) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:509) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:312) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:133) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:144) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1746) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) at com.gc.mr.WordCountDriver.main(WordCountDriver.java:46)Connected to the target VM, address: '127.0.0.1:60003', transport: 'socket'
WARN - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
INFO - session.id is deprecated. Instead, use dfs.metrics.session-id
INFO - Initializing JVM Metrics with processName=JobTracker, sessionId=
Exception in thread "main" ExitCodeException exitCode=-1073741515:
Disconnected from the target VM, address: '127.0.0.1:60003', transport: 'socket'
Process finished with exit code 1
抱歉回复晚啦,你这个错误提示没见过唉,不过看着像是网络错误?
您好!我按照您的步骤做的,但是点击运行后报错。Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
at WordCountMapreduce.main(WordCountMapreduce.java:14),Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration。可是我的代码当中import了 org.apache.hadoop.conf.Configuration。maven当中也添加了hadoop-common的相关依赖,这是怎么回事呢?我也是这个问题,不过好像是设置那个input/output文件路径错误,要写完整的文件路径,我用了完整的路径就可以运行了
我遇到了同样的问题 请问你解决了吗
抱歉回复晚了,你可以试试在pom.xml上右键maven reimport试试让maven重新加载依赖~
请问在我添加命令行参数args[1]之后,发现IDEA仅仅只读取了args[0],观察console得到一下报错 java.lang.IndexOutOfBoundsException : Invalid array range: 1 to 1 ,应该怎么在Edit Configration选项当中配置运行参数
Program arguments里设置输入参数就好啦,记得用空格分开多个参数,这样args就不只有一个了
OK,之后解决了,program arguments 为/input /output
博主你好,我在尝试运行word count的时候系统报出了这样的错误:
Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.
这是我的pom设置:
<?xml version="1.0" encoding="UTF-8"?>
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>com.polarxiong</groupId> <artifactId>hadoop</artifactId> <version>1.0-SNAPSHOT</version> <repositories> <repository> <id>apache</id> <url>http://maven.apache.org</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>2.8.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>2.8.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-shuffle</artifactId> <version>2.8.0</version> <scope>provided</scope> </dependency> </dependencies><project xmlns="http://maven.apache.org/POM/4.0.0"
</project>
请麻烦看下到底是哪里出了问题。
抱歉这些天太忙了没看到,貌似我之前没碰到这个问题哦,好像也没人反馈这个问题;我不太容易复现这个问题呢,还麻烦你自己去搜索咯~
我也遇到这个问题了,我觉得应该还是要搭一套hadoop环境的,不知道博主在intellij下做了什么配置没
没有呢,刚才搜了下似乎是hadoop-mapreduce-client-common依赖没找到,但maven里有写,所以我还是怀疑是maven没有把依赖全部加载上,我猜是网络问题,需要reimport一下
win用户看这里,关于文中提到的Failed to set permissions of path: tmp问题,有简单解决办法。
换hadoop-core的版本换成0.20.2版本。直接改pom文件中<version>1.2.1</version>这行改成<version>0.20.2</version>,相应的main方法里面的 Job job = Job.getInstance(conf, "word count");也要改成Job job = new Job(conf, "word count");就可以了。
另外一种复杂点的办法就是,自己下载1.2.1源码包,把其中的报错那行给注掉,然后打包,再使用。当然网上有人已经改好了,并且提供打包下载,不过改的是1.0.2版本,下载地址参考http://blog.csdn.net/shiqidide/article/details/7585048,要自己安装jar包到maven路径下,安装方法mvn install:install-file -Dfile=(注意这里改成自己的路径)hadoop-core-1.0.2-modified.jar -DgroupId=org.apache.hadoop -DartifactId=hadoop-core -Dversion=1.0.2 -Dpackaging=jar,然后再参考简单步骤更改版本,及main方法。
大神。根据你提供的方法,完美解决我的问题!
感谢你提供的解决方法!
待我有空了把你的评论更新到文章。
非常感谢您的教程!
博主你好!我在mac上试着同样操作但是报错nodename nor servname provided, or not known,是本地的端口需要配置吗?
我的pom用的和你一样,jdk1.7,有点不知道该如何改。google出来的大多不相干。
谢谢!
谢谢!但是我本地没有配置hadoop,所以我看的有些回答说改hadoop或者机器的hosts好像都不大一样。
我其实是在用aws上ec2配置好的hadoop,但是jar传上去会有VerifyError,现在按照你这篇博文在尝试改,想用maven打jar包的。
想请教下你博文里本地不配置直接可以做mapreduce的有更多的资料吗?本地真的什么都不用改吗?我看你给的参考好像讲的也不是很详细。&想请教你有没有打jar包的推荐?一直卡在jar包这里很蛋疼...
谢谢!
这个我没遇到过呀...不过SO上有个类似的问题你参考下http://stackoverflow.com/questions/19330334/hadoop-on-mac-pseudo-node-nodename-nor-servname-provided-or-not-known
欢迎反馈!
谢谢!但是我本地没有配置hadoop,所以我看的有些回答说改hadoop或者机器的hosts好像都不大一样。
我其实是在用aws上ec2配置好的hadoop,但是jar传上去会有VerifyError,现在按照你这篇博文在尝试改,想用maven打jar包的。
想请教下你博文里本地不配置直接可以做mapreduce的有更多的资料吗?本地真的什么都不用改吗?我看你给的参考好像讲的也不是很详细。&想请教你有没有打jar包的推荐?一直卡在jar包这里很蛋疼...
谢谢!
如果是本地跑的话确实只用配置maven,你可以理解成仅仅是用了hadoop的“代码”,而没有用那个“体系”,只适合跑小的MapReduce程序。
另外你说的打包JAR的话, 我这没有更多资料,Intellij确实比Eclipse要复杂的多,不过网上也有挺多教程的,你再去试试?我这边没有Hadoop的真机了所以也不太容易帮到你了,不过我刚才又试了试文中说的方法,还是能跑的。
博主你好,看了你的教程感觉非常有用。请问在pom.xml配置后是maven自动下载各种jar文件吗?为什么我运行之后有的jar包可以加载,有的不能加载不进去?难道需要科学上网?
是的,由maven来自动下载各种依赖。一般来说这些依赖是没有被墙的,但第一次运行的时候需要下载的依赖会比较多比较慢。另外也不排除被墙的咯,我是一直挂着ss的所以也没有感觉到...
作为新手,在mac上设置成功了。非常感谢!
^_^ 很高兴能够帮到你
请问下博主,在windows下,maven更新完成了,jdk1.8. 运行IDE显示错误"Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable nullbinwinutils.exe in the Hadoop binaries."
找的方案都是需要配置hadoop的文件,有没有其他的解决方案哪
尝试过下载https://github.com/srccodes/hadoop-common-2.2.0-bin,解压配置path,依旧失败
抱歉这个问题没有遇见过,我怀疑是不是maven没有全部更新好,试试在maven的那个文件那点右键重新加载之类的试试?
hadoop-core 1.2.1这个包太老了,要换成hadoop-mapreduce-client-core 2.7.3
抱歉回复晚了。写的这个老的包是因为还有许多入门教程是用的hadoop 1.x,是为了避免不必要的麻烦;不过谢谢指出,我会在随后加上说明的。
Linux大法好
请问你的idea是在window下还是在linux,是window上做开发的吗?然后连接linux上的hadoop集群吗?
是在Mac下的呢,貌似windows下会有一些问题。
QAQ 大牛您好,我使用了您的pom.xml 和代码,但是IDE报错了。
在import org.apache.hadoop.mapreduce.Reducer;这里,mapreduce被显示为找不到symbol
我用的是JDK1.8,别的设置都是一样的,应该不是这个的问题吧?不是很理解
你好,考虑是不是maven还没更新完成?(使用maven复制粘贴这个pom.xml会提示需要重新import,如果是第一次操作可能要花较长时间等待intellij下载完全部的依赖模块)
如果不是这个问题的话,考虑细节问题,如maven需要重新加载,Java compiler language level等的设置。忘有更详细的错误日志。
请问博主用的windows还是linux操作系统,在windows下会报错。
谢谢反馈,刚才在Windows下测试了确实会出错,已经在文章中更新了。
出错是来源于hadoop对临时文件的权限设置问题,不知为何官方一直没有修复。我加上了简单的处理方法,但我个人还是推荐在Linux或者macOS上运行hadoop的。
windows下出现Exception in thread "main" java.io.IOException: (null) entry in command string: null chmod 0700 这样的错误
这个也是权限设置问题,明显windows下没有chmod这样的命令。如果一定要用windows,暂时的解决办法只有给hadoop打补丁,或者用超级管理员。
但是我的账号已经是超级管理员了。还是会出现这个问题
以管理员的方式打开eclipse 试试