1. 程式人生 > >Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合

Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合

一.POM依賴


作者的hadoop叢集環境為:

HDFS,YARN,MapReduce2 : 2.7.3
Hive : 1.2.1000
HBase : 1.1.2

注:phoenix版本依賴性較強,請注意不同發行版之間的差異(直接從叢集伺服器上獲取jar包最為可靠)

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<spring-data-hadoop.version>2.4.0.RELEASE</spring-data-hadoop.version>
	<hive.version>1.2.1</hive.version>
        <phoenix-client.version>4.7</phoenix-client.version>
       <druid.version>1.0.27</druid.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.data</groupId>
		<artifactId>spring-data-hadoop</artifactId>
		<version>${spring-data-hadoop.version}</version>
	</dependency>
	<dependency>
		<groupId>org.apache.hive</groupId>
		<artifactId>hive-jdbc</artifactId>
		<version>${hive.version}</version>
	</dependency>
        <dependency>
          <groupId>org.apache.phoenix</groupId>
          <artifactId>phoenix-client</artifactId>
          <version>${phoenix-client.version}</version>
     </dependency>
       <dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>${druid.version}</version>
	</dependency>
</dependencies>



二.spring boot 配置檔案


因為spring boot 是預設且推薦採用yaml和properties配置檔案的方式。因此,作者在這裡採用yaml方式為例:

application.yml:

# hive 資料來源自定義配置
hive:
  url: jdbc:hive2://192.168.61.43:10000/default
  type: com.alibaba.druid.pool.DruidDataSource
  driver-class-name: org.apache.hive.jdbc.HiveDriver
  username: hive
  password: hive

# phoenix 資料來源自定義配置
phoenix:
  enable: true
  url: jdbc:phoenix:192.168.61.43
  type: com.alibaba.druid.pool.DruidDataSource
  driver-class-name: org.apache.phoenix.jdbc.PhoenixDriver
  username: 
  password: 
  default-auto-commit: true

當然,druid還有很多其它可選配置,請讀者自行斟酌:

max-active: 100
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 50


三.spring boot 配置Bean實現


因為上述配置資訊為自定義的資訊,spring boot 的 auto configuration 並不能完全理解編碼者的意圖,因此我們要手動創造資料來源Bean:

Hive:

/**
 * hive資料來源配置
 * @author chenty
 *
 */
@Configuration
public class HiveDataSource {
	
	@Autowired
	private Environment env;

	@Bean(name = "hiveJdbcDataSource")
	@Qualifier("hiveJdbcDataSource")
	public DataSource dataSource() {
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setUrl(env.getProperty("hive.url"));
		dataSource.setDriverClassName(env.getProperty("hive.driver-class-name"));
		dataSource.setUsername(env.getProperty("hive.username"));
		dataSource.setPassword(env.getProperty("hive.password"));
		return dataSource;
	}
	
	@Bean(name = "hiveJdbcTemplate")
	public JdbcTemplate hiveJdbcTemplate(@Qualifier("hiveJdbcDataSource") DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}

}

Phoenix:

/**
 * phoenix資料來源配置
 * @author chenty
 *
 */
@Configuration
public class PhoenixDataSource {
	
	@Autowired
	private Environment env;

	@Bean(name = "phoenixJdbcDataSource")
	@Qualifier("phoenixJdbcDataSource")
	public DataSource dataSource() {
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setUrl(env.getProperty("phoenix.url"));
		dataSource.setDriverClassName(env.getProperty("phoenix.driver-class-name"));
		dataSource.setUsername(env.getProperty("phoenix.username"));//phoenix的使用者名稱預設為空
		dataSource.setPassword(env.getProperty("phoenix.password"));//phoenix的密碼預設為空
		dataSource.setDefaultAutoCommit(Boolean.valueOf(env.getProperty("phoenix.default-auto-commit")));
		return dataSource;
	}
       
        @Bean(name = "phoenixJdbcTemplate")
     public JdbcTemplate phoenixJdbcTemplate(@Qualifier("phoenixJdbcDataSource") DataSource dataSource) {
          return new JdbcTemplate(dataSource);
     }
}


四.資料來源測試


接下來我們只需在測試類中,注入 hive/phoenix 的 JdbcTemplate,即可實現 hive/phoenix 的資料互動:

Hive:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(HiveServiceApplication.class)
public class MainTest {
	
	@Autowired
	@Qualifier("hiveJdbcTemplate")
	JdbcTemplate hiveJdbcTemplate;
	
	@Test  
	public void DataSourceTest() { 
		
		// create table
		StringBuffer sql = new StringBuffer("create table IF NOT EXISTS ");
		sql.append("HIVE_TEST1 ");
		sql.append("(KEY INT, VALUE STRING) ");
		sql.append("PARTITIONED BY (S_TIME DATE)"); // 分割槽儲存
		sql.append("ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' "); // 定義分隔符
		sql.append("STORED AS TEXTFILE"); // 作為文字儲存
		
		// drop table
//		StringBuffer sql = new StringBuffer("DROP TABLE IF EXISTS ");
//		sql.append("HIVE_TEST1");
		
		
		hiveJdbcTemplate.execute(sql.toString());
	} 

}

Phoenix:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(HBaseServiceApplication.class)
public class MainTest {
	
	@Autowired
        @Qualifier("phoenixJdbcTemplate")
       JdbcTemplate phoenixJdbcTemplate;
	
	@Test  
	public void DataSourceTest() {  	
		//phoenix
		phoenixJdbcTemplate.execute("create table IF NOT EXISTS PHOENIX_TEST2 (ID INTEGER not null primary key, Name varchar(20),Age INTEGER)");
	} 

}



五.傳統方式


雖然 spring boot 本身是不推薦傳統的xml配置的,但是實際生產過程中因各種客觀因素,導致有時我們不得不引入傳統的xml形式的配置檔案。因此針對 hive/phoenix 如果用xml配置檔案,並且在spring boot 下如何實現再做下簡單的介紹:

application.xml:

<!-- 配置HiveTemplate -->
<bean id="hiveTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<constructor-arg ref="hiveDataSource"/>
	<qualifier value="hiveTemplate"/>
</bean>
<bean id="hiveDataSource" class="com.alibaba.druid.pool.DruidDataSource">
	<property name="driverClassName" value="org.apache.hive.jdbc.HiveDriver"/>
	<property name="url" value="jdbc:hive2://172.20.36.212:10000/default"/>
	<property name="username" value="hive"/>
	<property name="password" value="hive"/>
	<!-- 初始化連線大小 -->  
	<property name="initialSize" value="0" />  
	<!-- 連線池最大使用連線數量 -->  
	<property name="maxActive" value="1500" />  
	<!-- 連線池最小空閒 -->  
	<property name="minIdle" value="0" />  
	<!-- 獲取連線最大等待時間 -->  
	<property name="maxWait" value="60000" />
</bean>

<!-- 配置PhoenixTemplate -->
<bean id="phoenixTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="phoenixDataSource"/>
    <qualifier value="phoenixJdbcTemplate"/>
</bean>
<bean id="phoenixDataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="org.apache.phoenix.jdbc.PhoenixDriver"/>
    <property name="url" value="jdbc:phoenix:172.20.36.212"/>  
    <!-- 初始化連線大小 -->  
    <property name="initialSize" value="0" />  
    <!-- 連線池最大使用連線數量 -->  
    <property name="maxActive" value="1500" />  
    <!-- 連線池最小空閒 -->  
    <property name="minIdle" value="0" />  
    <!-- 獲取連線最大等待時間 -->  
    <property name="maxWait" value="60000" />
    <!--因為Phoenix進行資料更改時不會自動的commit,必須要新增defaultAutoCommit屬性,否則會導致資料無法提交的情況-->  
    <property name="defaultAutoCommit" value="true"/>
</bean>

實現測試:

有了xml配置,我們只需在上述第四步驟測試類的類定義上加入如下註解,即可實現xml配置檔案資訊的載入:

@ImportResource({"classpath:application.xml","..."})

注意:配置檔案中bean的名字要與注入註解的名字一致