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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章