Sunday, December 29, 2013

Java decompaling

Java decompiling

 Great tool for decompiling and view code 'Java Decompiler' - http://jd.benow.ca/.

+ Fast decompile
+ Good navigation
- Decompiled code could contain incorrect parts that hard to resolve
- Search in tool could be better)

Fernflower

Great tool for decompiling to improving code. Does not have some site(, but you can download it from link
https://drive.google.com/file/d/0BynTyQpk3OoFc3FwS3lNTE02Qjg/edit?usp=sharing
+ Easy for use
-I have issue with decompiling of class with inner classes, but other stuff decompiled correctly.

References

http://habrahabr.ru/post/176825/
http://pastebin.com/bh83nHL5
https://gist.github.com/agaricusb/4575843

Thursday, December 5, 2013

VMWare & CentOS 6.4 Windows X installation

Install X Window

  1. Update the installed system
    yum -y update
  2. Install Desktop and X Window package groups
    yum groupinstall "Desctop" "X Window System"
  3. Install default/boxes fonts
    yum install xorg-x11-fonts-Type1
  4. Change default runlevel to 5 (X11 runlevel)
    vi /etc/inittab
    [click insert]
    id:3:initdefault: -> id:5::initdefault:
    [click Esc]
    :wq
    [click Enter]

Install VMWare drivers

  1. Create folder /mnt/cdrom
    mkdir /mnt/cdrom
  2. Mount cdrom
    mount /dev/cdrom1 /mnt/cdrom
  3. Get archives with tools and drivers into tmp folder.
    cd /mnt/cdrom
    cp VMwareTools[click tab] /tmp
  4. Unpuck and run it
    cd /tmp
    tar -xzvf VMwareTools[tab]
    cd vmware-tools-distrib/
    ./vmware-install.pl
    [click enter] n-time

Add new user

  1. Add new user
    useradd bigdata
    passwd bigdata
    [set password]
  2. Reboot computer
    reboot

Sqoop 1.4.3 Create own connector (manager factory)


In case if managers that present in sqoop is not enough you need create your own managers.

Create project

Project should have structure as shown below. You should add to build path sqoop.jar and log4j.jar (in my case: sqoop-1.4.3-SNAPSHOT.jar and commons-logging-1.1.1.jar).

Create new Manager Factory

Create manager factory where you will define your custom managers. It has to extend com.cloudera.sqoop.manager.ManagerFactory. In my case it's CustomManagerFactory.
package sqoop.manager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.sqoop.manager.Db2Manager;
import org.apache.sqoop.manager.DirectMySQLManager;
import org.apache.sqoop.manager.DirectPostgresqlManager;
import org.apache.sqoop.manager.HsqldbManager;
import org.apache.sqoop.manager.OracleManager;
import org.apache.sqoop.manager.PostgresqlManager;
import org.apache.sqoop.manager.SQLServerManager;

import com.cloudera.sqoop.SqoopOptions;
import com.cloudera.sqoop.manager.ConnManager;
import com.cloudera.sqoop.metastore.JobData;

import com.cloudera.sqoop.manager.ManagerFactory;

public class CustomManagerFactory extends ManagerFactory{

      public static final Log LOG = LogFactory.getLog(
              CustomManagerFactory.class.getName());
      
      public ConnManager accept(JobData data) {
            SqoopOptions options = data.getSqoopOptions();

            String scheme = extractScheme(options);
            if (null == scheme) {
              // We don't know if this is a mysql://, hsql://, etc.
              // Can't do anything with this.
              LOG.warn("Null scheme associated with connect string.");
              return null;
            }

            LOG.debug("Trying with scheme: " + scheme);

            if (scheme.equals("jdbc:mysql:")) {
              if (options.isDirect()) {
                return new DirectMySQLManager(options);
              } else {
                return new MysqlManager(options);
              }
            } else if (scheme.equals("jdbc:postgresql:")) {
              if (options.isDirect()) {
                return new DirectPostgresqlManager(options);
              } else {
                return new PostgresqlManager(options);
              }
            } else if (scheme.startsWith("jdbc:hsqldb:")) {
              return new HsqldbManager(options);
            } else if (scheme.startsWith("jdbc:oracle:")) {
              return new OracleManager(options);
            } else if (scheme.startsWith("jdbc:sqlserver:")) {
              return new SQLServerManager(options);
            } else if (scheme.startsWith("jdbc:db2:")) {
              return new Db2Manager(options);
            } else {
              return null;
            }
          }

          protected String extractScheme(SqoopOptions options) {
            String connectStr = options.getConnectString();

            // java.net.URL follows RFC-2396 literally, which does not allow a ':'
            // character in the scheme component (section 3.1). JDBC connect strings,
            // however, commonly have a multi-scheme addressing system. e.g.,
            // jdbc:mysql://...; so we cannot parse the scheme component via URL
            // objects. Instead, attempt to pull out the scheme as best as we can.

            // First, see if this is of the form [scheme://hostname-and-etc..]
            int schemeStopIdx = connectStr.indexOf("//");
            if (-1 == schemeStopIdx) {
              // If no hostname start marker ("//"), then look for the right-most ':'
              // character.
              schemeStopIdx = connectStr.lastIndexOf(':');
              if (-1 == schemeStopIdx) {
                // Warn that this is nonstandard. But we should be as permissive
                // as possible here and let the ConnectionManagers themselves throw
                // out the connect string if it doesn't make sense to them.
                LOG.warn("Could not determine scheme component of connect string");

                // Use the whole string.
                schemeStopIdx = connectStr.length();
              }
            }
            return connectStr.substring(0, schemeStopIdx);
          }
}

Create custom Manager

Create new manager that will works with data. Manager shoud extend org.apache.sqoop.manager.InformationShemaManager

package sqoop.manager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.sqoop.manager.*;
import com.cloudera.sqoop.SqoopOptions;
public class MysqlManager extends InformationSchemaManager {
    
    public static final Log LOG = LogFactory.getLog(MysqlManager.class.getName());
    private static final String STRING = "";
    public MysqlManager(SqoopOptions opts) {
        super(STRING, opts);
    }
    @Override
    protected String getSchemaQuery() {
        return null;
    }
    @Override
    protected String getListDatabasesQuery() {
        return null;
    }
}

Configure sqoop for work with external factory manager

First of all you have to define SQOOP_CONF_DIR for example '/home/cloudera/sqoop/conf'. After that in this folder you have to create folder 'managers.d'. In this folder you have to create property file, for example 'managers.property'.

In this file you can define you own factory manager. Structure of file you can see below.
sqoop.manager.CustomManagerFactory=/home/cloudera/workspace/extention-conn-manager/manager.jar
After next start of sqoop you have to see defined your factory manager, as shown below.

Example Project

https://drive.google.com/#folders/0BynTyQpk3OoFNkg0dnJaWHFlVXc