列轉行
1
2
3
4
|
movie_info.tsv
《疑犯追蹤》 懸疑,動做,科幻,劇情
《Lie to me》 懸疑,警匪,動做,心理,劇情
《戰狼 2》 戰爭,動做,災難
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
1.建立表及導入數據:
hive (default)>create table movie_info(
movie string,
category array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
hive (default)> load data local inpath "movie_info.tsv" into table movie_info;
2.例如:將電影分類中的數組數據展開
select movie,category_name
from movie_info lateral view explode(category) table_tmp as category_name;
movie category_name
《疑犯追蹤> 懸疑
《疑犯追蹤> 動做
《疑犯追蹤> 科幻
《疑犯追蹤> 劇情
《Lie to me> 懸疑
《Lie to me> 警匪
《Lie to me> 動做
《Lie to me> 心理
《Lie to me> 劇情
《戰狼 2> 戰爭
《戰狼 2> 動做
《戰狼 2> 災難
lateral: 測面
explode UDTF函數(一進多出)
數組操做
「fields terminated by」:字段與字段之間的分隔符。
「collection items terminated by」:一個字段中各個子元素 item 的分隔符。
|
自定義函數描述
1)Hive 自帶了一些函數,好比:max/min等,可是數量有限,本身能夠經過自定義UDF來方便的擴展。
2)當Hive提供的內置函數沒法知足你的業務處理須要時,此時就能夠考慮使用用戶自定義函數(UDF:user-defined function)
3)根據用戶自定義函數類別分爲如下三種:
1)UDF(User-Defined-Function): 一進一出
2)UDAF(User-Defined Aggregation Function): (aggregation 彙集)彙集函數,多進一出. 相似於:count/max/min
3)UDTF(User-Defined Table-Generating Functions): 一進多出, 如lateral view explore()
4)官方文檔地址: https://cwiki.apache.org/confluence/display/Hive/HivePlugins
5)編程步驟
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
(1)繼承org.apache.hadoop.hive.ql.UDF
(2)須要實現evaluate函數;evaluate函數支持重載;
(3)在hive的命令行窗口建立函數
1.添加jar
add jar linux_jar_path
2.建立function
create [emporary] function [dbname.] function_name AS class_name;
(4)在hive的命令窗口刪除函數
drop [temporary] function [if exists] [dbname.] function_name
|
6)注意事項
1)UDF必需要有返回類型,能夠返回null,可是返回類型不能爲void;
2)UDF中經常使用Text/LongWritable等類型,不推薦使用java類型;
自定義函數開發案例
1)建立一個java工程,並建立一個lib文件夾
2)將hive的jar包解壓後,將apache-hive-1.2.1-bin\lib文件下的jar包都拷貝到java工程中。
3)建立一個類
1
2
3
4
5
6
7
8
9
10
11
|
package com.liucw.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
public String convert(final String s) {
if (s == null) {
return null;
}
return s.toString().toLowerCase();
}
}
|
4)打成jar包上傳到服務器/opt/module/jars/udf.jar
5)將jar包添加到hive的classpathhive (default)> add jar /opt/module/jars/udf.jar;
6)建立臨時函數與開發好的java class關聯hive (default)> create temporary function my_lower as "com.liucw.hive.Lower";
7)便可在hql中使用自定義的函數striphive (default)> select ename, my_lower(ename) lowername from emp;
Hive 操做
DDL數據定義
DDL(data definition language)數據庫定義語言:其實就是咱們在建立表的時候用到的一些sql,好比說:CREATE、ALTER、DROP等。
DDL主要是用在定義或改變表的結構,數據類型,表之間的連接和約束等初始化工做上
建立數據庫
數據庫在HDFS上的默認存儲路徑是/user/hive/warehouse/*.db。
1
2
3
4
5
6
7
8
|
1)建立一個數據庫
hive (default)> create database db_hive;
2)避免要建立的數據庫已經存在錯誤,增長if not exists判斷。(標準寫法)
hive (default)> create database if not exists db_hive;
3)建立一個數據庫,指定數據庫在HDFS上存放的位置
hive (default)> create database db_hive2 location '/db_hive2.db';
|
修改數據庫
用戶可使用ALTER DATABASE命令爲某個數據庫的DBPROPERTIES設置鍵-值對屬性值,來描述這個數據庫的屬性信息。
數據庫的其餘元數據信息都是不可更改的,包括數據庫名和數據庫所在的目錄位置。
1
2
3
4
5
6
|
hive (default)> alter database db_hive set dbproperties('createtime'='20170830');
// 在mysql中查看修改結果
hive> desc database extended db_hive;
db_name comment location owner_name owner_type parameters
db_hive hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db liucw USER {createtime=20170830}
|
查詢數據庫
1
2
3
4
5
6
7
8
9
|
1 顯示數據庫
1)顯示數據庫:hive> show databases;
2)過濾顯示查詢的數據庫: hive> show databases like 'db_hive*';
2 查看數據庫詳情
1)顯示數據庫信息: hive> desc database db_hive;
2)顯示數據庫詳細信息: hive> desc database extended db_hive;
3.使用數據庫: hive> use db_hive;
|
刪除數據庫
1
2
3
4
5
6
7
|
1)刪除空數據庫:hive>drop database db_hive2;
2)若是刪除的數據庫不存在,最好採用 if exists判斷數據庫是否存在
hive> drop database if exists db_hive2;
3)若是數據庫不爲空,可採用cascade命令,強制刪除
hive> drop database db_hive cascade;
|
建立表
內部表
1)理論
默認建立的表都是所謂的管理表,有時也被稱爲內部表。
由於這種表,Hive會(或多或少地)控制着數據的生命週期。
Hive默認狀況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。
當咱們刪除一個管理表時,Hive也會刪除這個表中數據。
管理表不適合和其餘工具共享數據。
2)案例實操
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
(1)普通建立表
hive >create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student2';
(2)根據查詢結果建立表(查詢的結果會添加到新建立的表中)
hive >create table if not exists student3
as select id, name from student;
(3)根據已經存在的表結構建立表,只有表結構
hive >create table if not exists student4 like student3;
(4)查詢表的類型
hive > desc formatted student2;
Table Type: MANAGED_TABLE
delimited 劃定…的界限
terminated 終止
|
外部表
1)理論
由於表是外部表,全部Hive並不是認爲其徹底擁有這份數據(hdfs上的數據)。刪除該表並不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。
2)管理表和外部表的使用場景:
天天將收集到的網站日誌按期流入HDFS文本文件。在外部表(原始日誌表)的基礎上作大量的統計分析,用到的中間表、結果表使用內部表存儲,數據經過SELECT+INSERT進入內部表。
3)案例實操
分別建立部門和員工外部表,並向表中導入數據。
1
2
3
4
5
|
dept.txt
10 ACCOUNTING 1700
20 RESEARCH 1800
30 SALES 1900
40 OPERATIONS 1700
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
(2)建表語句
// 建立部門表
create external table if not exists default.dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
// 建立員工表
create external table if not exists default.emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
(3)查看建立的表
hive (default)> show tables;
OK
tab_name
dept
emp
(4)向外部表中導入數據
// 導入數據
hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept;
hive (default)> load data local inpath '/opt/module/datas/emp.txt' into table default.emp;
// 查詢結果
hive (default)> select * from emp;
hive (default)> select * from dept;
(5)查看錶格式化數據
hive (default)> desc formatted dept;
Table Type: EXTERNAL_TABLE
|
分區表
修改表
重命名錶
1
2
3
4
5
|
(1)語法
ALTER TABLE table_name RENAME TO new_table_name
(2)實操案例
hive (default)> alter table dept_partition2 rename to dept_partition3;
|
增長、修改和刪除表【分區】
詳見分區表基本操做。
增長/修改/替換【列信息】
1)語法
更新列: ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
增長和替換列: ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
注:ADD是表明新增一字段,字段位置在全部列後面(partition列前),REPLACE則是表示替換表中全部字段。
2)實操案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
(1)查詢表結構
hive>desc dept_partition;
(2)添加列
hive (default)> alter table dept_partition add columns(deptdesc string);
hive>desc dept_partition;
(4)更新列
hive (default)> alter table dept_partition change column deptdesc desc int;
hive>desc dept_partition;
(6)替換列:所有替換,數據不會變,變的是表結構
hive (default)> alter table dept_partition replace columns(deptno string, dname string, loc string);
hive>desc dept_partition;
|
刪除表
hive (default)> drop table dept_partition;
DML數據操做
DML(data manipulation language)數據操縱語言:就是咱們最常常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用來對數據庫的數據進行一些操做。
數據導入
向表中裝載數據(Load)
1)語法
1
2
3
4
5
6
7
8
|
hive>load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student [partition (partcol1=val1,…)];
(1)load data:表示加載數據
(2)local:表示從本地加載數據到hive表;不然從HDFS加載數據到hive表
(3)inpath:表示加載數據的路徑
(4)into table:表示加載到哪張表
(5)student:表示具體的表
(6)overwrite:表示覆蓋表中已有數據,不然表示追加
(7)partition:表示上傳到指定分區
|
2)實操案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
(0)建立一張表
hive (default)> create table student(id string, name string) row format delimited fields terminated by '\t';
(1)加載本地文件到hive
hive (default)> load data local inpath '/opt/module/datas/student.txt' into table default.student;
(2)加載HDFS文件到hive中
上傳文件到HDFS
hive (default)> dfs -put /opt/module/datas/student.txt /user/liucw/hive;
加載HDFS上數據
hive (default)>load data inpath '/user/liucw/hive/student.txt' into table default.student;
(3)加載數據覆蓋表中已有的數據
上傳文件到HDFS
hive (default)> dfs -put /opt/module/datas/student.txt /user/liucw/hive;
加載數據覆蓋表中已有的數據
hive (default)>load data inpath '/user/liucw/hive/student.txt' overwrite into table default.student;
|
經過查詢語句向表中插入數據(Insert)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
1)建立一張分區表
hive (default)> create table student(id int, name string) partitioned by (month string) row format delimited fields terminated by '\t';
2)基本插入數據
hive (default)> insert into table student partition(month='201709') values(1,'wangwu');
3)基本模式插入(根據單張表查詢結果)
hive (default)> insert overwrite table student partition(month='201708')
select id, name from student where month='201709';
4)多插入模式(根據多張表查詢結果)
hive (default)> from student
insert overwrite table student partition(month='201707')
select id, name where month='201709'
insert overwrite table student partition(month='201706')
select id, name where month='201709';
|
查詢語句中建立表並加載數據(As Select)
1
2
3
4
5
6
7
|
根據查詢結果建立表(查詢的結果會添加到新建立的表中)
create table if not exists student3
as
select id, name from student;
// like是建立表結構
|
建立表時經過Location指定加載數據路徑
1)建立表,並指定在hdfs上的位置
1
2
3
4
5
|
hive (default)> create table if not exists student5(
id int, name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student5';
|
2)上傳數據到hdfs上hive (default)> dfs -put /opt/module/datas/student.txt /user/hive/warehouse/student5;
3)查詢數據hive (default)> select * from student5;
Import數據到指定Hive表中
先用export導出後,再將數據導入。hive (default)> import table student2 partition(month='201709') from '/user/hive/warehouse/export/student';
數據導出
Insert導出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1)將查詢的結果導出到本地
hive (default)> insert overwrite local directory '/opt/module/datas/export/student'
select * from student;
2)將查詢的結果格式化導出到本地
hive (default)> insert overwrite local directory '/opt/module/datas/export/student1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '\n'
select * from student;
3)將查詢的結果導出到HDFS上(沒有local)
hive (default)> insert overwrite directory '/user/liucw/hive/warehouse/student2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '\n'
select * from student;
|
Hadoop命令導出到本地
hive (default)> dfs -get /user/hive/warehouse/student/month=201709/000000_0 /opt/module/datas/export/student3.txt;
Hive Shell 命令導出
[liucw@hadoop102 hive]$ bin/hive -e 'select * from default.student;' > /opt/module/datas/export/student4.txt;
Export導出到HDFS上
hive (default)> export table default.student to '/user/hive/warehouse/export/student';
Sqoop導出
清除表中數據(Truncate)
hive (default)> truncate table student;
注意:Truncate只能刪除管理表,不能刪除外部表中數據
刪除表drop
Hive 部署
1)Hive官網地址:http://hive.apache.org/
2)文檔查看地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
3)下載地址:http://archive.apache.org/dist/hive/
4)github地址:https://github.com/apache/hive
前提
1.hadoop要先啓動
2.在HDFS上建立/tmp和/user/hive/warehouse兩個目錄並修改他們的同組權限可寫
1
2
3
4
5
|
[liucw@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir /tmp
[liucw@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir -p /user/hive/warehouse
[liucw@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /tmp
[v@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse
|
Hive安裝及配置
1)解壓到/opt/module/目錄下面
$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/
2)conf目錄
$ mv hive-env.sh.template hive-env.sh
3)配置hive-env.sh文件
1
2
|
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export HIVE_CONF_DIR=/opt/module/hive/conf
|
將本地文件導入Hive案例
需求:將/opt/module/datas/student.txt這個目錄下的數據導入到hive的student(id int, name string)表中。
1)數據準備:在/opt/module/datas/student.txt這個目錄下準備數據
1
2
3
4
5
6
7
8
9
10
11
|
1)在/opt/module/目錄下建立datas
[liucw@hadoop102 module]$ mkdir datas
2)在/opt/module/datas/目錄下建立student.txt文件並添加數據
[liucw@hadoop102 module]$ touch student.txt
[liucw@hadoop102 module]$ vi student.txt
1001 zhangshan
1002 lishi
1003 zhaoliu
注意以tab鍵間隔。
|
2)hive實際操做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[liucw@hadoop102 hive]$ bin/hive
hive>show databases;
hive>use default;
hive>show tables; // 顯示default數據庫中的表
hive> drop table student; // 刪除已建立的student
6)建立student表, 並聲明文件分隔符’\t’
hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
7)加載/opt/module/datas/student.txt 文件到student數據庫表中。
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
hive> select * from student;
OK
1001 zhangshan
1002 lishi
1003 zhaoliu
Time taken: 0.266 seconds, Fetched: 3 row(s)
|
3)遇到的問題
再打開一個客戶端窗口啓動hive,會產生java.sql.SQLException異常。緣由是,Metastore默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore;
MySql安裝
安裝包準備
1)查看mysql是否安裝,若是安裝了,卸載mysql
a)查看:rpm -qa|grep mysql
b)卸載: rpm -e –nodeps mysql-libs-5.1.73-7.el6.x86_64
2)並設置當前用戶執行權限
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@hadoop102 mysql-libs]# ll
總用量 76048
-rw-r--r--. 1 root root 18509960 3月 26 2015 MySQL-client-5.6.24-1.el6.x86_64.rpm
-rw-r--r--. 1 root root 3575135 12月 1 2013 mysql-connector-java-5.1.27.tar.gz
-rw-r--r--. 1 root root 55782196 3月 26 2015 MySQL-server-5.6.24-1.el6.x86_64.rpm
[root@hadoop102 mysql-libs]# chmod u+x ./*
[root@hadoop102 mysql-libs]# ll
總用量 76048
-rwxr--r--. 1 root root 18509960 3月 26 2015 MySQL-client-5.6.24-1.el6.x86_64.rpm
-rwxr--r--. 1 root root 3575135 12月 1 2013 mysql-connector-java-5.1.27.tar.gz
-rwxr--r--. 1 root root 55782196 3月 26 2015 MySQL-server-5.6.24-1.el6.x86_64.rpm
|
安裝MySql服務器
1)安裝mysql服務端[root@hadoop102 mysql-libs]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
2)查看產生的隨機密碼!![root@hadoop102 mysql-libs]# cat /root/.mysql_secret
OEXaQuS8IWkG19Xs
3)查看mysql狀態[root@hadoop102 mysql-libs]# service mysql status
4)啓動mysql[root@hadoop102 mysql-libs]# service mysql start
若是安裝失敗:http://www.javashuo.com/article/p-mejvzorm-gu.html
安裝MySql客戶端
1)安裝mysql客戶端[root@hadoop102 mysql-libs]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
2)連接mysql[root@hadoop102 mysql-libs]# mysql -uroot -pOEXaQuS8IWkG19Xs
3)修改密碼mysql>SET PASSWORD=PASSWORD('000000');
4)退出mysqlmysql>exit
MySql中user表中主機配置
配置只要是root用戶+密碼,在任何主機上都能登陸MySQL數據庫。
1)進入mysql
1
2
3
4
5
6
7
|
[root@hadoop102 mysql-libs]# mysql -uroot -p000000
mysql>show databases;
mysql>use mysql;
mysql>show tables;
mysql>desc user;
mysql>select User, Host, Password from user;
|
2)修改user表,把Host表內容修改成%mysql>update user set host='%' where host='localhost';
3)刪除root用戶的其餘host
1
2
3
|
mysql>delete from user where Host='hadoop102 ';
mysql>delete from user where Host='127.0.0.1';
mysql>delete from user where Host='::1';
|
4)刷新並退出mysql>flush privileges;
mysql> quit;
Hive元數據配置到MySql
驅動拷貝
1
2
3
4
5
|
1)在/opt/software/mysql-libs目錄下解壓mysql-connector-java-5.1.27.tar.gz驅動包
[root@hadoop102 mysql-libs]# tar -zxvf mysql-connector-java-5.1.27.tar.gz
2)拷貝/opt/software/mysql-libs/mysql-connector-java-5.1.27目錄下的mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/
[root@hadoop102 mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar /opt/module/hive/lib/
|
配置Metastore到MySql
1)在/opt/module/hive/conf目錄下建立一個hive-site.xml[root@hadoop102 conf]# vi hive-site.xml
2)根據官方文檔配置參數,拷貝數據到hive-site.xml文件中。
https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102: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>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<!-- mysql的密碼-->
<value>000000</value>
<description>password to use against metastore database</description>
</property>
<!--實現顯示當前數據庫,以及查詢表的頭信息配置-->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
|
3)配置完畢後,若是啓動hive異常,能夠從新啓動虛擬機。(重啓後,別忘了啓動hadoop集羣)
多窗口啓動Hive測試
1)先啓動MySQL
1
2
3
4
5
6
7
8
9
10
11
|
[liucw@hadoop102 mysql-libs]$ mysql -uroot -p000000
查看有幾個數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
|
2)再次打開多個窗口,分別啓動hive[liucw@hadoop102 hive]$ bin/hive
3)啓動hive後,回到MySQL窗口查看數據庫,顯示增長了metastore數據庫
1
2
3
4
5
6
7
8
9
10
|
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| metastore | <-----
| mysql |
| performance_schema |
| test |
+--------------------+
|
Hive命令操做
Hive基本操做
1)啓動hive $ bin/hive
2)查看數據庫: hive>show databases;
3)打開默認數據庫: hive>use default;
4)顯示default數據庫中的表: hive>show tables;
5)建立一張表: hive> create table student(id int, name string);
6)顯示數據庫中有幾張表: hive>show tables;
7)查看錶的結構: hive>desc student;
8)向表中插入數據: hive> insert into student values(1000,"ss");
9)查詢表中數據: hive> select * from student;
10)退出hive: hive> quit;
在新版的oracle中沒區別了,在之前的版本是有的:
exit:先隱性提交數據,再退出;
quit:不提交數據,退出;
11)查看在hive中輸入的全部歷史命令
(1)進入到當前用戶的根目錄/root或/home/liucw
(2)查看. hivehistory文件[liucw@hadoop102 ~]$ cat .hivehistory
12)查看hdfs文件系統: hive>dfs -ls /;
13)查看hdfs本地系統: hive>! ls /opt/module/datas;
Hive經常使用交互命令
$ bin/hive -help
hive> create table student(id int, name string) row format delimited fields terminated by ‘\t’;
1)「-e」不進入hive的交互窗口執行sql語句[liucw@hadoop102 hive]$ bin/hive -e "select id from default.student;"
2)「-f」執行腳本中sql語句
1
2
3
4
5
6
7
8
9
10
11
|
(1)在/opt/module/datas目錄下建立hivef.sql文件
[liucw@hadoop102 datas]$ touch hivef.sql
文件中寫入正確的sql語句
select *from student;
s
(2)執行文件中的sql語句
[liucw@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql
(3)執行文件中的sql語句並將結果寫入文件中
[liucw@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql > /opt/module/datas/hive_result.txt
|
Hive常見屬性配置
Hive數據倉庫位置配置
1).Default數據倉庫的最原始位置是在hdfs上的:/user/hive/warehouse路徑下
2).在倉庫目錄下,沒有對默認的數據庫default建立文件夾。若是某張表屬於default數據庫,直接在數據倉庫目錄下建立一個文件夾。
(3)修改default數據倉庫原始位置(將hive-default.xml.template以下配置信息拷貝到hive-site.xml文件中)
1
2
3
4
5
|
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
|
配置同組用戶有執行權限 bin/hdfs dfs -chmod g+w /user/hive/warehouse
顯示當前數據庫,以及查詢表的頭信息配置
1)在hive-site.xml文件中添加以下配置信息,就能夠實現顯示當前數據庫,以及查詢表的頭信息配置。
1
2
3
4
5
6
7
8
9
|
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
|
2)從新啓動hive,對比配置先後差別
1
2
3
4
5
6
7
8
9
10
|
1)配置前
hive> select * from student
1001 xiaoli
1002 libingbing
2)配置後
hive(db_hive)> select * from student
student.id student.name
1001 xiaoli
1002 libingbing
|
Hive運行日誌信息配置
1)Hive的log默認存放在/tmp/liucw/hive.log目錄下(當前用戶名下)
2)修改hive的log存放日誌到/opt/module/hive/logs
1
2
3
4
5
6
7
8
9
10
|
(1)修改/opt/module/hive/conf/hive-log4j.properties.template文件名稱爲hive-log4j.properties
[liucw@hadoop102 conf]$ pwd
/opt/module/hive/conf
[liucw@hadoop102 conf]$ mv hive-log4j.properties.template hive-log4j.properties
(2)在hive-log4j.properties文件中修改log存放位置
hive.log.dir=/opt/module/hive/logs
|
Kafka Manager部署安裝
先安裝sbt
1.下載網頁http://www.scala-sbt.org/download.html
2.解壓並建立腳本
1
2
3
4
5
6
7
8
9
10
|
$ tar zxvf /media/psf/Home/Documents/install_jar/sbt-1.2.8.tgz -C /opt/module/
[liucw@localhost sbt]$ pwd /opt/module/sbt
[liucw@localhost sbt]$ vim sbt
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar /opt/module/sbt/bin/sbt-launch.jar "$@"
/×修改sbt文件權限×/
[liucw@localhost sbt]$ chmod u+x sbt
|
3.配置PATH環境變量,保證在控制檯中可以使用sbt命令
1
2
3
4
5
6
|
$ vim /etc/profile
# sbt
export PATH=/opt/module/sbt/:$PATH
/*使配置文件馬上生效*/
$ source /etc/profile
|
4.測試sbt是否安裝成功
第一次執行時,會下載一些包,而後才能正常使用
$ sbt version
Kafka Manager 部署
重編譯
1.Git或者直接從Releases中下載:https://github.com/yahoo/kafka-manager/releases
2.解壓$ tar -zxvf /media/psf/Home/Documents/install_jar/kafka-manager-1.3.3.18.tar.gz -C /opt/module/
3.重編譯
1
2
3
4
5
6
|
[liucw@hadoop102 kafka-manager-1.3.3.18]$./sbt clean dist
[info] Your package is ready in /opt/module/kafka-manager-1.3.3.18/target/universal/kafka-manager-1.3.3.18.zip
[info]
[success] Total time: 1960 s, completed Feb 18, 2019 11:09:53 AM
[liucw@hadoop102 module]$ mv kafka-manager-1.3.3.18/ bak_kafka-manager-1.3.3.18
|
用重編譯的包
1.解壓
[liucw@hadoop102 module]$ unzip /media/psf/Home/Documents/install_jar/kafka-manager-1.3.3.18.zip -d /opt/module/
2.修改conf/application.properties
修改kafka-manager.zkhosts列表爲本身的zk節點
manager.zkhosts="hadoop102:2181,hadoop103:2181,hadoop104:2181"
3啓動
nohup bin/kafka-manager &
啓動完畢後能夠查看端口是否啓動,因爲啓動過程須要一段時間,端口起來的時間可能會延後。
nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=8080 &
默認的端口是9000,可經過 -Dhttp.port,指定端口;
-Dconfig.file=conf/application.conf指定配置文件:
4.瀏覽器訪問
http://hadoop102:9000/
若是啓動時有設置端口,這裏的端口也要修改
Kafka 命令行操做
發送消息
1
2
3
4
5
6
|
[liucw@hadoop102 kafka]$ bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 \
--topic first
>hello world
>hello liucw
|
消費消息
1
2
3
4
5
6
|
[liucw@hadoop103 kafka]$ bin/kafka-console-consumer.sh \
--zookeeper hadoop102:2181 \
--from-beginning \
--topic first
--from-beginning:會把first主題中以往全部的數據都讀取出來。根據業務場景選擇是否增長該配置。
|
查看某個Topic的詳情
1
2
3
4
|
[liucw@hadoop102 kafka]$ bin/kafka-topics.sh \
--zookeeper hadoop102:2181 \
--describe \
--topic first
|
查看.log或者.index文件內容
1
2
3
4
5
6
7
8
|
bin/kafka-run-class.sh kafka.tools.DumpLogSegments \
--files /tmp/kafka-logs/test3-0/00000000000000000000.log \
--print-data-log
# 驗證日誌片斷00000.log索引文件的正確性
bin/kafka-run-class.sh kafka.tools.DumpLogSegments \
--files /tmp/kafka-logs/test3-0/00000000000000000000.log,/tmp/kafka-logs/test3-0/00000000000000000000.index \
--index-sanity-check
|
Topic操做
建立topic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[liucw@hadoop102 kafka]$ bin/kafka-topics.sh \
--zookeeper hadoop102:2181 \
--create \
--topic first \
--replication-factor 3 \
--partitions 1
選項說明:
--topic 定義topic名
--replication-factor 定義副本數
--partitions 定義分區數
[liucw@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 \
--create \
--topic second \
--replication-factor 3 \
--partitions 3
|
增長分區
1
2
3
4
5
6
7
8
|
[liucw@hadoop102 kafka]$ bin/kafka-topics.sh \
--zookeeper hadoop102:2181 \
--alter \
--topic first \
--partitions 3 # 將分區數量增長到3
這裏使用--if-exists參數,主題不存在的錯誤就會被忽略,不建議使用
|
減小分區數量
咱們沒法減小主題的分區數量。
由於若是刪除了分區,分區裏的數據也一併被刪除,致使數據不一致,咱們也沒法將這些數據分配給其餘分區,由於這樣作很難,並且會出現消息亂序。
因此,若是必定要減小分區數量,只能刪除整個主題,而後從新建立它
刪除topic
1
2
3
4
5
6
7
8
|
[liucw@hadoop102 kafka]$ bin/kafka-topics.sh \
--zookeeper hadoop102:2181 \
--delete \
--topic first
須要server.properties中設置delete.topic.enable=true不然只是標記刪除或者直接重啓。
刪除主題會丟棄主題裏的全部數據。這是一個不可逆的操做,因此在執行時要十分當心。
|
查看當前服務器中的全部topic
1
2
3
|
[cw@hadoop102 kafka]$ bin/kafka-topics.sh \
--zookeeper hadoop102:2181 \
--list
|
列出主題詳情信息
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[cw@hadoop102 kafka]$ bin/kafka-topics.sh \
--zookeeper hadoop102:2181 \
--describe
describe命令還提供了一些參數,用於過濾輸出結果
--topic:指定特定的主題
下面兩個參數可找出問題的分區:
--under-replicated-partitions: 列出全部包含不一樣步副本的分區
--unavailable-partitions:列出全部沒有首領的分區,這些分區已經處於離線狀態,對於生產者和消費者來講是必不可用的。
這些參數沒法與list命令一塊兒使用
|
消費者羣組
保存消費者羣組信息的地方
對舊版本的消費者來講,它們的信息保存在Zookeeper上;
對新版本的消費者來講,它們的信息保存在broker上
列出羣組
1
2
3
4
5
6
7
8
9
10
11
|
# 列出舊版本的消費都羣組
$ bin/kafka-consumer-groups.sh \
--zookeeper hadoop102:2181 \
--list
# 列出新版本的消費都羣組
$ bin/kafka-consumer-groups.sh \
--new-consumer \
--bootstrap-server hadoop102:2181/kafka-cluster \
--list
|
描述羣組
1
2
3
4
5
6
7
8
|
使用--describe代替--list
--group 指定特定的羣組
如,獲取舊版本消費者羣組信息
$ bin/kafka-consumer-groups.sh \
--zookeeper hadoop102:2181/kafka-cluster \
--describe \
--group testgroup
|
輸出結果中的字段
group: 消費者羣組的名字
topic: 正在被讀取的主題名字
partition: 正在被讀取的分區ID
current-offset: 消費者羣組最近提交的偏移盞, 也就是消費者在分區裏讀取的當前位置
log-end-offset: 當前高水位偏移量, 也就是最近一個被讀取消息的偏移量,同時也是最近一個被提 交到集羣的偏移是
lag: 消費者的 CURRENT-OFFSET 和 broker 的 LOG-END-OFFSET 之間的 差距
owner: 消費者羣組裏正在讀取該分區的消費者。這是一個消費者的 田, 不必定包含消費 者的主機名
刪除羣組
只有舊版本的消費者客戶端才支持刪除羣組操做。在進行刪除操做以前,須要先關閉消費者,或者不要讓它們讀取即將被刪除的主題
Kafka 集羣部署
1).3臺主機分別關閉防火牆:chkconfig iptables off
2).安裝jdk
3).安裝Zookeeper
1)解壓安裝包[liucw@hadoop102 software]$ tar -zxvf kafka_2.11-0.11.0.0.tgz -C /opt/module/
2)修改解壓後的文件名稱[liucw@hadoop102 module]$ mv kafka_2.11-0.11.0.0/ kafka
3)在/opt/module/kafka目錄下建立logs文件夾[liucw@hadoop102 kafka]$ mkdir logs
4)修改配置文件[liucw@hadoop102 config]$ vi config/server.properties
輸入如下內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
##### server basic ###
#broker的全局惟一編號,不能重複
broker.id=0
#是否容許刪除topic
delete.topic.enable=true
num.network.threads=3 #處理網絡請求的線程數量
num.io.threads=8 #用來處理磁盤IO的線程數量
socket.send.buffer.bytes=102400 #發送套接字的緩衝區大小
socket.receive.buffer.bytes=102400 #接收套接字的緩衝區大小
socket.request.max.bytes=104857600 #請求套接字的最大緩衝區大小
#kafka運行日誌存放的路徑
log.dirs=/opt/module/kafka/logs
num.partitions=1 #topic在當前broker上的分區個數
num.recovery.threads.per.data.dir=1 #用來恢復和清理data下數據的線程數量
log.retention.hours=168 #segment文件保留的最長時間,超時將被刪除
#配置鏈接Zookeeper集羣地址
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181
|
5)配置環境變量
1
2
3
4
5
6
|
[root@hadoop102 module]# vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
[root@hadoop102 module]# source /etc/profile
|
6)分發安裝包
1
2
|
[root@hadoop102 etc]# xsync profile
[liucw@hadoop102 module]$ xsync kafka/
|
7)分別在hadoop103和hadoop104上修改配置文件/opt/module/kafka/config/server.properties中的broker.id=一、broker.id=2
注:broker.id不得重複
8)啓動集羣
在後臺依次在hadoop10二、hadoop10三、hadoop104節點上啓動kafka
1
2
3
4
5
|
[liucw@hadoop102 kafka]$ bin/kafka-server-start.sh config/server.properties &
[liucw@hadoop103 kafka]$ bin/kafka-server-start.sh config/server.properties &
[liucw@hadoop104 kafka]$ bin/kafka-server-start.sh config/server.properties &
bin/kafka-server-start.sh -daemon ../config/server.properties
|
9)關閉集羣
1
2
3
|
[liucw@hadoop102 kafka]$ bin/kafka-server-stop.sh stop
[liucw@hadoop103 kafka]$ bin/kafka-server-stop.sh stop
[liucw@hadoop104 kafka]$ bin/kafka-server-stop.sh stop
|
Hadoop 徹底分佈式部署
前期準備
SSH無密碼登陸
1)ssh鏈接時出現Host key verification failed
1
2
3
4
5
6
7
|
[liucw@hadoop102 opt] $ ssh 192.168.1.103
The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.
直接輸入yes後,再輸入密碼,能夠經過
|
2)無密鑰配置
1
2
3
4
5
6
7
8
9
10
11
|
(1)進入到個人家目錄
[liucw@hadoop102 opt]$ cd ~/.ssh
(2)生成公鑰和私鑰:
[liucw@hadoop102 .ssh]$ ssh-keygen -t rsa
而後敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
(3)將公鑰拷貝到要免密登陸的目標機器上
[liucw@hadoop102 .ssh]$ ssh-copy-id hadoop103
[liucw@hadoop102 .ssh]$ ssh-copy-id hadoop104
|
3).ssh文件夾下的文件功能解釋
1)~/.ssh/known_hosts :記錄ssh訪問過計算機的公鑰(public key)
2)id_rsa :生成的私鑰
3)id_rsa.pub :生成的公鑰
4)authorized_keys :存放受權過得無祕登陸服務器公鑰
腳本xsync:利用rsync命令編寫集羣分發
rsync 與 scp
1).rsync
-r 遞歸rsync -rvl /opt/tmp root@hadoop103:/opt
2).scpscp -r root@hadoop101:/opt/software root@hadoop102:/opt/
3).rsync和scp區別
rsync作文件的複製要比scp的速度快,rsync只對差別文件作更新。
scp是把全部文件都複製過去。
集羣分發腳本xsync
1.需求
1.需求分析:循環複製文件到全部節點的相同目錄下。
2.原始拷貝:rsync -rvl /opt/module root@hadoop103:/opt/
3.在/usr/local/bin這個目錄下存放的腳本,能夠在系統任何地方直接執行。
2.編寫腳本
1).在/usr/local/bin目錄下建立xsync文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#!/bin/bash
#1 獲取輸入參數個數,若是沒有參數,直接退出
param_count=$#
if test $[param_count] -eq 0; then
echo no args;
exit;
fi
#2 獲取文件名稱
p1=$1
filename=`basename ${p1}`
echo filename=${filename}
#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 獲取當前用戶名稱
user=`whoami`
#5 循環
for((host=103; host<105; host++)); do
# echo ${pdir}/${filename} ${user}@hadoop${host}:${pdir}
echo --------------- hadoop${host} ----------------
rsync -rvl ${pdir}/${filename} ${user}@hadoop${host}:${pdir}
done
|
2).修改腳本 xsync 具備執行權限
[root@hadoop102 bin]# chmod 777 xsync
[root@hadoop102 bin]# chown liucw:liucw xsync
3).測試
[liucw@hadoop102 opt]$ xsync tmp/
結果會有另外兩臺機器上看到複製成功!
腳本xcall:在全部主機上同時執行相同的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
1.在/usr/local/bin目錄下建立xcall文件
[root@hadoop102 bin]# touch xcall
[root@hadoop102 bin]# vi xcall
#!/bin/bash
pcount=$#
if((pcount==0));then
echo no args;
exit;
fi
echo -------------localhost----------
$@
for((host=102; host<=104; host++)); do
echo ----------hadoop$host---------
ssh hadoop$host $@
done
2.修改腳本 xcall 具備執行權限
[root@hadoop102 bin]# chmod 777 xcall
[root@hadoop102 bin]# chown liucw:liucw xcall
3.測試: xcall+操做命令
[root@hadoop102 ~]# xcall rm -rf /opt/tmp/
|
配置集羣
規劃集羣
1.生產環境NameNode與SecondaryNameNode要單獨放到一臺服務器上,測試數據少能夠放一塊兒.
2.ResourceManager也很耗資源,須要跟NameNode,SecondaryNameNode在不一樣的服務器上
1
2
3
4
5
|
hadoop102 hadoop103 hadoop104
NameNode
DataNode DataNode DataNode
ResourceManager
NodeManager NodeManager NodeManager
|
配置文件
[liucw@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[liucw@hadoop102 hadoop]$ vi core-site.xml
<!-- 指定HDFS中NameNode的地址,hadoop2.5的默認端口爲8020 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- hadoop運行時產生文件的存儲目錄 ,可指定多個 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
<!-- ++++++++++++++++ Oozie 配置 ++++++++++++++++ -->
<!-- 能夠不配置-->
<!-- Oozie Server 的 Hostname -->
<property>
<name>hadoop.proxyuser.liucw.hosts</name>
<!-- 能夠指定用戶 -->
<value>*</value>
</property>
<!-- 默認是不容許操做Oozie的 -->
<!-- 容許被 Oozie 代理的用戶組 -->
<property>
<name>hadoop.proxyuser.liucw.groups</name>
<value>*</value>
</property>
|
Hdfs配置
1)hadoop-env.shexport JAVA_HOME=/opt/module/jdk1.8.0_181
2)slaves
1
2
3
|
hadoop102
hadoop103
hadoop104
|
不能寫一行,不一樣回車多一行
3)hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<!-- 指定HDFS副本的數量,本地測試值爲1就好了,節約空間 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 若是不配置,secondary會跟NameNode在同一臺服務器-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:50070</value>
</property>
<!-- 瀏覽hdfs,UI網站展現用的 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
|
yarn配置
1)yarn-env.shexport JAVA_HOME=/opt/module/jdk1.8.0_181
2)yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<!-- reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!— 日誌彙集:應用運行完成後,將日誌信息上傳到HDFS系統上-->
<!-- 日誌彙集功能開啓 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日誌保留時間設置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 任務歷史服務 頁面配置:這個19888跟mapred-site.xml的要一致 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs/</value>
</property>
<!-- 防止在執行mapReduce時內存溢出 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
|
mapreduce配置
1)mapred-env.shexport JAVA_HOME=/opt/module/jdk1.8.0_181
2)mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[liucw@hadoop102 hadoop]$ mv mapred-site.xml.template mapred-site.xml
[liucw@hadoop102 hadoop]$ vi mapred-site.xml
<!-- 指定mr運行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置 MapReduce JobHistory Server 地址 ,默認端口10020 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 配置 MapReduce JobHistory Server web ui 地址, 默認端口19888 ,這個端口跟yarn-site.xml一致-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
|
在集羣上分發以上全部文件
1
2
3
4
5
6
7
|
[liucw@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[liucw@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
[liucw@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
[liucw@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/slaves
……
|
集羣啓動及測試
補充:hadoop-cdh版本的lib/native是空的,須要從正常的下複製過來,否則啓動不了
若是集羣是第一次啓動,須要格式化namenode。
若是刪除logs/ data/了,也要格式化
啓動hdfs並測試
1.啓動
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[liucw@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[liucw@hadoop102 hadoop-2.7.2]$ jps
4166 NameNode
4482 Jps
4263 DataNode
[liucw@hadoop103 hadoop-2.7.2]$ jps
3218 DataNode
3288 Jps
[liucw@hadoop104 hadoop-2.7.2]$ jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps
|
2.測試
1
2
3
4
|
[liucw@hadoop102 hadoop-2.7.2]$ vim testdata.txt
[liucw@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put testdata.txt /
bin/hdfs dfs -rm /testdata.txt
|
在http://hadoop102:50070/explorer.html#/可看到數據即成功
啓動yarn並測試
1.啓動
[liucw@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
2.測試
[liucw@hadoop102 hadoop-2.7.2]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /testdata.txt /output
1.yarn的瀏覽器頁面查看:http://hadoop103:8088/cluster
2.hdfs: 在http://hadoop102:50070/explorer.html#/ 可看到數據即成功
3.歷史服務和日誌的彙集查看 http://hadoop102:19888/jobhistory
啓動歷史服務並測試
[liucw@hadoop103 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
http://hadoop103:8088/cluster的history打開有頁面即成功
默認端口及瀏覽器頁面查看
1.默認端口及其含義
1)fs.defaultFS:8020 或者9000
2)dfs.namenode.http-address:50070
3)dfs.datanode.address:50010
4)SecondaryNameNode輔助名稱節點端口號:50090
5)yarn.resourcemanager.webapp.address:8088
6) yarn歷史服務器19888
2.瀏覽器頁面查看
1)hdfs的瀏覽器頁面查看:http://hadoop102:50070/explorer.html#/
2)yarn的瀏覽器頁面查看:http://hadoop103:8088/cluster
3)歷史服務和日誌的彙集查看 http://hadoop102:19888/jobhistory
集羣時間同步
時間同步的方式:找一個機器,做爲時間服務器,全部的機器與這臺集羣時間進行定時的同步,好比,每隔十分鐘,同步一次時間。
配置時間同步實操:
時間服務器配置(必須root用戶)
(1)檢查ntp是否安裝
1
2
3
4
|
[root@hadoop102 桌面]# rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
|
(2)修改ntp配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@hadoop102 桌面]# vi /etc/ntp.conf
修改內容以下
a)修改1(設置本地網絡上的主機不受限制。)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap爲
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(設置爲不採用公共的服務器)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst爲
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(添加默認的一個內部時鐘數據,使用它爲局域網用戶提供服務。)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
|
(3)修改/etc/sysconfig/ntpd 文件
1
2
3
|
[root@hadoop102 桌面]# vim /etc/sysconfig/ntpd
增長內容以下(讓硬件時間與系統時間一塊兒同步)
SYNC_HWCLOCK=yes
|
(4)從新啓動ntpd
1
2
3
4
5
|
[root@hadoop102 桌面]# service ntpd status
ntpd 已停
[root@hadoop102 桌面]# service ntpd start
正在啓動 ntpd:
|
(5)執行:[root@hadoop102 桌面]# chkconfig ntpd on
其餘機器配置(必須root用戶)
1
2
3
4
5
6
7
8
9
10
|
(1)在其餘機器配置10分鐘與時間服務器同步一次
[root@hadoop103 hadoop-2.7.2]# crontab -e (回車)
編寫腳本
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意機器時間
[root@hadoop103 hadoop]# date -s "2017-9-11 11:11:11"
(3)十分鐘後查看機器是否與時間服務器同步
[root@hadoop103 hadoop]# date
|
配置集羣常見問題
1)防火牆沒關閉、或者沒有啓動yarn
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)ssh沒有配置好
root用戶,爲了使用xsync腳本
liucw用戶,爲了集羣啓動
3)root用戶和liucw兩個用戶啓動集羣不統一
4)datanode不被namenode識別問題
Namenode在format初始化的時候會造成兩個標識,blockPoolId和clusterId。新的datanode加入時,會獲取這兩個標識做爲本身工做目錄中的標識。
一旦namenode從新format後,namenode的身份標識已變,而datanode若是依然持有原來的id,就不會被namenode識別。
解決辦法,刪除datanode節點中的數據後,再次從新格式化namenode。
6)datanode和namenode進程同時只能工做一個
1)第一次啓動時沒有問題
2)第二次啓動時,原來的datanode數據並無刪除掉,它在與新namenode通訊時鏈接不上。致使集羣不能正常啓動。
3)解決辦法:在格式化以前,刪除datanode裏面的信息(默認在/tmp,若是配置了該目錄,那就去你配置的目錄下刪除數據)
7)jps發現進程已經沒有,可是從新啓動集羣,提示進程已經開啓
緣由是在linux的根目錄下/tmp目錄中存在啓動的進程臨時文件,將集羣相關進程刪除掉,再從新啓動集羣。
8)8088端口鏈接不上
1
2
3
4
5
|
vi /etc/hosts
註釋掉以下代碼
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102
|
9)錯誤Name node is in safe mode的解決方法?
將本地文件拷貝到hdfs上去,結果上錯誤:Name node is in safe mode
這是由於在分佈式文件系統啓動的時候,開始的時候會有安全模式,當分佈式文件系統處於安全模式的狀況下,文件系統中的內容不容許修改也不容許刪除,直到安全模式結束。安全模式主要是爲了系統啓動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的複製或者刪除部分數據塊。運行期經過命令也能夠進入安全模式。在實踐過程當中,系統啓動的時候去修改和刪除文件也會有安全模式不容許修改的出錯提示,只須要等待一下子便可。
能夠經過如下命令來手動離開安全模式:
bin/hadoop dfsadmin -safemode leave
用戶能夠經過dfsadmin -safemode value 來操做安全模式,參數value的說明以下:
enter -進入安全模式
leave -強制NameNode離開安全模式
get -返回安全模式是否開啓的信息
wait -等待,一直到安全模式結束。
10) 各個datanode的storageID不同,致使啓動datanode不成功
刪除data/tmp/dfs/data/current目錄
Hadoop 運行環境搭建
虛擬機網絡模式設置爲NAT
克隆虛擬機
修改成靜態ip
1)修改IP地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[liucw@hadoop102 hadoop]$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
#BOOTPROTO=dhcp
# 從dhcp改爲static
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=9410076c-bee9-4886-af6c-537c17bcfee0
DEVICE=eth0
ONBOOT=yes
# 設置IP地址
IPADDR=192.168.1.102
# 設置子網掩碼
NETMASK=255.255.255.0
# 設置網關
GATEWAY=192.168.1.1
|
若是不用static, 就能夠聯網
2)執行[root@hadoop102 /]# service network restart
3)若是報錯,reboot,重啓虛擬機。[root@hadoop102 /]# reboot
修改主機名
1
2
3
4
|
vi /etc/hosts
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
|
關閉防火牆
1.iptables防火牆
1)查看防火牆開機啓動狀態: chkconfig iptables –list
2)關閉防火牆:
service iptables stop (臨時關閉防火牆)
chkconfig iptables off (關閉防火牆開機啓動)
2.firewall防火牆:
查看防火牆規則 firewall-cmd –list-all
systemctl stop firewalld.service(關閉防火牆)
systemctl disable firewalld.service(防火牆開機禁用)
3.vi /etc/sysconfig/selinux 將設置改成禁用:
SELINUX=disabled
在opt目錄下建立文件
1)建立liucw用戶
在root用戶裏面執行以下操做
1
2
|
[root@hadoop101 opt]# adduser liucw
[root@hadoop101 opt]# passwd liucw
|
2)設置liucw用戶具備root權限
修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,以下所示:
1
2
3
4
|
[root@hadoop101 liucw]# vi /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
liucw ALL=(ALL) ALL
|
修改完畢,如今能夠用liucw賬號登陸,而後用命令 su - ,便可得到root權限進行操做。
3)在/opt目錄下建立文件夾
(1)在root用戶下建立module、software文件夾
1
2
|
[root@hadoop101 opt]# mkdir module
[root@hadoop101 opt]# mkdir software
|
(2)修改module、software文件夾的全部者
1
2
3
4
|
[root@hadoop101 opt]# chown liucw:liucw module
[root@hadoop101 opt]# chown liucw:liucw sofrware
[root@hadoop101 opt]# ls -al
總用量 16
|
安裝jdk
1)卸載現有jdk
(1)查詢是否安裝java軟件:[root@hadoop101 opt]# rpm -qa|grep java
(2)若是安裝的版本低於1.7,卸載該jdk:[root@hadoop101 opt]# rpm -e 軟件包
2)解壓jdk到/opt/module目錄下[root@hadoop101software]# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
3)配置jdk環境變量
(1)打開配置/etc/profile文件:
1
2
3
4
|
[root@hadoop101 jdk1.8.0_144]# vi /etc/profile
##JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
|
(2)讓修改後的文件生效:[root@hadoop101 jdk1.7.0_79]# source /etc/profile
4)測試jdk安裝成功
[root@hadoop101 jdk1.8.0_144]# java -version
java version 「1.8.0_144」
(若是java –version不能夠用就要重啓):
[root@hadoop101 jdk1.8.0_144]# sync
[root@hadoop101 jdk1.8.0_144]# reboot
安裝Hadoop
1)解壓安裝文件到/opt/module下面
[root@hadoop101 software]# tar -zxf hadoop-2.7.2.tar.gz -C /opt/module/
2)在/opt/module/hadoop-2.7.2/etc/hadoop路徑下配置hadoop-env.sh
(1)Linux系統中獲取jdk的安裝路徑:
$ echo $JAVA_HOME
/opt/module/jdk1.8.0_144
(2)修改hadoop-env.sh文件中JAVA_HOME 路徑:
[root@hadoop101 hadoop]# vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
3)將hadoop添加到環境變量
(1)打開/etc/profile文件:
1
2
3
4
5
|
root@ hadoop101 hadoop-2.7.2]# vi /etc/profile
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
|
(2)讓修改後的文件生效:
root@ hadoop101 hadoop-2.7.2]# source /etc/profile
(3)重啓(若是hadoop命令不能用再重啓):
hadoop version
[root@ hadoop101 hadoop-2.7.2]# sync
[root@ hadoop101 hadoop-2.7.2]# reboot
4)修改/opt目錄下的全部文件全部者爲 liucw
[root@hadoop101 opt]# chown liucw:liucw -R /opt/
5)切換到liucw 用戶
[root@hadoop101 opt]# su liucw
Hadoop 編譯源碼
前期準備工做
1)CentOS聯網
配置CentOS能鏈接外網。Linux虛擬機ping www.baidu.com 是暢通的
注意:採用root角色編譯,減小文件夾權限出現問題
2)jar包準備(hadoop源碼、JDK7 、 maven、 ant 、protobuf)
(1)hadoop-2.7.2-src.tar.gz
(2)jdk-8u144-linux-x64.tar.gz
(3)apache-ant-1.9.9-bin.tar.gz
(4)apache-maven-3.0.5-bin.tar.gz
(5)protobuf-2.5.0.tar.gz
jar包安裝
0)注意:全部操做必須在root用戶下完成
1)JDK解壓、配置環境變量 JAVA_HOME和PATH,驗證java-version(以下都須要驗證是否配置成功)
1
2
3
4
5
6
7
8
9
|
[root@hadoop101 software] # tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/
[root@hadoop101 software]# vi /etc/profile
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
[root@hadoop101 software]#source /etc/profile
驗證命令:java -version
|
2)Maven解壓、配置 MAVEN_HOME和PATH。
1
2
3
4
5
6
7
8
|
[root@hadoop101 software]# tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
[root@hadoop101 apache-maven-3.0.5]# vi /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
[root@hadoop101 software]#source /etc/profile
驗證命令:mvn -version
|
3)ant解壓、配置 ANT _HOME和PATH
1
2
3
4
5
6
7
8
|
[root@hadoop101 software]# tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
[root@hadoop101 apache-ant-1.9.9]# vi /etc/profile
#ANT_HOME
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin
[root@hadoop101 software]#source /etc/profile
驗證命令:ant -version
|
4)安裝 glibc-headers 和 g++ 命令以下:
1
2
|
[root@hadoop101 apache-ant-1.9.9]# yum install glibc-headers
[root@hadoop101 apache-ant-1.9.9]# yum install gcc-c++
|
5)安裝make和cmake
1
2
|
[root@hadoop101 apache-ant-1.9.9]# yum install make
[root@hadoop101 apache-ant-1.9.9]# yum install cmake
|
6)解壓protobuf ,進入到解壓後protobuf主目錄,/opt/module/protobuf-2.5.0
而後相繼執行命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@hadoop101 software]# tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
[root@hadoop101 opt]# cd /opt/module/protobuf-2.5.0/
[root@hadoop101 protobuf-2.5.0]#./configure
[root@hadoop101 protobuf-2.5.0]# make
[root@hadoop101 protobuf-2.5.0]# make check
[root@hadoop101 protobuf-2.5.0]# make install
[root@hadoop101 protobuf-2.5.0]# ldconfig
[root@hadoop101 hadoop-dist]# vi /etc/profile
#LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH
[root@hadoop101 software]#source /etc/profile
驗證命令:protoc --version
|
7)安裝openssl庫[root@hadoop101 software]#yum install openssl-devel
8)安裝 ncurses-devel庫:[root@hadoop101 software]#yum install ncurses-devel
到此,編譯工具安裝基本完成。
編譯源碼
1)解壓源碼到/opt/目錄[root@hadoop101 software]# tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
2)進入到hadoop源碼主目錄
1
2
|
[root@hadoop101 hadoop-2.7.2-src]# pwd
/opt/hadoop-2.7.2-src
|
3)經過maven執行編譯命令[root@hadoop101 hadoop-2.7.2-src]#mvn package -Pdist,native -DskipTests -Dtar
等待時間30分鐘左右,最終成功是所有SUCCESS。
4)成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下。
1
2
|
[root@hadoop101 target]# pwd
/opt/hadoop-2.7.2-src/hadoop-dist/target
|
常見的問題及解決方案
1)MAVEN install時候JVM內存溢出
處理方式:在環境配置文件和maven的執行文件都可調整MAVEN_OPT的heap大小。(詳情查閱MAVEN 編譯 JVM調優問題,如:http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method)
2)編譯期間maven報錯。可能網絡阻塞問題致使依賴庫下載不完整致使,屢次執行命令(一次經過比較難):
[root@hadoop101 hadoop-2.7.2-src]#mvn package -Pdist,native -DskipTests -Dtar
3)報ant、protobuf等錯誤,插件下載未完整或者插件版本問題,最開始連接有較多特殊狀況,同時推薦
2.7.0版本的問題彙總帖子 http://www.tuicool.com/articles/IBn63qf
Zookeeper 客戶端命令行
操做zookeeper
1)啓動zookeeper[liucw@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
2)查看進程是否啓動
1
2
3
|
[liucw@hadoop102 zookeeper-3.4.10]$ jps
4020 Jps
4001 QuorumPeerMain
|
3)查看狀態:
1
2
3
4
|
[liucw@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: standalone # 單結點,就是本地模式運行
|
4)啓動客戶端:[liucw@hadoop102 zookeeper-3.4.10]$ bin/zkCli.sh
5)退出客戶端:[zk: localhost:2181(CONNECTED) 0] quit
6)中止zookeeper[liucw@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh stop
客戶端命令行操做
1)啓動客戶端[liucw@hadoop103 zookeeper-3.4.10]$ bin/zkCli.sh
2)顯示全部操做命令:help[zk: localhost:2181(CONNECTED) 1] help
3)查看當前znode中所包含的內容: ls
1
2
|
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
|
4)查看當前節點數據並能看到更新次數等數據: ls2
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[zk: localhost:2181(CONNECTED) 1] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
|
5)建立普通節點:create
1
2
3
4
5
|
[zk: localhost:2181(CONNECTED) 2] create /app1 "hello app1"
Created /app1
[zk: localhost:2181(CONNECTED) 4] create /app1/server101 "192.168.1.101"
Created /app1/server101
|
6)得到節點的值: get
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[zk: localhost:2181(CONNECTED) 6] get /app1
hello app1
cZxid = 0x20000000a
ctime = Mon Jul 17 16:08:35 CST 2017
mZxid = 0x20000000a
mtime = Mon Jul 17 16:08:35 CST 2017
pZxid = 0x20000000b
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 1
[zk: localhost:2181(CONNECTED) 8] get /app1/server101
192.168.1.101
cZxid = 0x20000000b
ctime = Mon Jul 17 16:11:04 CST 2017
mZxid = 0x20000000b
mtime = Mon Jul 17 16:11:04 CST 2017
pZxid = 0x20000000b
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 0
|
7)建立短暫節點: create -e
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[zk: localhost:2181(CONNECTED) 9] create -e /app-emphemeral 8888
(1)在當前客戶端是能查看到的
[zk: localhost:2181(CONNECTED) 10] ls /
[app1, app-emphemeral, zookeeper]
(2)退出當前客戶端而後再重啓啓動客戶端
[zk: localhost:2181(CONNECTED) 12] quit
[liucw@hadoop104 zookeeper-3.4.10]$ bin/zkCli.sh
(3)再次查看根目錄下短暫節點已經刪除
[zk: localhost:2181(CONNECTED) 0] ls /
[app1, zookeeper]
|
8)建立帶序號的節點:create -s
編號默認是有000開始的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
(1)先建立一個普通的根節點app2
[zk: localhost:2181(CONNECTED) 11] create /app2 "app2"
(2)建立帶序號的節點
[zk: localhost:2181(CONNECTED) 13] create -s /app2/aa 888
Created /app2/aa0000000000
[zk: localhost:2181(CONNECTED) 14] create -s /app2/bb 888
Created /app2/bb0000000001
[zk: localhost:2181(CONNECTED) 15] create -s /app2/cc 888
Created /app2/cc0000000002
若是原節點下有1個節點,則再排序時從1開始,以此類推。
[zk: localhost:2181(CONNECTED) 16] create -s /app1/aa 888
Created /app1/aa0000000001
|
9)修改節點數據值:set[zk: localhost:2181(CONNECTED) 2] set /app1 999
10)節點的值變化監聽:watch
只會監聽一次
WatchedEvent state:SyncConnected type:NodeDataChanged path:/app1
1
2
3
4
5
6
7
8
9
|
(1)在104主機上註冊監聽/app1節點數據變化
[zk: localhost:2181(CONNECTED) 26] get /app1 watch
(2)在103主機上修改/app1節點的數據
[zk: localhost:2181(CONNECTED) 5] set /app1 777
(3)觀察104主機收到數據變化的監聽
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/app1
|
11)節點的子節點變化監聽(路徑變化)
只會監聽一次
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/app1
1
2
3
4
5
6
7
8
9
10
11
|
(1)在104主機上註冊監聽/app1節點的子節點變化
[zk: localhost:2181(CONNECTED) 1] ls /app1 watch
[aa0000000001, server101]
(2)在103主機/app1節點上建立子節點
[zk: localhost:2181(CONNECTED) 6] create /app1/bb 666
Created /app1/bb
(3)觀察104主機收到子節點變化的監聽
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/app1
|
12)刪除節點:delete[zk: localhost:2181(CONNECTED) 4] delete /app1/bb
13)遞歸刪除節點:rmr[zk: localhost:2181(CONNECTED) 7] rmr /app2
14)查看節點狀態:stat
1
2
3
4
5
6
7
8
9
10
11
12
|
[zk: localhost:2181(CONNECTED) 12] stat /app1
cZxid = 0x20000000a
ctime = Mon Jul 17 16:08:35 CST 2017
mZxid = 0x200000018
mtime = Mon Jul 17 16:54:38 CST 2017
pZxid = 0x20000001c
cversion = 4
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 2
|
Zookeeper分佈式安裝部署使用
集羣規劃
在hadoop10二、hadoop103和hadoop104三個節點上部署Zookeeper。
解壓安裝
chmod u+x zookeeper-3.4.10.tar.gz
1)解壓zookeeper安裝包到/opt/module/目錄下[liucw@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
2)在/opt/module/zookeeper-3.4.10/這個目錄下建立zkDatamkdir zkData
3)重命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg爲zoo.cfgmv zoo_sample.cfg zoo.cfg
配置zoo.cfg文件
1
2
3
4
5
6
|
dataDir=/opt/module/zookeeper-3.4.10/zkData
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
|
1)server.2=hadoop102:2888:3888 配置參數解讀
Server.A=B:C:D
A是一個數字,表示這個是第幾號服務器;
B是這個服務器的ip地址;
C是這個服務器與集羣中的Leader服務器交換信息的端口;
D是萬一集羣中的Leader服務器掛了,須要一個端口來從新進行選舉,選出一個新的Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。
集羣模式下配置一個文件myid,這個文件在dataDir目錄下,這個文件裏面有一個數據就是A的值,Zookeeper啓動時讀取此文件,拿到裏面的數據與zoo.cfg裏面的配置信息比較從而判斷究竟是哪一個server。
2)解讀zoo.cfg 文件中參數含義
1)tickTime=2000
1)tickTime:通訊心跳數,Zookeeper服務器心跳時間,單位毫秒.
Zookeeper使用的基本時間,服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每一個tickTime時間就會發送一個心跳,時間單位爲毫秒。
它用於心跳機制,而且設置最小的session超時時間爲兩倍心跳時間。(session的最小超時時間是2*tickTime)
2)initLimit=10:LF初始通訊時限
2)initLimit:LF初始通訊時限
集羣中的follower跟隨者服務器(F)與leader領導者服務器(L)之間初始鏈接時能容忍的最多心跳數(tickTime的數量),用它來限定集羣中的Zookeeper服務器鏈接到Leader的時限。
投票選舉新leader的初始化時間
Follower在啓動過程當中,會從Leader同步全部最新數據,而後肯定本身可以對外服務的起始狀態。
Leader容許F在initLimit時間內完成這個工做。
初始化要乾的事多,因此比同步時間要長一點
3)syncLimit=5:LF同步通訊時限
3)syncLimit:LF同步通訊時限
集羣中Leader與Follower之間的最大響應時間單位,
假如響應超過syncLimit * tickTime,Leader認爲Follwer死掉,從服務器列表中刪除Follwer。
在運行過程當中,Leader負責與ZK集羣中全部機器進行通訊,例如經過一些心跳檢測機制,來檢測機器的存活狀態。若是L發出心跳包在syncLimit以後,尚未從F那收到響應,那麼就認爲這個F已經不在線了。
4)dataDir:數據文件目錄+數據持久化路徑
保存內存數據庫快照信息的位置,若是沒有其餘說明,更新的事務日誌也保存到數據庫。
5)clientPort=2181:客戶端鏈接端口
監聽客戶端鏈接的端口
集羣操做
1)在/opt/module/zookeeper-3.4.10/zkData目錄下建立一個myid的文件vi myid
在文件中添加與server對應的編號:hadoop102 爲1, hadoop103爲2, hadoop103 爲3
3)拷貝配置好的zookeeper到其餘機器上
scp -r zookeeper-3.4.10/ root@hadoop103.liucw.com:/opt/app/
scp -r zookeeper-3.4.10/ root@hadoop104.liucw.com:/opt/app/
並分別修改myid文件中內容爲三、4
4)分別啓動zookeeper
1
2
3
|
[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop104 zookeeper-3.4.10]# bin/zkServer.sh start
|
5)查看狀態
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[root@hadoop104 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
|
HBase 與 Sqoop 的集成
Sqoop supports additional import targets beyond HDFS and Hive. Sqoop can also import records into a table in HBase.
以前咱們已經學習過如何使用 Sqoop 在 Hadoop 集羣和關係型數據庫中進行數據的導入導出 工做,接下來咱們學習一下利用 Sqoop 在 HBase 和 RDBMS 中進行數據的轉儲。
案例
目標:將 RDBMS 中的數據抽取到 HBase 中
1).配置 sqoop-env.sh,添加以下內容:export HBASE_HOME=/opt/module/hbase-1.3.1
(2-1) 在 Mysql 中新建一個數據庫 db_library,一張表 book
1
2
3
4
5
6
|
$ mysql -uroot -proot
mysql> create database db_library;
mysql> CREATE TABLE db_library.book(
id int(4) PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price VARCHAR(255) NOT NULL);
|
(2-2) 向表中插入一些數據
1
2
3
4
|
mysql> use db_library;
INSERT INTO db_library.book (name, price) VALUES('Lie Sporting', '30');
INSERT INTO db_library.book (name, price) VALUES('Pride & Prejudice', '70');
INSERT INTO db_library.book (name, price) VALUES('Fall of Giants', '50');
|
(3) 執行 Sqoop 導入數據的操做
1
2
3
4
5
6
7
8
9
10
11
12
|
[liucw@hadoop102 sqoop-1.4.6.bin__hadoop-2.0.4-alpha]$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/db_library \
--username root \
--password root \
--table book \
--columns "id,name,price" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_book" \
--num-mappers 1 \
--split-by id
|
1
2
3
4
5
6
7
|
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V
at org.apache.sqoop.mapreduce.HBaseImportJob.jobSetup(HBaseImportJob.java:222)
尖叫提示:sqoop1.4.6 只支持 HBase1.0.1 以前的版本的自動建立 HBase 表的功能
解決方案:手動建立 HBase 表
hbase> create 'hbase_book','info'
|
(4) 在 HBase 中 scan 這張表獲得以下內容
1
2
3
4
5
6
7
8
9
|
hbase> scan ‘hbase_book’
hbase(main):003:0> scan 'hbase_book'
ROW COLUMN+CELL
1 column=info:name, timestamp=1539422269162, value=Lie Sporting
1 column=info:price, timestamp=1539422269162, value=30
2 column=info:name, timestamp=1539422269162, value=Pride & Prejudice
2 column=info:price, timestamp=1539422269162, value=70
3 column=info:name, timestamp=1539422269162, value=Fall of Giants
3 column=info:price, timestamp=1539422269162, value=50
|
思考:嘗試使用複合鍵做爲導入數據時的 rowkey。
HBase 與 Hive 集成使用
尖叫提示:HBase 與 Hive 的集成在最新的兩個版本中沒法兼容。因此,咱們只能含着淚勇 敢的從新編譯:hive-hbase-handler-1.2.2.jar!!好氣!!
環境準備
由於咱們後續可能會在操做 Hive 的同時對 HBase 也會產生影響,因此 Hive 須要持有操做 HBase 的 Jar,那麼接下來拷貝 Hive 所依賴的 Jar 包(或者使用軟鏈接的形式)。
1
2
|
$ export HBASE_HOME=/opt/module/hbase-1.3.1
$ export HIVE_HOME=/opt/module/hive
|
注意若是更新版本,最好先把老的軟連接刪除
$ ln -s $HBASE_HOME/lib/hbase-common-1.3.1.jar $HIVE_HOME/lib/hbase-common-1.3.1.jar
$ ln -s $HBASE_HOME/lib/hbase-server-1.3.1.jar $HIVE_HOME/lib/hbase-server-1.3.1.jar
$ ln -s $HBASE_HOME/lib/hbase-client-1.3.1.jar $HIVE_HOME/lib/hbase-client-1.3.1.jar
$ ln -s $HBASE_HOME/lib/hbase-protocol-1.3.1.jar $HIVE_HOME/lib/hbase-protocol-1.3.1.jar
$ ln -s $HBASE_HOME/lib/hbase-it-1.3.1.jar $HIVE_HOME/lib/hbase-it-1.3.1.jar
$ ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
$ ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar
$ ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop-compat-1.3.1.jar
若是zookeeper版本不對,也須要copy過來
同時在 hive-site.xml 中修改 zookeeper 的屬性,以下:
1
2
3
4
5
6
7
8
9
10
|
<!—整合Hbase用到—>
<property>
<name>hive.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
|
案例一
目標:創建 Hive 表,關聯 HBase 表,插入數據到 Hive 表的同時可以影響 HBase 表。
(0)前期準備$ sudo service mysqld restart
(1) 在 Hive 中建立表同時關聯 HBase
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[liucw@hadoop102 hive]$ bin/hive
CREATE TABLE hive_hbase_emp_table(
empno int,
ename string,
job string,mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = 「hbase_emp_table");
# 出現這個錯誤,須要從新編譯Hive源碼
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V
|
尖叫提示:完成以後,能夠分別進入 Hive 和 HBase 查看,都生成了對應的表
(2) 在 Hive 中建立臨時中間表,用於 load 文件中的數據
尖叫提示:不能將數據直接 load 進 Hive 所關聯 HBase 的那張表中
1
2
3
4
5
6
7
8
9
|
CREATE TABLE emp( empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
|
(3) 向 Hive 中間表中 load 數據hive> load data local inpath '/home/admin/softwares/data/emp.txt' into table emp;
(4) 經過 insert 命令將中間表中的數據導入到 Hive 關聯 HBase 的那張表中hive> insert into table hive_hbase_emp_table select * from emp;
(5) 查看 Hive 以及關聯的 HBase 表中是否已經成功的同步插入了數據
Hive: hive> select * from hive_hbase_emp_table;
HBase: hbase> scan ‘hbase_emp_table’
案例二
目標:在 HBase 中已經存儲了某一張表 hbase_emp_table,而後在 Hive 中建立一個外部表來 關聯 HBase 中的 hbase_emp_table 這張表,使之能夠藉助 Hive 來分析 HBase 這張表中的數 據。
注:該案例 2 緊跟案例 1 的腳步,因此完成此案例前,請先完成案例 1。
分步實現:
1).在 Hive 中建立外部表
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE EXTERNAL TABLE relevance_hbase_emp( empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
|
2).關聯後就可使用 Hive 函數進行一些分析操做了hive (default)> select * from relevance_hbase_emp;
HBase Shell命令
進入與退出hbase shell命令行窗口
1
2
3
4
5
|
[root@repo ~]# hbase shell
hbase(main):001:0>
hbase(main):001:0> exit
[root@repo ~]#
|
help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
(1) 查看hbase中有哪些命令
hbase(main):015:0> help
...
COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, show_filters
Group name: namespace
Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, incr, put, scan, truncate, truncate_preserve
(2) 查看某一組命令的下的全部命令的簡介和簡單示範
hbase(main):002:0> help 'ddl'
(3) 查看某個命令的詳細使用
hbase(main):003:0> help 'create'
|
general組中命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--(1) 查看集羣狀態
hbase(main):078:0> status
1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load
--(2) 查看集羣版本
hbase(main):079:0> version
0.98.6-cdh5.3.6, rUnknown, Tue Jul 28 15:17:11 PDT 2015
--(3) 當前登陸用戶角色信息
hbase(main):080:0> whoami
root (auth:SIMPLE)
groups: root
--(4) 查看對某張表進行操做的基本命令
hbase(main):081:0> table_help
|
ddl組中命令
查看數據庫中有哪些表
1
2
3
|
hbase(main):005:0> list
TABLE
person
|
建表
1
2
3
4
5
6
7
8
9
10
|
語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# create '表名', '列族1', '列族2'...
hbase(main):002:0> create 'person','cf1','cf2'
# 等價於
hbase(main):002:0> create 'person',{NAME=>'cf1' },{NAME=>'cf2'}
# 建表時能夠指定表屬性信息
# VERSIONS 當想要用HBase存儲歷史幾個版本的數據是 (達到相似於git的效果時)能夠設定版本號,版本號爲幾 就是存儲幾個版本的數據
hbase(main):005:0> create 'user_info',{NAME=>'base_info',VERSIONS=>3 },{NAME=>'extra_info',IN_MEMORY=>'true'}
|
alter 修改表
(1) 增長列族
1
2
3
4
5
6
7
8
9
10
11
|
alter 'table_name', 'add_family'
# 或者
alter 'table_name', {NAME => 'add_family'}
# 固然,新增長的列能夠設置屬性,好比
alter 'table_name', {NAME => 'add_family', VERSIONS => 3}
hbase(main):010:0> alter 'person','cf3'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
|
(2) 刪除列族
1
2
3
|
alter 'table_name', {NAME => 'delete_family', METHOD => 'delete'}
或者
alter 'table_name', 'delete' => 'delete_family'
|
(3) 添加列族f1同時刪除列族f2
1
|
alter 'user', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
|
(4) 修改列族
1
2
|
# 將user表的f1列族版本號改成5
alter 'user', NAME => 'f1', VERSIONS => 5
|
(5) 將 cf1 列族中的數據存放 3 個版本:
1
|
hbase(main):042:0> alter 'person',{NAME=>'cf1',VERSIONS=>3}
|
判斷表是否存在exists
exists ‘table_name’
禁用表與啓用表
1
2
3
4
5
6
7
8
|
--(1) 禁用表
disable 'table_name'
--(2) 查看錶是否禁用
is_disabled 'table_name'
--(3) 啓用表
enable 'table_name'
--(4) 查看錶是否啓用
is enabled 'table_name'
|
刪除表disable&&drop
1
2
3
|
# hbase的某些版本,在刪除表前,須要先禁用表
disable 'table_name'
drop 'table_name'
|
查看錶屬性信息desc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
hbase(main):007:0> describe 'person'
# 或者
hbase(main):007:0> desc 'person'
Table person is ENABLED
person
COLUMN FAMILIES DESCRIPTION
{
NAME => 'age',
BLOOMFILTER => 'ROW',
VERSIONS => '1',
IN_MEMORY => 'false',
KEEP_DELETED_CELLS => 'FALSE',
DATA_BLOCK_ENCODING => 'NONE',
TTL => 'FOREVER',
COMPRESSION => 'NONE',
MIN_VERSIONS => '0',
BLOCKCACHE => 'true',
BLOCKSIZE => '65536',
REPLICATION_SCOPE => '0'
}
# 其中的屬性的意義:
NAME:列族名
VERSIONS:最大版本號
MIN_VERSIONS:最小版本號
TTL(Time To Live):存活時間
IN_MEMORY:是否開啓緩存,默認false,應該開啓,不然與BLOCKCACHE衝突
BLOCKCACHE:讀緩存是否開啓,默認開啓,64M
|
dml組中命令
插入數據put
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
--(1) put '表名','rowkey','列族名:列名','值'
put 'person','0001','cf1:name','liucw'
put 'person','0001','cf1:sex','male'
put 'person','0001','cf1:age','18'
put 'person','0002','cf1:name','changwen'
put 'person','0002','cf1:sex','female'
put 'person','0002','cf1:age','20'
put 'person','0001','cf2:name','liucw'
put 'person','0001','cf2:sex','male'
put 'person','0001','cf2:age','18'
-- 統計表數據行數 注意:只有2行
hbase(main):033:0> count 'person'
2 row(s) in 0.0460 seconds
hbase(main):031:0> scan 'person'
ROW COLUMN+CELL
0001 column=cf1:age, timestamp=1551768727762, value=18
0001 column=cf1:name, timestamp=1551768650325, value=liucw
0001 column=cf1:sex, timestamp=1551768722507, value=male
0001 column=cf2:age, timestamp=1551768824538, value=18
0001 column=cf2:name, timestamp=1551768804735, value=liucw
0001 column=cf2:sex, timestamp=1551768819896, value=male
0002 column=cf1:age, timestamp=1551768767803, value=20
0002 column=cf1:name, timestamp=1551768750437, value=changwen
0002 column=cf1:sex, timestamp=1551768757424, value=female
2 row(s) in 0.0200 seconds
--(2) 能夠指定時間戳,不然默認爲系統當前時間
put 'person','0002','info:age',20,1482077777778
|
查詢某行get
(1) 查看「指定行」
1
2
3
4
5
6
7
8
|
hbase(main):032:0> get 'person','0001'
COLUMN CELL
cf1:age timestamp=1551768727762, value=18
cf1:name timestamp=1551768650325, value=liucw
cf1:sex timestamp=1551768722507, value=male
cf2:age timestamp=1551768824538, value=18
cf2:name timestamp=1551768804735, value=liucw
cf2:sex timestamp=1551768819896, value=male
|
(2) 查看指定列族的消息
1
2
3
4
5
|
hbase(main):041:0> get 'person','0001','cf1'
COLUMN CELL
cf1:age timestamp=1551769193444, value=10
cf1:name timestamp=1551768650325, value=liucw
cf1:sex timestamp=1551768722507, value=male
|
(3) 查詢某行,指定列名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
hbase(main):034:0> get 'person','0001','cf1:age'
COLUMN CELL
cf1:age timestamp=1551768727762, value=18
--(3) 查詢某行,添加其餘限制條件
# 查詢person表中,rowkey爲'0001'的這一行,只顯示cf2:age這一列,而且只顯示最新的3個版本
hbase(main):076:0> get 'person','0001',{COLUMNS=>'cf2:age',VERSIONS=>3}
COLUMN CELL
cf2:age timestamp=1551770366619, value=15
cf2:age timestamp=1551770364161, value=14
cf2:age timestamp=1551770361190, value=13
# 查看指定列的內容,並限定顯示最新的3個版本和時間範圍
get 'person', '0001', {COLUMN => 'cf1:age', VERSIONS => 3, TIMERANGE => [1392368783980, 1392380169184]}
# 查詢person表中,rowkey爲'rk0001',且某列的內容爲'中國'的記錄
hbase(main):041:0> put 'person','rk0001','cf1:age','70'
scan'person', 'rk0001', {FILTER => "ValueFilter(=, 'binary:中國')"}
# 查看指定行中 字段名稱中含有 a的字段
get 'person’,’0001’,{FILTER=>」(QualifierFilter(=,’substring:a’))」}
# 返回字段的value值是指定的值的字段
get ‘person’,’0001’,{FILTER=>」ValueFilter(=,’binary:liucw’)」}
|
全表掃描scan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
--(1) 掃描全表
scan 'person'
--(2) 掃描時指定列族
scan 'person', {COLUMNS => 'cf1'}
--(3) 掃描時指定列族,並限定顯示最新的5個版本的內容
scan 'person', {COLUMNS => 'cf1', VERSIONS => 5}
--(4) 設置開啓Raw模式,開啓Raw模式會把那些已添加刪除標記可是未實際刪除的數據也顯示出來
scan 'person', {COLUMNS => 'cf1', RAW => true}
--(5) 列的過濾
# 查詢person表中列族爲cf1和cf2的信息
scan 'person',{COLUMNS=>['cf1','cf2']}
# 查詢person表中列族爲cf1,列名爲name、列族爲cf2,列名爲age的信息
scan 'person', {COLUMNS => ['cf1:name', 'cf2:age']}
# 查詢person表中列族爲cf1,列名爲name的信息,而且版本最新的5個
scan 'person', {COLUMNS => 'cf1:name', VERSIONS => 5}
hbase(main):072:0> scan 'person',{COLUMNS=>'cf2:age',VERSIONS=>3}
ROW COLUMN+CELL
0001 column=cf2:age, timestamp=1551770366619, value=15
0001 column=cf2:age, timestamp=1551770364161, value=14
0001 column=cf2:age, timestamp=1551770361190, value=13
# 查詢person表中列族爲cf1和cf2且列名含有a字符的信息
scan 'person', {COLUMNS => ['cf1', 'cf2'], FILTER => "(QualifierFilter(=,'substring:a'))"}
# 查詢person表中列族爲cf1,rk範圍是[rk0001, rk0003)的數據
scan 'people', {COLUMNS => 'cf1', STARTROW => 'rk0001', ENDROW => 'rk0003'}
# 查詢person表中row key以rk字符開頭的
scan 'person',{FILTER=>"PrefixFilter('rk')"}
# 查詢person表中指定時間範圍的數據
scan 'person', {TIMERANGE => [1392368783980, 1392380169184]}
scan的用法不少,參數,過濾條件能夠不少,各類組合, 在此不列舉過多的例子,參考 help 'scan'
|
刪除數據
1
2
3
4
5
|
刪除某 rowkey 的所有數據:
hbase(main) > deleteall 'student','1001'
刪除某 rowkey 的某一列數據:
hbase(main) > delete 'student','1002','info:sex'
|
清空表
清空表的操做順序爲先 disable,而後再 truncating。truncate 'table_name'
namespace
在HBase中,namespace命名空間指對一組表的邏輯分組,相似RDBMS中的database,方便對錶在業務上劃分。Apache HBase從0.98.0, 0.95.2兩個版本開始支持namespace級別的受權操做,HBase全局管理員能夠建立、修改和回收namespace的受權。
HBase系統默認定義了兩個缺省的namespace
hbase:系統內建表,包括namespace和meta表
default:用戶建表時未指定namespace的表都建立在此
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
建立namespace
hbase>create_namespace 'nametest'
刪除namespace
hbase>drop_namespace 'nametest'
查看namespace
hbase>describe_namespace 'nametest'
列出全部namespace
hbase>list_namespace
在namespace下建立表
hbase>create 'nametest:testtable', 'fm1'
查看namespace下的表
hbase>list_namespace_tables 'nametest'
|
其餘
1
2
3
4
5
6
7
8
9
|
--(1) 查看命名空間
hbase(main):015:0> list_namespace
NAMESPACE
default # 用戶建立的表放在這裏
hbase # 系統表空間
--(2) 把表中數據強制寫到磁盤
flush 'table_name'
|
HBase部署
HBase 一種是做爲存儲的分佈式文件系統,另外一種是做爲數據處理模型的 MR 框架。由於平常開發人員比較熟練的是結構化的數據進行處理,可是在 HDFS 直接存儲的文件每每不具備結構化,因此催生出了 HBase 在 HDFS 上的操做。若是須要查詢數據,只須要經過鍵值即可以成功訪問。
前提準備
1.Zookeeper 正常部署
2.Hadoop 正常部署
HBase部署
HBase 的解壓
$ tar -zxf ~/softwares/installations/hbase-1.3.1-bin.tar.gz -C ~/modules/
HBase 的配置文件
1)hbase-env.sh 修改內容
1
2
|
export JAVA_HOME=/opt/module/jdk1.8.0_181
export HBASE_MANAGES_ZK=false # 是否使用hbase本身的zookeeper
|
2).hbase-site.xml 修改內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98 後的新變更,以前版本沒有.port,默認端口爲 60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper-3.4.10/zkData</value>
</property>
</configuration>
|
3).regionservers
1
2
3
|
hadoop102
hadoop103
hadoop104
|
補充:若是同時還部署了CDH版本,記得修改/etc/profile裏的HBASE_HOME的路徑,由於在hbase-env.sh是用的HBASE_HOME的路徑
$ source /etc/profile
$ echo $HBASE_HOME
/opt/module/cdh/hbase-0.98.6-cdh5.3.6
HBase 須要依賴的 Jar 包
因爲 HBase 須要依賴 Hadoop,因此替換 HBase 的 lib 目錄下的 jar 包,以解決兼容問題:
1) 刪除原有的 jar:
$ rm -rf /home/admin/modules/hbase-1.3.1/lib/hadoop-*
$ rm -rf /home/admin/modules/hbase-1.3.1/lib/zookeeper-3.4.6.jar
2) 拷貝新 jar,涉及的 jar 有:
hadoop-annotations-2.7.2.jar
hadoop-auth-2.7.2.jar
hadoop-client-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-hdfs-2.7.2.jar
hadoop-mapreduce-client-app-2.7.2.jar
hadoop-mapreduce-client-common-2.7.2.jar
hadoop-mapreduce-client-core-2.7.2.jar
hadoop-mapreduce-client-hs-2.7.2.jar
hadoop-mapreduce-client-hs-plugins-2.7.2.jar
hadoop-mapreduce-client-jobclient-2.7.2.jar
hadoop-mapreduce-client-jobclient-2.7.2-tests.jar
hadoop-mapreduce-client-shuffle-2.7.2.jar
hadoop-yarn-api-2.7.2.jar
hadoop-yarn-applications-distributedshell-2.7.2.jar
hadoop-yarn-applications-unmanaged-am-launcher-2.7.2.jar
hadoop-yarn-client-2.7.2.jar
hadoop-yarn-common-2.7.2.jar
hadoop-yarn-server-applicationhistoryservice-2.7.2.jar
hadoop-yarn-server-common-2.7.2.jar
hadoop-yarn-server-nodemanager-2.7.2.jar
hadoop-yarn-server-resourcemanager-2.7.2.jar
hadoop-yarn-server-tests-2.7.2.jar
hadoop-yarn-server-web-proxy-2.7.2.jar
zookeeper-3.4.5.jar
提示:這些 jar 包的對應版本應替換成你目前使用的 hadoop 版本,具體狀況具體分析。
查找 jar 包舉例:
$ find /home/admin/modules/hadoop-2.7.2/ -name hadoop-annotations*
而後將找到的 jar 包複製到 HBase 的 lib 目錄下便可。
HBase 軟鏈接 Hadoop 配置
$ ln -s ~/modules/hadoop-2.7.2/etc/hadoop/core-site.xml
~/modules/hbase-1.3.1/conf/core-site.xml
$ ln -s ~/modules/hadoop-2.7.2/etc/hadoop/hdfs-site.xml ~/modules/hbase-1.3.1/conf/hdfs-site.xml
HBase 遠程 scp 到其餘集羣
$ scp -r /home/admin/modules/hbase-1.3.1/ linux02:/home/admin/modules/
$ scp -r /home/admin/modules/hbase-1.3.1/ linux03:/home/admin/modules/
7.Hbase 的master高可用
1) 關閉 HBase 集羣(若是沒有開啓則跳過此步)
$ bin/stop-hbase.sh
2) 在 conf 目錄下建立 backup-masters 文件
$ vi conf/backup-masters
配置高可用 HMaster 節點,備份節點再另外一臺服務器(可選)
hadoop103
3) 將整個 conf 目錄 scp 到其餘節點
$ scp -r conf/ linux02:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/
$ scp -r conf/ linux03:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/
4) 打開頁面測試查看
0.98 版本以前:http://hadoop102:60010
0.98 版本以後:http://hadoop102:16010
http://hadoop102:16010/master-status
http://hadoop103:16010/master-status
HBase 服務的啓動
啓動方式 2:
$ bin/start-hbase.sh
對應的中止服務:
$ bin/stop-hbase.sh
尖叫提示:若是使用的是 JDK8 以上版本,則應在 hbase-evn.sh 中移除 「HBASE_MASTER_OPTS」和「HBASE_REGIONSERVER_OPTS」配置。
啓動方式 1:
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
尖叫提示:若是集羣之間的節點時間不一樣步,會致使 regionserver 沒法啓動,拋出 ClockOutOfSyncException 異常。
修復提示:
a、同步時間服務
b、屬性:hbase.master.maxclockskew 設置更大的值
1
2
3
4
5
|
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from master</description>
</property>
|
訪問 HBase 管理頁面
查看 Hbse 頁面 啓動成功後,能夠經過「host:port」的方式來訪問 HBase 管理頁面,例如
http://linux01:16010
啓動後問題
1)Node /hbase/namespace/default already exists and this is not a retry
刪除HDFS的數據,再從新啓動
2).若是屢次啓動失敗
a).刪除hdfs的初始目錄
b).zookeeper 刪除 rmr /hbase
3).問題:Hbase上的表不存在,但還會提示「表已經存在」
在虛擬機上玩Hbase,過了一段時間以後,建立’testtable’ 時總報異常 table already exists,無論是用代碼仍是在Hbase Shell裏都同樣。
解決辦法:轉自 http://www.aboutyun.com/thread-9507-1-1.html
一、執行 zkCli.sh 進入zookeeper,
二、在zk client模式下輸入ls /hbase/table命令看到zombie table,
三、使用rmr /hbase/table/TABLE_NAME命令刪除zombie table,
四、 重啓hbase便可