目录
hive表数据导出 - insert overwrite 方式
分布式计算概述
分散->汇总模式:(MapReduce就是这种模式)
中心调度->步骤执行模式:(大数据体系的Spark、Flink等是这种模式)
YARN概述
YARN 即Hadoop内提供的进行分布式资源调度的组件
一般来说,MapReduce最好是在YARN的管控下进行
Map任务喝Reduce任务分别向YARN申请资源,然后YARN根据现存的资源进行任务分配
YARN架构
核心架构
主从架构,有两个角色 :ResourceManager(主),NodeManager(从)
当任务发起时,ResourceManager进行总的资源调度(每个服务器分配多少内存),然后NodeManager使用容器Container,预先占用这一部分资源,然后将这一部分资源提供给程序使用
辅助架构
除了这两个角色,还可以搭配两个辅助角色使得YARN更加稳定
Web应用代理(Web Application Proxy)
代理服务器,即Web应用代理是 YARN 的一部分。默认情况下,它将作为资源管理器(RM)的一部分运行,但是可以配置为在独立模式下运行。使用代理的原因是为了减少通过 YARN 进行基于网络的攻击的可能性。
JobHistoryServer历史服务器
历史服务器的功能很简单: 记录历史运行的程序的信息以及产生的日志并提供WEB UI站点供用户使用浏览器查看。
一般来说,日志运行在容器中,如果想查看日志则需要去不同的服务器调用不同意的容器,比较麻烦,于是就可以统一收集到HDFS,由历史服务器托管为WEB UI供用户在浏览器统一查看
MapReduce 概述
以一个统计问题为例子,例如要统计一个很长的字符串A里面有多少个字母a,那么假设我有四个服务器
设置三个服务器为分散服务器,一个服务器为汇总服务器,那么会把A map成三分,然后分别计算,最后把结果reduce到汇总服务器
配置相关文件
$HADOOP_HOME/etc/hadoop 文件夹内,修改:
• mapred-env.sh 文件,添加如下环境变量
#设置JDK路径
export JAVA_HOME=/export /server /jdk
#设置JobHistoryServer进程内存为1G
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
#设置日志级别为INFO
export HADO0P_MAPRED_ROOT_LOGGER=INFO,RFA
•mapred-site.xml文件,添加如下配置信息
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/data/mr-history/tmp</value>
<description></description>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/data/mr-history/done</value>
<description></description>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
在 $HADOOP_HOME/etc/hadoop 文件夹内,修改:
• yarn-env.sh 文件,添加如下 4 行环境变量内容:
#设置JDK路径的环境变量
export JAVA_HOME=/export/server/jdk
#设置HADOOP_HOME的环境变量
export HADOOP_HOME=/export/server/hadoop
#设置配置文件路径的环境变量
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
#设置目志文件路径的环境变量
export HADOOP LOG DIR=$HADO0P_HOME/logs
• yarn-site.xml 文件,配置如图属性
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
<description></description>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>node1:8089</value>
<description>proxy server hostname and port</description>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>Configuration to enable or disable log aggregation</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<description>Configuration to enable or disable log aggregation</description>
</property>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
<description></description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description></description>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/nm-local</value>
<description>Comma-separated list of paths on the local filesystem where intermediate data is written.</description>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/nm-log</value>
<description>Comma-separated list of paths on the local filesystem where logs are written.</description>
</property>
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>10800</value>
<description>Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled.</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>Shuffle service that needs to be set for Map Reduce applications.</description>
</property>
然后复制到另外两个节点中去
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node2: `pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node3: `pwd`/
最后启动:
一般来说,运行下面就可以了
start-yarn.sh
mapred --daemon start historyserver
可以通过 node1:8088这个端口检测yarn运行情况
提交MapReduce到YARN
一般来说不会直接写MapReduce代码,但是Hadoop官方内置了一些预置的MapReduce程序代码,我们无需编程,只需要通过命令即可使用。
这里举一个例子:
hadoop jar /export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /data/test.txt /data/wc
使用wordcount这个方法,对test.txt进行运算,意思就是统计单词的数量,把结果存储到wc文件夹中:
也可以进入node1:8088查看状态
Hive
MapReduce支持程序开发(Java、Python等)但不支持SQL开发,Apache Hive是一款分布式SQL计算的工具, 其主要功能是:将SQL语句 翻译成MapReduce程序运行
Hive架构
要实现分布式SQL计算,起码需要两种过程:
Hive在VMware部署
Hive是一个单机工具,只需要部署到一台服务器即可
以下步骤来自:第四章-04-[实操]Hive在VMware虚拟机中部署_哔哩哔哩_bilibili
1、在node1节点上配置Mysql
# 更新密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
# 安装Mysql yum库
rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm
# yum安装Mysql
yum -y install mysql-community-server
# 启动Mysql设置开机启动
systemctl start mysqld
systemctl enable mysqld
# 检查Mysql服务状态
systemctl status mysqld
# 第一次启动mysql,会在日志文件中生成root用户的一个随机密码,使用下面命令查看该密码
grep 'temporary password' /var/log/mysqld.log
# 修改root用户密码
mysql -u root -p -h localhost
Enter password:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root!@#$';
# 如果你想设置简单密码,需要降低Mysql的密码安全级别
set global validate_password_policy=LOW; # 密码安全级别低
set global validate_password_length=4; # 密码长度最低4位即可
# 然后就可以用简单密码了(课程中使用简单密码,为了方便,生产中不要这样)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
/usr/bin/mysqladmin -u root password 'root'
grant all privileges on *.* to root@"%" identified by 'root' with grant option;
flush privileges;
2、配置hadoop
配置如下内容在Hadoop的core-site.xml中,并分发到其它节点,且重启HDFS集群
3:下载解压Hive
4:提供MySQL Driver包
5:配置Hive
•在Hive的conf目录内,新建hive-site.xml文件,填入以下内容:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</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>123456</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
</configuration>
步骤6:初始化元数据库
步骤7:启动Hive(使用Hadoop用户)
. Hive中创建的库和表的数据,存储在HDFS中,默认存放在:hdfs://node1:8020/user/hive/warehouse中。
Hive的启动
上面说到启动hive有两种方式,即前台方式和后台方式
bin/hive这种就是直接 Hive的Shell客户端,写mysql代码
HiveServer2这种方式就是给第三方软件一个接口,可以使用第三方软件连接到hive,从而更方便的写mysql代码
启动方法:
#先启动metastore服务 然后启动hiveserver2服务
nohup bin/hive --service metastore
nohup bin/hive --service hiveserver2
测试一下接口:
netstat -anp|grep 10000
说明 HiveServer2位于71625端口,且提供了端口号为10000的thrift端口
数据库操作
数据表操作
创建表的语法:
- •EXTERNAL,创建外部表
- •PARTITIONED BY, 分区表
- •CLUSTERED BY,分桶表
- •STORED AS,存储格式
- •LOCATION,存储位置
内部表操作
hive中的表可以分为 内部表 外部表 分区表 分桶表
在创建完内部表并赋值后,可以查看内容,一半默认是存储在/user/hive/warehouse中,也可使用location替换:
可以看到列之间没有分割,其实只是我们看不到,默认的数据分隔符是:”\001”是一种特殊字符,是ASCII值,键盘是打不出来
在某些文本编辑器中是显示为SOH的。
当然,分隔符我们是可以自行指定的。
在创建表的时候可以自己决定:
create table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t';
• row format delimited fields terminated by '\t' :表示以 \t 分隔
查看表的信息:
desc formatted table;
外部表操作
外部表的数据和表是独立的,可以分别建立
比如先建立表,再建立数据文件
1、现在linux上建立文件date\test.txt:
vim test.txt
1 qqqq
2 wwww
3 eeee
2、 创建外部表,这里必须规定分隔符,且必须跟上述文件中的分隔符一样
create external table test_ext1(id int, name string)
row format delimited fields terminated by ‘\t’ location ‘/tmp/test_ext1’;
3、把linux的文件放入hive的表对应的文件夹中
hdfs dfs -put -f test.txt /tmp/test_ext1/
此时查看表test_ext1就可以看到对应内容了
4、但是如果此时修改test.txt文件,表的数据也会变化
但是在hive中删除表,不会删除数据文件
同理 先有数据文件再有表也可以
内部表和外部表可以相互转换
alter table stu set tblproperties('EXTERNAL'='TRUE');
alter table stu set tblproperties('EXTERNAL'='FALSE');
数据加载和导出
数据加载LOAD
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
基于HDFS进行load加载数据,源数据文件会消失(本质是被移动到表所在的目录中)
数据加载 - INSERT SELECT 语法
我们也可以通过SQL语句,从其它表中加载数据。
INSERT [OVERWRITE | INTO] TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...)
[IF NOT EXISTS]] select_statement1 FROM from_statement;
例如想要数据翻倍:
insert into test_ext1 select * from test_ext1
这种方式会执行mapreduce,小数据下会比较慢
hive表数据导出 - insert overwrite 方式
insert overwrite [local] directory ‘path’ select_statement1 FROM from_statement;
如果要导出到linux系统,就带local
例如
insert overwrite local directory '/home/hadoop/export1' select * from test_load ;
此处导出时的分隔符还是默认的,也可以自己定义分隔符
insert overwrite local directory '/home/hadoop/export2'
row format delimited fields terminated by '\t' select * from test_load;
分区表
在hive中可以把大的数据进行分类,放置在不同的文件夹中进行存储,那么在操作时就会变得更加快速和简便
比如要存储不同月份的销售数据,那么可以根据月份进行分区,不同的月份创建不同的文件夹存放数据
语句:
create table tablename(...) partitioned by (分区列 列类型, ......)
row format delimited fields terminated by '';
实例:创建 partition_test表并按照month分区
create table partition_test(id int,name string) partitioned by (month string)
row format delimited fields terminated by '\t';
提前准备好test.txt文件:
上传数据并设置月份:
load data local inpath '/export/server/hive/date/test.txt'
into table partition_test partition(month='202208');
最终:
又上传一遍 ,设置为202209:
load data local inpath '/export/server/hive/date/test.txt'
into table partition_test partition(month='202209');
但是在文件中,会按照月份进行分别存放
当然也可以创建多级分区
create table partition_test(id int,name string)
partitioned by (year int,month int,day int)
row format delimited fields terminated by '\t';
这样就会按照年月日进行分区了