当前位置: 首页 > 知识库问答 >
问题:

如何使用Java而不是XML在Spring Boot中使用hbase?

洪飞驰
2023-03-14

我有Spring Boot Hadoop,想要利用Spring HbasTemboard。我的问题是留档只有关于配置和设置的“xml”方式的信息。

与官方文档中显示的xml不同,我如何以及在何处将配置定义为java中的hbase配置?

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

共有3个答案

左丘边浩
2023-03-14

我编写了一个简单的演示项目,用于在没有xml的spring boot应用程序中使用hbase。

这个演示主要依赖于spring数据hadoop和hbase客户端。渐变依赖项:

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')

在spring boot的应用程序中配置hbase连接参数。属性(无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

类别HBASeproperty。爪哇:

@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,将配置注入HBasetTemplate:

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);
    }

}

服务类,我们现在可以使用已配置的HBasetTemplate:

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());
    }
}

享受!:)

慕翰学
2023-03-14

尽管HBase的基于Java的配置尚未正式提供(最近的版本是SpringHadoop2.2.1),但还是有一个干净的解决方法。在基于Java的Spring Hadoop配置中包含相关的ZooKeeper详细信息作为属性。然后,hbase配置XML标记不需要包含任何配置详细信息。按照惯例,它将取决于基于Java的HadoopConfigurer定义的hadoopConfigurationbean。

@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");
    }
}

其余的XML配置与部署环境无关:

<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>
松新
2023-03-14

好吧,这不是一个预期的答案,但我想发展它太多的评论。

我仔细阅读了最后一个正式版本中的Spring for Apache Hadoop参考文档,如果它确实包含名称空间配置的示例和详细信息,我找不到Java配置的一行。

我的理解是,SpringforApacheHadoop目前只支持名称空间配置。当然可以查看支持名称空间的类,并对工作配置进行修改,以找到如何使用java config获得相同的结果,但老实说,我认为成本/收益比并不能证明这一点。由于它目前还没有被记录在案,你永远不会确定你没有忘记以后会发生的事情。

由于Spring提供在Java config Spring应用程序中包含xml配置文件,我强烈建议您保留所有现有的Java配置,使用提供的名称空间用xml编写Apache Hadoop部分,只需在配置类中添加一个@ImportResource注释。假设SpringHadoop配置hadoopContext。xml在类路径的根目录下,您可以编写:

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

或者,您可以在Spring扫描的xml配置周围使用@Configuration包装器:

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

}
 类似资料:
  • 当我设置json accept header时,得到的是json。我需要强制我的授权服务器始终发送JSON。还没找到任何解决办法。谢了。

  • 问题内容: 我找到了一篇有用的文章,解释了如何使Jersey使用SLF4J而不是JUL。现在,我的单元测试看起来像(并且很完美): 我的包括以下依赖项: 它运行完美,但是我不想在每个单元测试中都进行相同的配置。这是很明显的代码重复,我想避免。我怎样才能更有效地做到这一点? ps。也许不可能优化上面的代码,而我正在尽力而为? 问题答案: 最好的方法是通过自定义Listener。在JSF servle

  • 问题内容: 如何在Java中使用XPath读取XML? 问题答案: 你需要遵循以下要求: 然后,调用传入该代码中定义的文档和所需的返回类型,并将结果转换为结果的对象类型。 如果你需要有关特定XPath表达式的帮助,则可能应该将其作为单独的问题进行询问(除非首先是你的问题-我理解你的问题是如何在Java中使用API​​)。 此XPath表达式将为你提供下第一个URL元素的文本: 这将使你获得第二个:

  • 问题内容: 我想使用Java中的XPath读取XML数据,因此对于我收集的信息,我无法根据需要解析XML。 这是我想做的: 通过其URL从联机获取XML文件,然后使用XPath对其进行解析,我想在其中创建两个方法。一种是输入特定的节点属性ID,然后得到所有的子节点,第二种是假设我只想获得一个特定的子节点值 在上面的示例中,如果我通过@name搜索,我想读取所有元素,并且我想只从@name’Java

  • 问题内容: 我正在使用AngularJS,它很棒。我在文档中找不到它-Java语言中与此AngularJS表达式等效的功能是什么: 谢谢您的帮助。 问题答案: 它在Angular的过滤器文档中: 在HTML模板绑定中 {{filter_expression | filter:expression}} 在JavaScript中 $ filter(’filter’)(数组,表达式) 在您的情况下,它看

  • 我以前有一个类似于Rails的查询: 它生成sql查询,如下所示: 现在我想将其更改为使用而不是。我创建了这个: 现在,当我使用空数组时,我得到以下错误: