使用VirtualBox搭建 Hadoop 测试集群

环境:

  • 物理机: i7 4核8线程,16G 内存的组装兼容机
  • VirtualBox Host: Ubuntu 14.04
  • VirtualBox: 4.3.20
  • VirtualBox Guest: CentOS 6.6 x86_64

本文的目的只是为了测试和理解Hadoop在集群机器中的运行过程。具体针对物理机的Hadoop 集群的一些操作不能以本位作为参考。

首先安装一台VM, 设置好之后,用linked clone 3台,这3台只需改一下IP, hostname 和一些必要的配置,这样操作的话可以减少很多时间和节约Host机的硬盘空间。

总共4台虚拟机,第一台 6G内存,其他2G, 因为我的Host机器只有16G 内存,这样的 分配应该不至于内存溢出。第一台机器因为承担比较重的任务,所以分配的内存比其他 三台都要高。

创建第一台机器,也就是克隆的原型

如果之前没有没有安装过CentOS, 国内同学可以去理工大服务器下载。

http://mirror ...

more ...

Mac OSX 下 Hadoop 使用本地库提高效率

环境:

  • Mac OSX: 10.9.5
  • Hadoop: 2.6.0
  • Java: 1.7.0_71

Mac OSX 下运行Hadoop老出现以下警告, 其实就是缺少本地库

14/12/05 14:40:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

安装 protobuf

首先安装protobuf, 不然编译Hadoop会报错, 从以下地址下载

https://protobuf.googlecode.com/files ...

more ...

Mac OSX 下 Hadoop 单节点集群配置

环境:

  • Mac OSX: 10.9.5
  • Hadoop: 2.6.0
  • Java: 1.7.0_71 (1.8.0_25)

大数据是未来的趋势,要顺势而学之。

本文是参考Hadoop文档,但其描述为Linux写的。所以Mac是否适用容我来验证一下。 而且Hadoop的官方测试JDK只支持到1.7.0, 1.8.0是否成功也一起试了。

2014-12-05 Update: 1.8.0 虽然支持,但在用Maven编译Native Library的时候遇到很多 问题。所以最好转回1.7.0_71。

参考:

  • http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist ...
more ...

JPA Dead Lock 死锁

使用JTA + hibernate 做持久层,Unitils 做Repository的单元测试。

Test类中的repository是用Unitils 提供的@SpringBean进行注入。 而repository中的entityManager是用@PersistenceContext的方式注入, 这个注入是由spring来管理的,所以repository的实现类中的entityManager 的datasource是属于spring的。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

然而 ...

more ...

OpenJPA Entity

出现下列错误

Caused by: <openjpa-2.2.0-r422266:1244990 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
com.example.jpastudy.Message".

解决方法1, 在persistence.xml中添加

<property name="openjpa.RuntimeUnenhancedClasses ...
more ...

JPA 中如何使用String 类型作为Identity

默认的JPA是使用Int, Long来作为ID使用的。但是用这两种型的ID作为 Primarykey有一些不好的地方。

  • 可能会溢出。
  • SqlServer 的identity属性让你的单元测试变得焦头烂额, 因为你初始化数据库的时候总可能出现

    Cannot insert explicit value for identity column,
    

    这是由于你对ID附上值了。 * 如果存在一个老系统,他的主键不是数字型,而是自己定义的varchar 或char类型的话就会有问题。

这里我将讲述如何使用String作为@Id, 但我不用annotation的方式去配置。而是用xml定义方式。

如下例, 数据库的表结构如下

CREATE TABLE questions (
    question_id VARCHAR(15) primary key,
    description VARCHAR(30)
);

xml定义如下

<entity class="Question" metadata-complete="true">
    <table name="questions" />
    <attributes>
        <id name="questionId ...
more ...

Maven主要使用的命令

打包命令, 这里根据 <packaging>xxx</packaging> 的参数打包成jar或者war,ear

mvn package

执行jar中的某一个main

mvn install
mvn exec:java -Dexec.mainClass=com.xxx.SomeClass

查看依赖关系命令

mvn dependency:tree

启动jetty 服务器

mvn jetty:run

使用tomcat7作为maven启动web容器

再pom.xml中的build部分

<build>
    <finalName>yourFinalName</finalName>
    <plugins>
        <plugin>
            <groupId>com.googlecode.t7mp</groupId>
            <artifactId>maven-t7-plugin</artifactId>
            <version>0.9.8 ...
more ...

Ant 生成 Jar文件 的一些问题

如何生成可执行的jar

如果想要生成的Jar文件能直接执行,就必须指定main函数的类名,具体是在jar中创建 以下目录文件结构,

xxxx.jar
  |- META-INF
    |-  MANIFEST.MF

并且 MANIFEST.MF 文件中需要指定

Main-Class: xxx.yyy.zzz.YourMainClassName

具体在Ant中实现如下,build.xml中的jar 段

<jar jarfile="${dist}/my-app.jar" basedir="${build}">
    <manifest>
        <attribute name="Main-Class" value="xxx.yyy.zzz.YourMainClassName" />
    </manifest>
</jar>

如何解决第三方jar找不到

比如说我们的main class中引用了 org.apache.commons.lang3.StringUtils 方法 ...

more ...