这个系列指南使用真实集群搭建环境,不是伪集群,用了三台腾讯云服务器
或者访问我的个人博客站点,链接
配置eclipse开发环境
以下环境适用于hadoop,storm,kafka开发,hbase和hive还没有测试
安装配置
- Eclipse软件随意,我选取
eclipse-java-mars-2-win32-x86_64
必要的插件
修改系统环境变量
java环境配置参考这个链接,推荐使用jdk1.8即java8版本。
System variables里添加HADOOP_HOME,指向hadoop压缩包地址(bin目录上一层),添加MAVEN_HOME(bin目录上一层),配置eclipse连接hadoop
参考链接点这里建立java项目或者maven项目都需要正确放置如下文件
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- hbase-site.xml
运行时如果出现
权限问题
,需要指定JVM用户名称,具体在run configuration里的arguments里面添加-DHADOOP_USER_NAME=root(因为云上的hadoop用户名为root)设置本地ip映射
为了不再代码里使用过多的IP地址,可以采用修改windows中host文件
的方式来设置ip映射,类似于云上修改/etc/cloud/template/hosts.rexxx的方式。
maven使用注意事项(建议使用Maven构建项目)
- 指定用户设置settings.xml,路径设置在window->preferences->maven->user settings->global/user settings。为了避免依赖包下载失败,需要在settings.xml里
设置镜像地址
。settings.xml文件如下,好像阿里云的镜像已经不管用了。实际上使用的好像是中央仓库1或者2。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!-- 中央仓库1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 中央仓库2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
- maven默认使用J2SE-1.5来构建项目,这和电脑上安装java8不一致,可以在项目pom文件中进行设置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
此外,由于设置了别的构建版本,需要配置可执行jre目录。window->preferences->java->installed jres->excution environment,在这个选项卡里点击J2SE-1.5
和JavaSE1.8
,在右侧选择相应的jre目录。
在编写完pom.xml文件后,需要执行maven->update project命令来下载相关的jar包。如果出现了missing artifact xxx错误,请三步走,参考链接点这里
- 到报错的那个jar包的磁盘地址,看一下有没有lastupdated字样作为后缀的文件,如果有的话,删除该jar包整个文件夹,重新update project。
- 如果对应磁盘位置里没有上述文件,检查是否有对应的jar包,如果没有的话,到这里下载对应的jar包和pom文件,手动放到本地仓库中,然后update project。
- 如果上述两步没有用的话,百度谷歌看缘分。
在添加了kafka依赖包之后,如果有一个叫kafka-avro-serializerxxx.jar的文件如果报错的话,解决方案点这里
使用maven编译时,使用cmd进入项目位置,哪里有pom文件就cd到哪里,之后先执行
mvn clean
来清理项目,再使用mvn package
进行打包。生成的jar包在项目的target文件夹里,不要使用
开头有origin字样的jar包附一份可用的开发storm+kafka+hdfs的
pom.xml
,这个文件里需要注意以下几个地方:- 使用maven-shade-plugin而不是maven-assembly-plugin来构建项目。原因看这里
- 对于hadoop,storm,kafka依赖项而言,
指定版本
尤为重要。特别注意的是,hadoop2.2,storm1.0,kafka0.10是非常重要的分水岭。之上和之下的版本尽量不要混用。 - 所有的dependency尽量使用
provided
作为scope参数,例如如果storm-kafka这一个dependency如果不使用provided,那么编译时将会出现错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project maventest: Compilation failure: Compilation failure: [ERROR] /D:/EclipseWorkspace/maventest/src/main/java/cn/colony/cloud/stormhdfs/StormToHDFS.java:[17,34] package org.apache.storm.hdfs.bolt does not exist
报错的编译插件为maven-compiler-plugin,和我们的环境没有半点关系,所以极难找错。(花了我两天时间)
<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>cn.colony</groupId> <artifactId>maventest</artifactId> <version>1.0.0</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.1</version> <configuration> <source>1.8</source> <target>1.8</target> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>cn.colony.cloud.stormhdfs.MyKafkaTopology</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-hbase</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-kafka-client</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-kafka</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.10</artifactId> <version>0.10.2.1</version> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.2.1</version> </dependency> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-hdfs</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.8.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.8.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>