笔记
Hadoop
是一个适合于海量数据的分布式存储和分布式计算的框架。
两大核心
HDFS(hadoop distributed file system)
分布式存储
MapReduce
分布式计算
Hadoop的访问方式
WebGUI
50070–>查看hdfs数据,以及查看namenode,datanode健康状况
8088–>可以查看集群中mr的调度情况
19888–>job history提供访问的web端口
10020–>job history通信端口
CLI(Command Line Interface):
hdfs dfs mv/ls/cp/get/put ….
Java Api:
主要用来编写MR
SQL
要想使用SQL的方式来操作HDFS上面的数据,必须要满足两个条件
1、hdfs上面数据必须是结构化的数据
所谓结构化的数据,就是指存储在RDBMS中的数据。
关系与实体的一个映射关系
RE
2、hdfs上面的数据要有目录、表、行、列等等概念
hdfs上面的目录--->rdbs中的数据库和表
hdfs上的目录下面的文件(数据文件)中的行和列-->rdbs中的行和列
test.db
person
test1.db
person
package a
person.java
package b
person.java
Hive的概念
Hive是数据仓库的基础框架
数据仓库和数据的对比
1、数据仓库中存放的数据
是能够为公司的各个级别的决策提供数据支撑的数据
2、存放在数据仓库里面数据不能随随便便的进行修改,从很大程度上说都是存放的是历史history的数据,
在很大程度上对数据仓库里面的数据的操作基本都是查询
那么也就是说OLAP(Online analysis processing 联机分析过程)操作
也就相当于数据库中的select操作
DW(Data Warehouse EDW,DWH–>数据仓库)不适用于OLTP(Online transcation processing 联机事务处理)的操作
3、DW的构建在很大程度上是基于RDBSM建立
ETL
Extraction(提取,采集)
Transformation(转换)
Loading(加载)
Hive是SQL的解析引擎
Hive在今天最重要的一个功能就是担任数据仓库的构建*
select name, age, sex from person;–>hdfs
元信息
Hive的安装
Hadoop
MySQL
JDK
安装MySQL
第一步:
剔除linux上面的mysql以来
1、rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
2、rpm -e –nodeps rpm -qa | grep mysql
推荐使用
或者rpm -e –nodeps mysql-libs-5.1.71-1.el6.x86_64
第二步:
安装
rpm -ivh MySQL-server.xxx.rpm
rpm -ivh MySQL-client.xxx.rpm
执行配置脚本:/usr/bin/mysql_secure_installation
第三步:授权
[root@master soft]# mysql -h master -uroot -proot
ERROR 1130 (HY000): Host ‘master’ is not allowed to connect to this MySQL server
使用mysql -uroot -proot登录进行授权
mysql> grant all privileges on . to ‘root’@’%’ identified by ‘root’;
mysql> flush privileges;
第四步:加入开机启动项
chkconfig mysql on
注意:如果是在线安装的话,mysql服务名为mysqld
注意:
[root@master soft]# rpm -qa | grep mysql –> 针对的在线安装的方式
[root@master soft]# rpm -qa | grep MySQL –> 针对离线安装的方式
Hive的安装
解压,重命名到/opt/hive
修改配置
cp conf/hive-env.sh.template conf/hive-env.sh
cp conf/hive-default.xml.template conf/hive-site.xml
修改hive-env.sh,加入下面内容
export JAVA_HOME=/opt/jdk
export HADOOP_HOME=/opt/hadoop
export HIVE_HOME=/opt/hive
修改$HIVE_HOME/conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/opt/hive/tmp</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/hive/tmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/opt/hive/tmp</value>
</property>
启动
bin/hive
(e.g. ./schematool -initSchema -dbType ...==>解决方案
bin/schematool -initSchema -dbType mysql -userName root -passWord root
拷贝
将mysql-connector-java-5.1.39.jar拷贝到$HIVE_HOME/lib/目录下
运行报错:Found Class jline.Terminal, but interface was expected
因为jline.jar版本不匹配造成的,
cp HIVEHOME/lib/jline−2.12.jar HADOOP_HOME/share/hadoop/yarn/lib
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>dw在hdfs上存放路径</description>
</property>
Hive常见的运行方式:
bin/hive -f /opt/data/hive-data/hive-demo.hql
bin/hive -e "show databases; use default; show tables; select * from tttt;"
这两种方式等价,但是上面的-e和-f不要对调!!!
bin/hive -S -e "show databases; use default; show tables; select * from tttt;" > /opt/data/hive-data/result.csv
将""中的hql安静slient执行完成,并将返回结果重定向到/opt/data/hive-data/result.csv中
上述脚本添加配置参数
bin/hive -f /opt/data/hive-data/hive-demo.hql --hiveconf hive.cli.print.header=true
或者在hive-demo.hql中加入set hive.cli.print.header=true;
bin/hive -e "show databases; use default; show tables; select * from tttt;" --hiveconf hive.cli.print.header=true
或者在引号""中加入set hive.cli.print.header=true;
Hive提供了访问hdfs和linux操作方式
linux
!命令;
eg. !pwd;
/opt/hive
hdfs:
dfs -ls /;
hive (default)> dfs -ls /;
Found 5 items
drwx------ - root supergroup 0 2016-10-27 19:55 /history
drwxr-xr-x - root supergroup 0 2016-10-28 00:45 /input
drwxr-xr-x - root supergroup 0 2016-10-28 02:46 /out
drwxr-xr-x - root supergroup 0 2016-10-30 22:02 /tmp
drwxr-xr-x - root supergroup 0 2016-10-30 23:05 /user
select w.word, count(w.word) as count from
(select explode(split(line, ” “)) word from tttt) w
group by w.word order by count;
Hive的表的操作
表结构的操作
create table student(id int);
给student增加一列或多列字段
alter table student add columns(name string, birthday date, online boolean);
替换原来表中的字段信息
alter table student replace columns(id int);
注意:不支持删除某一列,只能通过replace这种方式曲线救国。
对列的类型或名称进行修改
alter table student change column id sid string;
Hive有默认的行列分隔符
行分隔符\n,列分隔符是\001-->shell中通过ctrl+v,ctrl+a敲出来
create table student(id int, name string, birthday date, online boolean);
加载数据的语句
load data local inpath '/opt/data/hive-data/stu.txt' into table student;
数据的加载两种模式
读模式
数据在被加载到数据库的过程中不对数据的合法性进行校验,只在读取数据的时候对其合法性进行校验,
将不合法的数据显示为NULL。
有什么好处?
效率高,适合大数据的加载。
Hive加载数据就使用的是读模式。
写模式
数据在被加载到数据库的过程中需要对数据的合法性进行校验,数据库中的数据都是合法的。
有啥好处?
不用担心数据库中的数据非法。
加载过程非常缓慢
自定义行列分隔符
create table stu(
id int,
name string,
birthday date,
online boolean
) row format delimited -->使用自定义分隔符的标识
fields terminated by '\t' -->指定了列的分隔符
line terminated by ‘\n’; –>指定了行的分隔符,默认和linux文件行分隔符一致,都是\n
Hive中的复杂的数据类型
array
create table t_arr(
id int,
name string,
hobby array
) row format delimited
fields terminated by ‘\t’ ;
load data local inpath ‘/opt/data/hive-data/hive-array.txt’ overwrite into table t_arr;
我们发现,数据没能正确的显示出每一个hobby的内容,进过分析,其实质是没有对array指定
相应的分隔符,或者说,表内容中的分隔符”,”不是默认的分隔符,array数组元素之间的默认分隔符是
\002–>ctrl+v ctrl+b
create table t_arr_1(
id int,
name string,
hobby array
) row format delimited
fields terminated by ‘\t’
collection items terminated by ‘,’;
select hobby[index] from tblName;来访问array中的元素
map
create table t_map(
id int,
name string,
score map