自己动手搭建一个简单的基于Hadoop的离线分析系统之三——hive
在上一篇《自己动手搭建一个简单的基于Hadoop的离线分析系统之二——HDFS》文章中介绍了整个系统的数据存储,这一篇文章从hive入手,介绍整个离线分析系统的数据分析。
一、数据库设计
首先需要明确的是,hive利用HDFS存储数据,利用MapReduce查询数据,虽然他具有sql数据库的外表,但应用场景完全不同,最大的不同点是,hive并不是一个类似于MySQL的关系型数据库,他不支持外键,因此hive只适合用来做批量数据统计分析,hive中常用的表模型有:
table:普通表,在HDFS中表现所属数据库目录下一个文件夹;
external table:外部表,与table类似,不过其数据存放位置可以在任意指定路径(本地/集群),且删除表不会对源数据造成影响;
partition:分区表,在HDFS中表现为table目录下的子目录,其中分区所依赖的字段不再作为该表的键;
bucket:分桶表,在HDFS中表现为同一个表目录下根据hash散列之后的多个文件,类似于MapReduce中的Partitioner,各个桶中的数据交由不同的reduce处理和汇总。
虽然所有信息来源于不同的地区,但是这些文件都采用同一种结构来保存数据,因此本系统使用的是外部表,并将集群中dump_path目录下的所有文件中的数据汇总到一张表上进行显示。
二、sql脚本
--切换数据库
use ${hiveconf:database_name};
--创建表并导入数据
create external table if not exists ${hiveconf:table_name}(
province string,
city string,
country string,
price int,
size int,
number int,
detail_address string,
title string)
row format delimited fields terminated by '\t'
location "${hiveconf:localdata_path}";
三、修改后的shell脚本
#! /bin/bash
#set java env
export JAVA_HOME=/usr/local/jdk1.7.0_80
#export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:$JAVA_HOME/bin
#set hadoop env
export HADOOP_HOME=/home/liang/apps/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#set hive env
export HIVE_HOME=/home/liang/apps/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
#源数据存放路径以及错误日志
data_file="/home/liang/simple_log_analysis/srcdata/"
areas=('sh' 'tj' 'bj' 'cq')
error_log="/home/liang/simple_log_analysis/errorlog.txt"
code_file="/home/liang/simple_log_analysis/pachong.py"
fail_dump_path="/home/liang/simple_log_analysis/failed_dump/"
#爬取数据并存储
for area in ${areas[@]}
do
#python3 $code_file -h
date '+%c' >> $error_log
python3 $code_file -a $area -p $data_file 2>>$error_log
if [ $? -eq 0 ]
then
echo "爬取信息成功"
else