lundi 25 mars 2013

How to schedule a hive job with java?

Our project is running on Cassandra bundled in DataStax Entreprise plateforme.
To schedule a hive job with java and datastax entreprise, i used the scheduler embeded in Jboss 7 and Hive-JDBC.

First step in to includ the following libraries to the project

- ~/dse-3.0/resources/hive/lib/hive-jdbc-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/hive-metastore-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/hive-service-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/libfb303-0.7.0.jar
- ~/dse-3.0/resources/hadoop/hadoop-core-1.0.4.2.jar
- ~/dse-3.0/resources/hive/lib/hive-serde-0.9.0.1.jar
- ~/dse-3.0/resources/hive/lib/commons-logging-1.0.4.jar
- ~/dse-3.0/resources/hive/lib/hive-exec-0.9.0.1.jar


Then start hive server:
dse-3.0/bin/dse hive --service hives


Then follow this example of Hive-JDBC to write my job:

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; import javax.ejb.Schedule; import javax.ejb.Stateless; import org.apache.log4j.Logger; @Stateless(name = "AutomaticSchedulerBean") public class HiveJob { private static Logger mLogger = Logger.getLogger(HiveJob.class); private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; @Schedule(dayOfWeek = "*", hour = "*", minute = "*/5", year = "*", persistent = false) public void execute() throws SQLException{ mLogger.info("Start HiveJob"); try { Class.forName(driverName); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", ""); Statement stmt = con.createStatement(); // regular hive query String sql = "select count(*) from universe where status = 'GO'"; System.out.println("Running: " + sql); ResultSet res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1)); } mLogger.info("HiveJob executed!"); } }

This Job is going to run every 5 minutes.

Enjoy :)

jeudi 21 mars 2013

Mettre en place les logs sous DataStax Entreprise

Datastax entreprise nous permet de stoker les logs de notre application dans cassandra.

Pour cela, On commence par activer le service sur le cluster en se rendant dans le repertoire contenant le script d'init:

\>cd /usr/share/dse-demos/log_search
\>./1-add-schema.sh


Dans le projet sous eclipse, il faut ajouter les librairies suivantes au projet:
Ajouter le fichier de configuration de log4j, dans l'arborescence du projet comme ceci:


Le contenu du fichier est le suivant:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

 <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss}] %5p %c : %m%n" />
  </layout>
 </appender>

 <appender name="Cassandra" class="com.datastax.logging.appender.CassandraAppender">
  <param name="hosts" value="localhost" />
  <param name="port" value="9160" />
  <param name="appName" value="price" />
  <param name="keyspaceName" value="Logging" />
  <param name="columnFamily" value="log_entries" />
  <param name="placementStrategy" value="org.apache.cassandra.locator.SimpleStrategy" />
  <param name="replicationFactor" value="1" />
  <param name="consistencyLevelWrite" value="ONE" />
  <param name="maxBufferedRows" value="256" />

  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss}] %5p %c{6}: %m%n" />
  </layout>
 </appender>

 <logger name="it.example">
  <param name="additivity" value="false" />
  <level value="debug" />
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="Cassandra" />
 </logger>

 <root>
  <level value="error" />
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="Cassandra" />
 </root>
</log4j:configuration>

Dans le cas ou vous utilisez un serveur d'application JBoss, il faut dire à JBoss de ne pas utiliser sont propre module log4j. Pour cela, on ajoute un fichier d'exclusion dans l'arborescence projet comme ceci:


Le fichier contient le code suivant:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
 <deployment>
  <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
  <exclusions>
   <module name="org.apache.log4j" />
  </exclusions>
 </deployment>
</jboss-deployment-structure>

Ensuite il ne reste plus qu'a inserer des logs aux endroits stratégique du code de la manière suivante:

public class Dao {
 private static Logger mLogger = Logger.getLogger(Dao.class);
 private static Dao dao = null;

 public static Dao getInstance() {
  if (Dao.dao == null)
   Dao.dao = new Dao();
  return Dao.dao;
 }
...
public void insertImage(String imageUrl, byte[] image) {
  mLogger.debug("Insertion d'une image: " + imageUrl);
  Connection con = getConnection();
  try {
...

Enfin, on peux aller consulter les logs grace à l'interface de consultation mise en place dans le DSE:

http://localhost:8983/demos/log_search/


(Pour que l'interface fonctionne, il faut suivre les instructions suivantes: http://www.datastax.com/docs/datastax_enterprise3.0/solutions/log4j_logging )

Enjoy :)

mercredi 20 mars 2013

Comment ajouter du code informatique dans un blog ?

Tous les blogueur le savent, il est difficile de pouvoir mettre en forme du code informatique dans leurs articles. Pour ma part je viens d'essayer avec succès une solution très robuste: SyntaxHighlighter.

Cela se fait en deux fois:
  • Il faut tout d'abord faire appel aux librairies javascript. Cela se fait en mettant le code suivant dans la page du blog:
<link href='http://alexgorbatchev.com/pub/sh/2.1.364/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/2.1.364/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shCore.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCpp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCSharp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCss.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJava.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJScript.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPhp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPython.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushRuby.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushSql.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushVb.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushXml.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPerl.js' type='text/javascript'></script> 
<script language='javascript'> 
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.1.364/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>


  • Il faut ensuite entourer le code informatique avec les balises suivante:
<pre class="brush: XXX">
Mettre le code informatique ici...
</pre>

Il faut remplacer les XXX par le nom du langage que vous souhaitez présenter. La liste des langages se trouve ici.

Attention: Pour que tout cela marche, il faut remplacer les caractères '<' et '>' par leurs code html, à savoir '&lt;' et '&gt;'.

Enjoy :)