2014-07-17 4 views
8

Ich habe Spring Boot Hadoop und möchte die Spring HbaseTemplate nutzen. Mein Problem ist, dass die Dokumentation nur Informationen über den "xml" Weg der Konfiguration und Einrichtung enthält.Wie verwende ich HBase mit Spring Boot mit Java statt XML?

Wie und wo definiere ich meine Konfiguration zur hbase-Konfiguration in Java im Gegensatz zu der XML-Datei, wie sie in den offiziellen Dokumenten angezeigt wird?

http://docs.spring.io/spring-hadoop/docs/1.0.1.RC1/reference/html/hbase.html

Antwort

5

Nun, es ist nicht wirklich eine erwartete Antwort, aber ich möchte es zu sehr für einen Kommentar entwickeln.

Ich lese sorgfältig die Spring for Apache Hadoop - Reference Documentation in seiner letzten veröffentlichten Version, und wenn es Beispiele und Details für die Namespace-Konfiguration enthält, konnte ich keine einzige Zeile auf Java-Konfiguration finden.

Ich verstehe, dass nur Namespace-Konfiguration für Spring für Apache Hadoop derzeit unterstützt wird. Es sollte sicherlich möglich sein, die Klassen zu betrachten, die den Namensraum unterstützen, und eine funktionierende Konfiguration zu hacken, um herauszufinden, wie man mit java config das gleiche Ergebnis erhält, aber ehrlich gesagt, das Kosten-Gewinn-Verhältnis rechtfertigt das nicht. Und da es momentan undokumentiert ist, wirst du nie sicher sein, dass du etwas nicht vergessen hast, das später brechen wird.

Da Spring xml config-Dateien in einer Java-config-Spring-Anwendung anbietet, rate ich Ihnen dringend, Ihre gesamte Java-Konfiguration beizubehalten, den Apache Hadoop-Teil in XML mit dem angegebenen Namespace zu schreiben und einfach eine @ImportResource-Annotation hinzuzufügen zu Ihrer Konfigurationsklasse. Sprich die Feder hadoop Konfiguration hadoopContext.xml an der Wurzel Classpath ist, könnten Sie schreiben:

@Configuration 
... 
@ImportResource("classpath:/hadoopContext.xml") 
public classConfig { 
... 
} 

Alternativ Sie einen @Configuration Wrapper um den XML-Konfigurations verwenden können, die Sie bei der Verwaltung von Spring gescannt werden:

@Configuration 
@ImportResource("classpath:/hadoopContext.xml") 
public class HadoopConfig { 

} 
+0

Ich stimme zu. Es wäre möglich, es zu hacken, aber nicht wirklich die Zeit wert. Ich war in der gleichen Situation mit [Spring Web Services] (http://projects.spring.io/spring-ws/) und verwendete genau den gleichen @ ImportResource-Trick, bis sie Unterstützung für die Java-Konfiguration hinzugefügt haben. – Kolargol00

0

Sie können die feder hadoop Proben in Github prüfen, speziell die Dateien im Frühjahr-hadoop-Proben/Original-Samples/hbase-crud. Das Repository ist unter https://github.com/SpringSource/spring-hadoop-samples

Hoffe das hilft Ihnen.

+0

Es gibt keinen Code, der mit irgendetwas in Bezug auf hbase oder hbaseTemplate übereinstimmt. Es wird in der Readme erwähnt, aber das ist es. – Rolando

4

Obwohl eine Java-basierte Konfiguration für HBase formal noch nicht verfügbar ist (erst seit Spring Hadoop 2.2.1), gibt es eine saubere Problemumgehung. Fügen Sie die relevanten ZooKeeper-Details als Eigenschaften in eine Java-basierte Spring Hadoop-Konfiguration ein. Dann muss das XML-Tag hbase-configuration keine Konfigurationsdetails enthalten. Per Konvention hängt es von der hadoopConfiguration Bean ab, die durch die Java-basierte HadoopConfigConfigurer definiert ist.

@Configuration 
@EnableHadoop 
public class MapReduceConfiguration extends SpringHadoopConfigurerAdapter { 
    @Override 
    public void configure(HadoopConfigConfigurer config) throws Exception { 
     config 
       .fileSystemUri(myConfigManager.getHadoopFsUri()) 
       .resourceManagerAddress(myConfigManager.getHadoopResourceManagerAddress()) 
       .withProperties() 
       .property("hbase.zookeeper.quorum", myConfigManager.getZookeeperQuorum()) 
       .property("hbase.zookeeper.property.clientPort", myConfigManager.getZookeeperPort()) 
       .property("hbase.client.scanner.caching", "1"); 
    } 
} 

Die restliche XML-Konfiguration ist Agnostiker auf die Implementierungsumgebung:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:hdp="http://www.springframework.org/schema/hadoop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd"> 
    <hdp:hbase-configuration /> 
</beans> 
0

ich ohne xml ein einfaches Demoprojekt für den Einsatz von hbase im Frühjahr Boot-Anwendung geschrieben.

Diese Demo hängt hauptsächlich von spring-data-hadoop und hbase-client ab. gradle Abhängigkeiten:

compile('org.springframework.boot:spring-boot-starter-data-rest') 
compile('org.springframework.boot:spring-boot-starter-web') 
compile 'org.springframework.data:spring-data-hadoop:2.5.0.RELEASE' 
compile('org.apache.hbase:hbase-client:1.3.1'){ 
    exclude group :'log4j',module:'log4j' 
    exclude group :'org.slf4j',module:'slf4j-log4j12' 
    exclude group: 'javax.servlet', module: 'servlet-api' 
} 
compile('org.springframework.boot:spring-boot-configuration-processor') 
providedRuntime('org.springframework.boot:spring-boot-starter-tomcat') 

die Parameter hbase Verbindung Konfigurieren in application.properties der Federverschluß (keine XML!):

spring.data.hbase.zkQuorum=192.168.0.109:2181 
spring.data.hbase.zkBasePath=/hbase 
spring.data.hbase.rootDir=file:///home/hbase-1.2.2 

Klasse HbaseProperties.java:

@ConfigurationProperties(prefix = "spring.data.hbase") 
public class HbaseProperties { 
    // Addresses of all registered ZK servers. 
    private String zkQuorum; 

    // Location of HBase home directory 
    private String rootDir; 

    // Root node of this cluster in ZK. 
    private String zkBasePath; 

    // getters and setters... 

} 

HbaseConfig.java, injizieren Sie die Konfigurationen in die HbaseTemplate:

import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.hadoop.hbase.HbaseTemplate; 

@Configuration 
@EnableConfigurationProperties(HbaseProperties.class) 
public class HbaseConfig { 

    @Autowired 
    private HbaseProperties hbaseProperties; 

    @Bean 
    public HbaseTemplate hbaseTemplate() { 
     org.apache.hadoop.conf.Configuration configuration = HBaseConfiguration.create(); 
     configuration.set("hbase.zookeeper.quorum", this.hbaseProperties.getZkQuorum()); 
     configuration.set("hbase.rootdir", this.hbaseProperties.getRootDir()); 
     configuration.set("zookeeper.znode.parent", this.hbaseProperties.getZkBasePath()); 
     return new HbaseTemplate(configuration); 
    } 

} 

Service-Klasse, können wir die konfiguriert HbaseTemplate jetzt verwenden:

import javax.annotation.PostConstruct; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.hadoop.hbase.HbaseTemplate; 
import org.springframework.stereotype.Service; 

import com.zql.hbasedemo.vo.Quote; 

@Service 
public class FeedService { 
    @Autowired 
    private HbaseTemplate hbaseTemplate; 

    @PostConstruct 
    public void test(){ 
     Quote quote = new Quote(); 
     quote.setEventType("ft"); 
     quote.setHandicap("4"); 
     quote.setMarket("OU"); 
     quote.setMatchId("27350208"); 
     quote.setSelection("OVER"); 
     quote.setPrice("1.93"); 
     saveQuote(quote); 
    } 

    public void saveQuote(Quote quote) { 
     hbaseTemplate.put("quotes", quote.getMatchId(), "data", quote.getMarket() + ":" + quote.getSelection(), 
      quote.getPrice().getBytes()); 
    } 
} 

Viel Spaß! :)