这里面有一套cdh版本的hadoop,hive,zookeeper,都是配套的
链接:https://pan.baidu.com/s/1wmyMw9RVNMD4NNOg4u4VZg
提取码:m888
重新配置一遍hadoop运行环境,详细的配置在https://blog.csdn.net/kxj19980524/article/details/88954645
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-senior01.buba.com:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0-cdh5.3.6/data</value>
</property>
</configuration>
<!-- 指定数据冗余份数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-senior03.buba.com:50090</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-senior01.buba.com:50070</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-senior02.buba.com</value>
</property>
<!--开启历史服务-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 任务历史服务 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop-senior02.buba.com:19888/jobhistory/logs/</value>
</property>
上面这个配置里的开启历史服务就是在执行完mapreduce程序后,可以访问以前执行过的mapreduce任务
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--这两个配置节点得和上面历史服务配置节点保持一致-->
<property>
<name>mapreduce.jobhistory.adress</name>
<value>hadoop-senior02.buba.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.adress</name>
<value>hadoop-senior02.buba.com:19888</value>
</property>
分发到别的节点,然后初始化
bin/hdfs namenode -format
初始化完后,编写两个脚本,一个是开启集群全部节点的,一个是关闭全部节点的.
#!/bin/bash
echo "---------------正在开启集群服务------------"
echo "---------------正在开启NameNode节点------------"
ssh kxj@hadoop-senior01.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start namenode'
echo "---------------正在开启SecondaryNamenode节点------------"
ssh kxj@hadoop-senior03.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start secondarynamenode'
echo "---------------正在开启DataNode节点------------"
for i in kxj@hadoop-senior01.buba.com kxj@hadoop-senior02.buba.com kxj@hadoop-senior03.buba.com
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanode'
done
echo "---------------正在开启ResourceManager节点------------"
ssh kxj@hadoop-senior02.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start resourcemanager'
echo "---------------正在开启NodeManager节点------------"
for i in kxj@hadoop-senior01.buba.com kxj@hadoop-senior02.buba.com kxj@hadoop-senior03.buba.com
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanager'
done
echo "---------------正在开启JobHistoryServer节点------------"
ssh kxj@hadoop-senior02.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh start historyserver'
#!/bin/bash
echo "---------------正在关闭集群服务------------"
echo "---------------正在关闭JobHistoryServer节点------------"
ssh kxj@hadoop-senior02.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh stop historyserver'
echo "---------------正在关闭ResourceManager节点------------"
ssh kxj@hadoop-senior02.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh stop resourcemanager'
echo "---------------正在关闭NodeManager节点------------"
for i in kxj@hadoop-senior01.buba.com kxj@hadoop-senior02.buba.com kxj@hadoop-senior03.buba.com
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh stop nodemanager'
done
echo "---------------正在关闭NameNode节点------------"
ssh kxj@hadoop-senior01.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop namenode'
echo "---------------正在关闭SecondaryNamenode节点------------"
ssh kxj@hadoop-senior03.buba.com '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop secondarynamenode'
echo "---------------正在关闭DataNode节点------------"
for i in kxj@hadoop-senior01.buba.com kxj@hadoop-senior02.buba.com kxj@hadoop-senior03.buba.com
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop datanode'
done
编写完后修改它们的可执行权限.
上面命令当中ssh后面单引号,表示ssh到别的节点后,执行单引号里面的命令. echo `` >> kxj.txt 反引号作用是把反引号里的脚本结果输入到kxj.txt里
JobHistoryServer节点就是上面说的历史的那个服务
编写好后还不能运行呢,涉及到一个知识点,有shell和无shell
有shell
粗放来讲,你手动使用CRT登录某个Linux系统时,是有shell的
无shell
当你使用ssh访问某个系统的时候,是无shell的
无shell的时候是加载不了那个系统的环境变量的,只能加载那个系统的用户变量.
系统变量就是/etc/profile文件,用户变量是用户根目录下
用户变量
cat /etc/profile >> ~/.bashrc 把系统变量里的内容都加到用户环境变量里面
把另外两台也执行一下,执行完后就可以进行脚本的测试了.
hive介绍
Hive的特性
1、操作接口是采用SQL语法,HQL跟sql很相似.
2、避免了写MapReduce的繁琐过程.把sql语句转换成mapreduce程序自动打成jar包,运行.
Hive体系结构
1、Client客户端有两种.
** 终端命令行
** JDBC -- 不常用,非常麻烦(相对于前者)
2、metastore
** 原本的数据集和字段名称以及数据信息之间的双射关系。
** 我们目前是存储在Mysql中
3、Server服务端,也就是Hadoop
** 在操作Hive的同时,需要将Hadoop的HDFS开启,YARN开启,MAPRED配置好
数据库:
mysql、oracle、sqlserver、DB2、sqlite(手机端小型数据库)、MDB
数据仓库:
Hive,是数据仓库是MapReduce的客户端,也就是说不必要每台机器都安装部署Hive.
看下图,现在假设有一个txt文本是这种格式的,让每行的每个字段对应上表的字段名,如果写mapreduce程序的话很麻烦,但是用hive的话,可以在hive上建个表,然后执行段sql语句,想要的结果就能输出出来.
安装步骤
解压hive后,进入conf目录下,修改配置文件名称
mv hive-default.xml.template hive-site.xml
mv hive-env.sh.template hive-env.sh
JAVA_HOME=/opt/modules/jdk1.7.0_67
HADOOP_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6
export HIVE_CONF_DIR=/opt/modules/hive-0.13.1-cdh5.3.6/conf
安装Mysql
$ su - root
# yum -y install mysql mysql-server mysql-devel
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# yum -y install mysql-community-server
启动mysql服务 start mysqld.service
修改mysql密码 mysqladmin -uroot password '123456'
下面这是两种登录MySQL的方式
修改一些用户权限,如果别的节点想访问这个mysql给它相应的权限.
grant all on *.* to root@'hadoop-senior01.buba.com' identified by '123456';
flush privileges; 刷新配置
grant:授权
all:所有权限
*.*:数据库名称.表名称
root:操作mysql的用户
@'':主机名
密码:123456
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-senior01.buba.com:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
注意在2785行左右缺少一个property标签,记得补上,官网下的没有,不然会报错.
修改日志配置文件名称
mysql驱动包https://download.csdn.net/download/kxj19980524/11136513
把mysql的驱动包放到hive的lib目录下
操作hive前先开启hadoop集群,不然不能操作.
启动hive后,在mysql中就有了metastore数据库了,其实不使用mysql数据库也行,用别的也行,在配置文件里配置上相应的驱动就可以.
当在hive中创建数据库的时候就会在这个目录下生成对应的.db文件夹,也可以在配置文件中修改地址.
这两个是开启一些提示功能的
这儿就有提示了
创建一个表并且查询相应信息,可以看到使用select * 的时候它是没有生成mapreduce程序的,之间就出结果了.hive里是string类型,不是varchar
后面的这个\t就是表示进行双射的时候,hive是根据\t来划分字段的,如果你文本里使用的是逗号或者别的东西分割开的话,hive是不识别的.
create table t1(eid int, name string, sex string) row format delimited fields terminated by '\t';
desc formatted t1; 查看表的详细信息的详细信息
安装好hive之后,会在mysql数据库中建立一个metastore数据库这个数据库中就是存的hive表的元数据信息,当在hive创建表后就会在MySQL的这个数据库中存上元数据,当在hive中创建一个数据库的时候,在hdfs上就会创建一个对应的.db文件夹,当在hive创建表的时候就会在这个.db文件夹下生成对应的文件,也会在metastore中生成相应的双射关系.
在mysql的metastore数据库的这个表中就是生成的双射关系.
清洗数据,比如公司给的数据是*隔开的,hive设置表的时候是以\t分割的这时候就需要先写一个mapreduce程序按\t分割开然后再把数据导入到hive里面去
load data local inpath '文件路径' into table 表名; 如果导入的是hdfs上的数据的话,把local去掉就可以了.
这个操作是往hive创建的表里导入数据.
如果执行的查询语句是按条件查询的话很明显它是走了mapreduce程序了 ,当在hive中查询的时候其实是先去metastore上找到表跟元数据的双射关系,然后再进行查询的,
点击后面的history可以看到以前执行过的mapreduce程序
如果每次执行那么简单的查询语句都转换成mapreduce程序的话是很慢的,修改下面配置就可以简单的语句不执行mapreduce了
hive命令参数 -e后面加引号,里面可以直接写hql语句.
也可以把hql语句放入.hql结尾的文件里然后使用-f执行,说明它可以支持shell脚本来执行hql语句.
创建两个表,创建部门,员工信息表
hive> create table if not exists db_hive_demo.dept(
deptno int,
dname string,
loc string)
row format delimited fields terminated by '\t';
hive> create table if not exists db_hive_demo.emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
导入数据
dept.txt
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
emp.txt
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
load data local inpath '/opt/modules/hive-0.13.1-cdh5.3.6/hqldata/dept.txt' into table db_hive_demo.dept;
load data local inpath '/opt/modules/hive-0.13.1-cdh5.3.6/hqldata/emp.txt' into table db_hive_demo.emp;
复杂数据类型操作
1.Array
create table tb_array(
name string,
work_locations array<string>
)
row format delimited fields terminated by '\t'
collection items terminated by ',';
加载数据到表tb_array
zhangsan beijing,shanghai,tianjin,hangzhou
lisi changchu,chengdu,wuhan
load data local inpath '/opt/modules/hive-0.13.1-cdh5.3.6/t2.txt' into table kxj.tb_array;
可以使用下标来查询数据
用size来查询数组长度
2.Map
创建含有map数据结构的表
create table tb_map(
name string,
scores map<string,int>
)
row format delimited fields terminated by '\t'
collection items terminated by ','map keys terminated by ':';
load data local inpath '/opt/modules/hive-0.13.1-cdh5.3.6/map.txt' into table kxj.tb_map;
查询所有学生的英语成绩
查询所有学生的英语和数学成绩
Struct
创建一张带有结构体的表
create table tb_struct(
ip string,
userinfo struct<name:string,age:int>
)row format delimited fields terminated by '#'
collection items terminated by ':';
load data local inpath '/opt/modules/hive-0.13.1-cdh5.3.6/struct.txt' into table kxj.tb_struct;
查看hive历史操作命令,主要用于排查逻辑错误或者查看常用命令
Hive临时生效设置
固定语法:set 属性名=属性值
在hive上,可以当sql一样操作,基本上和sql是一样的,聚合函数什么的都有