para大数据练习题

hdfs

1. hdfs数据存储架构图(软件画图)

在这里插入图片描述

2. 对hdfs元数据的了解

元数据(Meta Date),关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。
元数据可以为数据说明其元素或属性(名称、大小、数据类型、等),或其结构(长度、字段、数据列),或其相关数据(位于何处、如何联系、拥有者)。

3. hdfs shell 基本命令

-ls 功能:显示目录信息
-mkdir:在hdfs上创建目录
-moveFromLocal 从本地剪切粘贴到hdfs
-moveToLocal  从hdfs剪切粘贴到本地
--appendToFile追加一个文件到已经存在的文件末尾
-cat  显示文件内容
-tail 显示一个文件的末尾
-text    以字符形式打印一个文件的内容
-chgrp 
-chmod
-chown
linux文件系统中的用法一样,对文件所属权限
-copyFromLocal
从本地文件系统中拷贝文件到hdfs路径去
-cp   从hdfs的一个路径拷贝hdfs的另一个路径
-mv 在hdfs目录中移动文件
-get  等同于copyToLocal,就是从hdfs下载文件到本地
-getmerge 合并下载多个文件
-setrep  设置hdfs中文件的副本数量
-count   统计一个指定目录下的文件节点数量
-du 统计文件夹的大小信息
-df  统计文件系统的可用空间信息
-rmdir       删除空目录

hbase

1. hbase原理架构图

在这里插入图片描述

2. hbase数据寻址过程

寻找RegionServer
ZooKeeper–> -ROOT-(单Region)–> .META.–> 用户表
-ROOT-表
表包含.META.表所在的region列表,该表只会有一个Region;
Zookeeper中记录了-ROOT-表的location。

.META.表
表包含所有的用户空间region列表,以及RegionServer的服务器地址。

3. hbase基本操作库表命令

  1. 查询数据状态(status)

hbase(main):017:0> status //hbase(main):017:0>是命令行

  1. 查看名字空间以及名字空间下的表(list_namespace 、 list_namespace_tables)

hbase(main):018:0> list_namespace

hbase(main):019:0> list_namespace_tables ‘hbase’ //列出hbase这个名字空间下的表

  1. 创建名字空间和删除名字空间(create_namespace、drop_namespace)

hbase(main):021:0> create_namespace ‘zxz’

hbase(main):022:0> drop_namespace ‘zxz’

  1. 查看表信息(list)

hbase(main):022:0>list

  1. 创建表(create)

hbase(main):022:0>create ‘名字空间名:表名’,‘列族’

  1. 删除表:(drop disable)

hbase(main):023:0>drop ‘名字空间:表名’ //不指定名字空间使用默认空间

执行他会报错说你如果要删除向禁用,以免保持一致性

hbase(main):024:0>disable ‘表名’ //禁用表

  1. 释放表(enable) 只对禁用的表有用

hbase(main):025:0>enable ‘表名’

  1. 删除列族(alter,disable)

hbase(main):026:0>disable ‘表名’

hbase(main):027:0>alter ‘表名’,{NAME=>‘列族名’,METHOD=>‘delete’}

  1. 查询一个表是否存在(exits)

hbase(main):028:0>exits ‘表名’

  1. 判断表的状态(is_enabled)

hbase(main):029:0>is_enabled ‘表名’ //如果是true则是未禁用false是禁用

  1. 插入记录(put)

hbase(main):030:0>put ‘表名’,‘行键’,‘列族:列’,‘值’

  1. 获取一个行键的所有数据(get)

hbase(main):031:0>get ‘表名’,‘行键’

  1. 获取一个行键,一个列族的所有数据(get)

hbase(main):032:0>get ‘表名’,‘行键’,‘列族’

  1. 获取一个列键,一个列族中一个列的所有数据(get)

hbase(main):033:0>get ‘表名’,‘行键’,‘列族:列’

  1. 更新一条记录(put)

hbase(main):034:0>put ‘表名’,‘行键’,‘列族:列’,‘值’ //更新其实和正常添加数据一样只不过表名,行键,列族,列要在表里有不然,和插入数据没有区别了,更新数据后,原来的数据会被覆盖,但可以利用时间戳获取到原来的值

  1. 通过时间戳来获取数据(get)(了解)

hbase(main):035:0>get ‘表名’,‘行键’,(column=>‘列族:列’,‘timestamp’=>时间戳的值) //这个很少用

  1. 全表扫描(scan)

hbase(main):036:0>scan ‘表名’

  1. 删除指定行键的字段(delete)

hbase(main):037:0>delete ‘表名’,‘行键’,‘列族:列’

  1. 删除整行(deleteall)

hbase(main):038:0>deleteall ‘表名’,‘行键’

  1. 查询表中有多少行(count)

hbase(main):039:0>count ‘表名’

  1. 清空表(truncate)

hbase(main):040:0>truncate ‘表名’

  1. 查看表结构(desc)

hbase(main):041:0>desc ‘表名’

zookeeper

1. zookeeper基本介绍。

Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。它有如下的一些特点:简单Zookeeper的核心是一个精简的文件系统,它支持一些简单的操作和一些抽象操作,例如,排序和通知。丰富 Zookeeper的原语操作是很丰富的,可实现一些协调数据结构和协议。例如,分布式队列、分布式锁和一组同级别节点中的“领导者选举”。高可靠Zookeeper支持集群模式,可以很容易的解决单点故障问题。松耦合交互不同进程间的交互不需要了解彼此,甚至可以不必同时存在,某进程在zookeeper中留下消息后,该进程结束后其它进程还可以读这条消息。资源库Zookeeper实现了一个关于通用协调模式的开源共享存储库,能使开发者免于编写这类通用协议。

yarn

1. yarn的原理架构图

在这里插入图片描述
YARN允许多个应用程序运行在一个集群中,并将资源按需分配给它们,这大大提高了资源利用率,其次,YARN允许各类短作业和长服务混合部署在一个集群中,并提供了容错、资源隔离及负载均衡等方面的支持,这大大简化了作业和服务的部署和管理成本。

2. yarn的shell基本命令

1、初始化一个新的项目
yarn init
2、添加一个依赖包
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
3、安装所有的依赖包
yarn 或者 yarn install

hive

1.hive原理架构图,并说出理解。

在这里插入图片描述
Jobtracker是hadoop1.x中的组件,它的功能相当于: Resourcemanager+AppMaster

TaskTracker 相当于: Nodemanager + yarnchild

2.hive基本对建库表的操作命令

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
   [(col_name data_type [COMMENT col_comment], ...)] 
   [COMMENT table_comment] 
   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
   [CLUSTERED BY (col_name, col_name, ...) 
   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
   [ROW FORMAT row_format] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]

spark

1.spark shell命令

--spark启动
localhost$spark-sql --master yarn 启动主节点 yarn模式

--查看hdfs文件 

hdfs dfs -ls /spark/myDatabase.db 查看我们建的表 其实是是建立在hdfs里面

hdfs dfs -du -h /spark/myDatabase.db 查看我们的文件大小 也就是我们的表的大小 要接近最小的block大小 如64M或者128M -h 是以我们合适的单位去展示大小 可以根据目录du下去,知道文件 ,可以查看文件被分开了多少个小文件。

--打包
去到源码的class文件的顶级目录bin目录下 
jar cvf test.jat com 
意思是把bin下的com目录下全打包成test.jar包



spark-sql   //打开spark-sql窗口,可执行sql语句,例如查看hive数据库、表或执行建库、建表、select等sql操作
spark-shell //打开spark-shell窗口,可执行scala代码片段。

以下在spark-sql中执行
1、查看已有的database
show databases;


2、创建数据库
create database myDatabase;


3、登录数据库myDatabase;
use myDatabase


4、查看已有的table
show tables;  #查看所有表
show tables 'KHDX'; #支持模糊查询,表名包含KHDX


5、创建表
create table if not exists myDatabase.khdx_hy  
(hydh string,hymc string,jgdh string)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\t'
  LINES TERMINATED BY '\n'
STORED AS TEXTFILE; #不带分区


create table if not exists  myDatabase.nbzz_ckmxz(zhdh string,hydh string,jgdh string,fhdh string, kmh string,bz string,cllbz string,hyye decimal(19,4),hyylj decimal(19,4),hyjlj decimal(19,4),hynlj decimal(19,4))
partitioned by (tjrq string)
row format delimited fields terminated by  '\t'
lines terminated by '\n'
stored as textfile; #带分区,分区字段tjrq


create table if not exists myDatabase.tmp_nbzz_ckmxz like myDatabase.nbzz_ckmxz; #快速建表,不带数据
create table if not exists myDatabase.tmp_nbzz_ckmxz select * from  myDatabase.nbzz_ckmxz; #快速建表,同时复制数据




create EXTERNAL table IF NOT EXISTS test (userid string,ptDate string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/tmp/outer_table/20121214';   #创建外部表test,并指向外部文件位置




create EXTERNAL table IF NOT EXISTS test (userid string) 
partitioned by (ptDate string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';  #创建外部表test,按字段ptDate分区,未指向外部文件位置


alter table test add partition (ptDate='20121214') location '/tmp/outer_table/20121214';  #指定外部表的外部文件位置,可用于接口文件加载。


6、显示表结构
desc khdx_hy;   #显示表khdx_hy的表结构
desc formatted khdx_hy; #格式化表khdx_hy的表结构信息,信息更详细,包括在hdfs的存储位置
show partitions khdx_hy; #显示表khdx_hy的分区信息
show create table khdx_hy; #查看建表语句


7、修改表结构
alter table myDatabase.nbzz_ckmxz add partition(tjrq='20171231')add partition(tjrq='20180101') #手动给分区表增加2个分区
alter table myDatabase.nbzz_ckmxz drop if exists partition (tjrq='20171231');  #手动删除分区表某个分区
alter table myDatabase.nbzz_ckmxz add columns (fh string);    #追加字段
alter table myDatabase.nbzz_ckmxz change hydh hydh1 string;         #修改字段hydh名称为hydh1,类型为string


drop table myDatabase.nbzz_ckmxz; #删除表
alter table myDatabase.tmp_nbzz_ckmxz rename to myDatabase.nbzz_ckmxz; #重命名表




8、操作表
select * from myDatabase.khdx_hy order by hydh limit 10;    #查询表,显示前10条记录。
truncate table khdx_hy;     #清空表数据
insert overwrite table myDatabase.tmp_khdx_hy select * from myDatabase.khdx_hy; #用khdx_hy的数据覆盖tmp_khdx_hy数据;
insert into myDatabase.tmp_khdx_hy select * from myDatabase.khdx_hy;  #用khdx_hy的数据追加tmp_khdx_hy数据中,不覆盖原来数据。
load data local inpath '/home/myDatabase/data/org_info.txt' overwrite into table myDatabase.org_info ; #从文件中导入数据到表中
load data local inpath '/home/myDatabase/data/t_ma_fct_etl_acct_liyang_20171231.dat' overwrite into table myDatabase.T_MA_FCT_ETL_ACCT partition(tjrq="20171231");
#从文件导入数据至表的某个分区。
insert overwrite local directory '/home/myDatabase/data/khdx_hy.txt'  row format delimited  fields terminated by '\t' select * FROM myDatabase.KHDX_HY;
#从表khdx_hy导出数据至本地文件khdx_hy.txt

2. spark 提交job的 基本执行原理

创建 Task:当调度阶段运行后,在 DAGScheduler 的 submitMissingTasks 方法中会根据调度阶段 Partition 数量拆分对应个数任务。对于 ResultStage,生成 ResultTask,对于 ShuffleMapStage 生成 ShuffleMapTask。这些和分区个数一样多的任务组成一个 TaskSet 提交给 TaskScheduler 进行处理。每一个 TaskSet 都包含了对应调度阶段的所有任务,这些任务处理逻辑完全一样,只是处理的数据不同,这些数据是对应的数据分片。
创建 TaskSetManager 并 向 DriverEndpoint 发送消息:将 TaskSet 提交到 TaskSchedulerImpl 的 submitTasks 时,会创建 TaskSetManager,用于管理这个 TaskSet 的生命周期,并且该 TaskSetManager 会放入系统的调度池中,根据系统设置的调度算法进行调度,支持 FIFO 和 FAIR(公平调度)两种。
分配资源:DriverEndpoint 接收消息后调用 makeOffers 方法,在 TaskSchedulerImpl 的 resourceOffers 方法中要进行重要的步骤–资源分配,在分配的过程中会根据调度策略对 TaskSetManager 排序,然后依次对这些 TaskSetManager 按照就近原则分配资源,具体顺序为 PROCESS_LOCAL、NODE_LOCAL、NO_PREF、PACK_LOCAL、ANY。
发送消息告诉 Executor 去执行 Task:分配好资源的任务提交到 CoarseGrainedSchedulerBackend 的 launchTasks 方法中,在该方法中,把任务一个个发送到 Worker 节点上的 CoarseGrainedExecutorBackend,然后通过其内部的 Executor 执行任务。

sqoop

1. sqoop原理机制图。

在这里插入图片描述

2. sqoop数据处理命令

Sqoop将数据导入HDFS

$ sqoop import (generic-args) (import-args) 

下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。

$bin/sqoop import \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--table emp --m 1

导入关系表到HIVE

bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1

导入到HDFS指定目录

--target-dir <new or exist directory in HDFS>

导入emp_add表数据到’/queryresult’目录

bin/sqoop import \
--connect jdbc:mysql://hadoop-mini11:3306/hbtu \
--username root \
--password root \
--target-dir /queryresult \
--table stu--m 1

导入表数据子集

--where <condition>

导入emp_add表数据的子集

bin/sqoop import \
--connect jdbc:mysql://hadoop-mini11:3306/hbtu \
--username root \
--password root \
--where "id='rjgc'" \
--target-dir /wherequery \
--table stu_adrs --m 1

增量导入

--incremental <mode>
--check-column <column name>
--last value <last check column value>

增量增加至hdfs

bin/sqoop import \
--connect jdbc:mysql://hdp-node-01:3306/test \
--username root \
--password root \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1205

增量增加到hive

bin/sqoop import \
--connect jdbc:mysql://hadoop-mini11:3306/hbtu \
--username root \
--password root \
--table stu_adrs --hive-import --m 1 \
--incremental lastmodified \
--check-column join_date \
--last-value '2019-07-01' 

Sqoop的数据导出

$ sqoop export (generic-args) (export-args) 
bin/sqoop export \
--connect jdbc:mysql://hdp-node-01:3306/test?characterEncoding=utf-8 \
--username root \
--password root \
--table emp2 \
--export-dir /user/hadoop/emp/
--input-fields-terminated-by '\001'            hive数据库 

Sqoop作业
以下是创建Sqoop作业的语法

$ sqoop job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

$ sqoop-job (generic-args) (job-args)
   [-- [subtool-name] (subtool-args)]

创建作业
创建一个名为myjob

bin/sqoop job --create myimportjob -- import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1

验证作业

$ sqoop job --show myjob

执行作业

$ sqoop job --exec myjob
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章