chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

Hadoop入门笔记

Hadoop 安装以及(伪)分布式集群

经典教程:

Hadoop安装
在阿里云中搭建大数据实验环境 —-仅有点儿参考价值

注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并
从/etc/profile.d目录的配置文件中搜集shell的设置,

/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被
读取。

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,
该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell
时,该文件被读取。

***hadoop 的 JAVA 变量必须在 ~/.bashrc,尽量使用 1.8 版本,后面的 sbt 版本要求是 1.8***
1
2
3
4
5
6
7
8
9
Hadoop 附带了丰富的例子(运行 
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
可以看到所有例子),包括 wordcount、terasort、join、grep 等。

在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正
则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。

注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。
rm -r ./output

hadoop 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
启动/关闭:

start-all.sh //这个 hadoop 启动命令会和 spark 命令重复,所以会提示缺少一个
spark的jar包,不影响hadoop的启动。要再执行下 jobhistory 脚本

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver //支持查看作业历史运行信息

如何通过Web查看job的运行情况: https://www.linuxidc.com/Linux/2015-05/117501.htm

http://master:50070/
http://master:8088/cluster

HDFS操作常用Shell命令:http://dblab.xmu.edu.cn/blog/1625-2/
HDFS Shell命令官方文档:http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

利用Java API与HDFS进行交互

经典教程:

大数据技术原理与应用 第三章 分布式文件系统HDFS 学习指南

HAdoop API

爬坑

注:

有可能会报错,原因需要代码中添加用户名、密码。

hbase

HBase是一个分布式的、面向列的开源数据库,一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式

经典教程:

大数据原理与应用 第四章 分布式数据库HBase 学习指南

笔记

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
运行HBase:
第一步:首先启动Hadoop,如果已经启动hadoop请跳过此步骤。命令如下:

start-all.sh

第二步:切换目录至/usr/local/hbase;再启动HBase.命令如下:

cd /usr/local/hbase
./bin/start-hbase.sh

进入HBase Shell交互式执行环境:

cd /usr/local/hbase
./bin/hbase shell

Hadoop的HDFS中查看变化:

linziyu@iZbp11gznj7n38xkztu64dZ:/usr/local/hadoop$ ./bin/hdfs dfs -ls /
Found 2 items
drwxr-xr-x - linziyu supergroup 0 2018-04-11 17:35 /hbase
drwxr-xr-x - linziyu supergroup 0 2018-04-06 22:40 /user
可以看到,在HDFS中,自动生成了一个“/hbase”目录,用来保存HBase的数据。

注意:如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录
(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
这里启动关闭Hadoop和HBase的顺序一定是:
启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop
1
2
3
4
5
ERROR: Can't get master address from ZooKeeper; znode data == null
as:
重启hbase(可能是zookeeper或hbase不稳定造成的 重启不一定起作用)
or
执行hdfs格式化命令:hadoop namenode -format (删除临时文件/格式化)

HBase 常用Shell命令

hbase shell命令 描述
alter 修改列族(column family)模式
count 统计表中行的数量
create 创建表
describe 显示表相关的详细信息
delete 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值)
deleteall 删除指定行的所有元素值
disable 使表无效
drop 删除表
enable 使表有效
exists 测试表是否存在
exit 退出hbase shell
get 获取行或单元(cell)的值
incr 增加指定表,行或列的值
list 列出hbase中存在的所有表
put 向指向的表单元添加值
tools 列出hbase所支持的工具
scan 通过对表的扫描来获取对用的值
status 返回hbase集群的状态信息
shutdown 关闭hbase集群(与exit不同)
truncate 重新创建指定表
version 返回hbase版本信息

表的管理

1)通过list可以列出所有已创建的表(除-ROOT表和.META表(被过滤掉了))

hbase(main)> list

2)创建表,其中t1是表名,f1、f2是t1的列族。hbase中的表至少有一个列族.它们之中,列族直接影响hbase数据存储的物理特性。

1
2
3
4
5
语法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>} 

例如:创建表t1,有两个family name:f1,f2,且版本数均为2

hbase(main)> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

3)删除表

1
2
3
4
5
分两步:首先disable,然后drop
例如:删除表t1

hbase(main)> disable 't1'
hbase(main)> drop 't1'

4)查看表的结构

1
2
3
4
语法:describe(desc) <table> (可以看到这个表的所有默认参数)
例如:查看表t1的结构

hbase(main)> describe 't1' / desc 't1'

5)修改表结构
修改表结构必须先disable

1
2
3
4
5
6
7
语法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
例如:修改表test1的cf的TTL为180天

hbase(main)> disable 'test1'
hbase(main)> alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}

hbase(main)> enable 'test1'

6)查看表中所有记录 scan

1
2
3
语法:scan 'tablename'

scan 'wc'

7)alter

1
2
3
4
5
6
语法:alter ‘tablename’,NAME=>’familyname’,attribute=>new_value 

例子:给表添加列族 alter
添加一个名字叫sid的列族VERSIONS值为5

alter 'wc',NAME=>'sid',VERSION=>5

8)删除列族,需首先将表disable
alter ‘tablename’,’delete’=>’column family’
删除一个列族之后,这个列族的数据也会全部被删除。
9)删除表范围运算符,需首先将表disable
alter ‘tablename’,METHOD=>’table_att_unset’,NAME=>’MAX_FILESIZE’
10)incr 计数器

1
2
3
4
incr 'tablename','rowkey','column family:column' step     
step是步长,可选,默认为1

给‘id’这个行健增加'column_famaly1:addr'字段,并使用counter实现递增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

hbase(main):002:0> incr 'table','id','column_famaly1:addr'
COUNTER VALUE = 1
0 row(s)


hbase(main):003:0> incr 'table','id','column_famaly1:addr'
COUNTER VALUE = 2
0 row(s)

hbase(main):004:0> get 'table','id','column_famaly1:addr'
COLUMN CELL
column_famaly1:addr timestamp=1463056705124, value=\x00\x00\x00\x00\x00\x00\x0
0\x02
1 row(s)

hbase(main):005:0> incr 'table','id','column_famaly1:addr'
COUNTER VALUE = 3
0 row(s)

11)获取计数器当前值

get_counter 'tablename','rowkey','column family:column'

权限管理

1)分配权限

1
2
3
4
5
6
7
8
9
语法 : grant <user> <permissions> <table> <column family> <column qualifier> 参数后面用逗号分隔

权限用五个字母表示: "RWXCA".

READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')

例如,给用户‘test'分配对表t1有读写的权限,

hbase(main)> grant 'test','RW','t1'

2)查看权限

1
2
3
语法:user_permission <table>
例如,查看表t1的权限列表
hbase(main)> user_permission 't1'

3)收回权限

1
2
3
4
与分配权限类似,语法:revoke <user> <table> <column family> <column qualifier>
例如,收回test用户在表t1上的权限

hbase(main)> revoke 'test','t1'

4)将表设置为只读模式
alter ‘tablename’,READONLY

表数据的增删改查

添加数据
1
2
3
4
5
语法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>

例如:给表t1的添加一行记录:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系统默认

hbase(main)> put 't1','rowkey001','f1:col1','value01'
查询数据

a)查询某行记录

1
2
3
4
5
6
7
8
9
10
11
语法:get <table>,<rowkey>,[<family:column>,....]

例如:查询表t1,rowkey001中的f1下的col1的值

hbase(main)> get 't1','rowkey001', 'f1:col1'
或者:
hbase(main)> get 't1','rowkey001', {COLUMN=>'f1:col1'}

查询表t1,rowke002中的f1下的所有列值

hbase(main)> get 't1','rowkey001'

b)扫描表

1
2
3
4
5
6
7
语法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}

另外,还可以添加STARTROW、TIMERANGE和FITLER等高级功能

例如:扫描表t1的前5条数据

hbase(main)> scan 't1',{LIMIT=>5}

c)查询表中的数据行数

1
2
3
4
5
6
7
语法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}
INTERVAL设置多少行显示一次及对应的rowkey,默认1000;CACHE每次去取的缓存区大小,默
认是10,调整该参数可提高查询速度

例如,查询表t1中的行数,每100条显示一次,缓存区为500

hbase(main)> count 't1', {INTERVAL => 100, CACHE => 500}

删除数据

a )删除行中的某个列值

1
2
3
4
5
6
7
语法:delete <table>, <rowkey>,  <family:column> , <timestamp>,必须指定列名

例如:删除表t1,rowkey001中的f1:col1的数据

hbase(main)> delete 't1','rowkey001','f1:col1'

注:将删除改行f1:col1列所有版本的数据

b )删除行

1
2
3
4
5
语法:deleteall <table>, <rowkey>,  <family:column> , <timestamp>,可以不指定列名,删除整行数据

例如:删除表t1,rowk001的数据

hbase(main)> deleteall 't1','rowkey001'

c)删除表中的所有数据

1
2
3
4
5
6
7
语法: truncate <table>

其具体过程是:disable table -> drop table -> create table

例如:删除表t1的所有数据

hbase(main)> truncate 't1'

组命令Group name

1)查看当前集群状态

status

2)查看当前用户是谁

whoami

3)创建命名空间

create_namespace 'ns name'

4)查看有哪些命名空间

list_namespace

5)删除命名空间

drop_namespace 'ns name'

Region管理

1)移动region

1
2
3
4
5
6
语法:move 'encodeRegionName', 'ServerName'

encodeRegionName指的regioName后面的编码,ServerName指的是master-status的Region Servers列表

示例:
hbase(main)>move '4343995a58be8e5bbc739af1e91cd72d', 'db-41.xxx.xxx.org,60020,1390274516739'

2)开启/关闭region

1
2
3
语法:balance_switch true|false

hbase(main)> balance_switch

3)手动split

语法:split 'regionName', 'splitKey'

4)手动触发major compaction

1
2
3
4
5
6
7
8
9
语法:
Compact all regions in a table:
hbase> major_compact 't1'
Compact an entire region:
hbase> major_compact 'r1'
Compact a single column family within a region:
hbase> major_compact 'r1', 'c1'
Compact a single column family within a table:
hbase> major_compact 't1', 'c1'

配置管理及节点重启

1)修改hdfs配置
hdfs配置位置:/etc/hadoop/conf

1
2
3
4
5
6
7
8
9
10
11
同步hdfs配置

cat /home/hadoop/slaves|xargs -i -t scp /etc/hadoop/conf/hdfs-site.xml hadoop@{}:/etc/hadoop/conf/hdfs-site.xml

关闭:

cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode"

启动:

cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start datanode"

2)修改hbase配置
hbase配置位置:

1
2
3
4
5
6
7
8
同步hbase配置

cat /home/hadoop/hbase/conf/regionservers|xargs -i -t scp /home/hadoop/hbase/conf/hbase-site.xml hadoop@{}:/home/hadoop/hbase/conf/hbase-site.xml

graceful重启

cd ~/hbase
bin/graceful_stop.sh --restart --reload --debug inspurXXX.xxx.xxx.org

MapReduce

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念”Map(映射)”和”Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。

MapReduce是面向大数据并行处理的计算模型、框架和平台。

经典教程:

大数据技术原理与应用 MOOC 慕课
使用Eclipse编译运行MapReduce程序_Hadoop2.6.0_Ubuntu/CentOS
使用命令行编译打包运行自己的MapReduce程序 Hadoop2.6.0

爬坑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
error:
hadoop@Master:/usr/local/hadoop$ bin/hdfs dfs -put etc/hadoop input
put: `input': No such file or directory

as: 主要是命令老了吧
hadoop@Master:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir -p /user/hadoop
hadoop@Master:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir -p /user/hadoop/input
hadoop@Master:/usr/local/hadoop$ hadoop fs -put /usr/local/hadoop/etc/hadoop/hdfs-site.xml /user/hadoop/input
hadoop@Master:/usr/local/hadoop$ hadoop fs -put /usr/local/hadoop/etc/hadoop/core-site.xml /user/hadoop/input

error:
有时候一些 eclipse 插件安装之后,打开 eclipse 死活都不显示
as:
把 eclipse/configuration/org.eclipse.update 删除掉

Hive (数据仓库工具)

hive 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

Hue 是cdh专门的一套web管理器,它包括3个部分hue ui,hue server,hue db。hue提供所有的cdh组件的shell界面的接口。你可以在hue编写mr,查看修改hdfs的文件,管理hive的元数据,运行Sqoop,编写Oozie工作流等大量工作。

经典教程

大数据技术原理与应用 第十四章 基于Hadoop的数据仓库Hive 学习指南—–包含基本命令
Hive的可视化操作(Hue)
Hue官方教程
高可用Hadoop平台-Hue In Hadoop

爬坑

mysql的连接jar版本;
HDFS的文件、缓存似乎也有影响
mysql的账号密码很坑
hive的配置修改一定不能错

sqoop

Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

经典教程

Ubuntu安装Sqoop
大数据案例-步骤一:本地数据集上传到数据仓库Hive
大数据案例-步骤二:Hive数据分析
大数据案例-步骤三:Hive、MySQL、HBase数据互导
大数据案例-步骤四:利用R进行数据可视化分析

scala

Scala是一门现代的多范式编程语言,平滑地集成了面向对象和函数式语言的特性,旨在以简练、优雅的方式来表达常用编程模式。Scala的设计吸收借鉴了许多种编程语言的思想,只有很少量特点是Scala自己独有的。Scala语言的名称来自于“可伸展的语言”,从写个小脚本到建立个大系统的编程任务均可胜任。Scala运行于Java平台(JVM,Java 虚拟机)上,并兼容现有的Java程序,Scala代码可以调用Java方法,访问Java字段,继承Java类和实现Java接口。在面向对象方面,Scala是一门非常纯粹的面向对象编程语言,也就是说,在Scala中,每个值都是对象,每个操作都是方法调用

Spark的设计目的之一就是使程序编写更快更容易,这也是Spark选择Scala的原因所在。

Scala简介

经典教程

子雨大数据之Spark入门教程(Scala版) 🐂🍺
Scala安装

Spark

经典教程

厦门大学的Python入门教程
子雨大数据之Spark入门教程(Python版)

zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集, 提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道