Author Archive: 香蕉与打火机

About 香蕉与打火机

李小蕉!

【翻译】hbase installation

原文:(安装)http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hbase_install.html

(BlockCache)http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/admin_hbase_blockcache_configure.html

Installing HBase(安装Hbase)

配置HBase(Configuration Settings for HBase)

使用hdfs的线程数参数(Using dfs.datanode.max.transfer.threads with HBase)

HDFS datanode有最大伺服文件数限制。该上限由dfs.datanode.max.transfer.threads参数控制。在加载HBase之前,确认已经在$HADOOP_HOME/conf/hdfs-site.xml文件中配置了该参数:

将配置文件发送到集群,并重启HDFS以生效。

否则会报与block相关的奇怪错误。

配置HBase的BlockCache(Configuring the HBase BlockCache)

扩展阅读:

堆内存与堆外内存:http://bananalighter.com/java-off-heap-on-heap/

块缓存1:http://www.cnblogs.com/panfeng412/archive/2012/09/24/hbase-block-cache-mechanism.html

块缓存2:http://punishzhou.iteye.com/blog/1277141

HBase提供了堆内存及堆外内存两种块缓存的实现。

堆内存:默认的堆内存块缓存实现是LruBlockCache(java)。桶缓存可以用堆内存,也可以用堆外内存。

结合:如果操作的数据超出堆容量,可以使用桶缓存作为堆内存LruBlockCache的二级缓存(L2 cache)。这个实现在CombinedBlockCache中有涉及。

 

 

 

 

 

 

 

 

 

堆外内存(off-heap),堆内存(on-heap)

原文:http://www.infoq.com/cn/news/2014/12/external-memory-heap-memory/

一般情况下,Java中分配的非空对象都是由Java虚拟机的垃圾收集器管理的,也称为堆内内存(on-heap memory)。虚拟机会定期对垃圾内存进行回收,在某些特定的时间点,它会进行一次彻底的回收(full gc)。彻底回收时,垃圾收集器会对所有分配的堆内内存进行完整的扫描,这意味着一个重要的事实——这样一次垃圾收集对Java应用造成的影响,跟堆的大小是成正比的。过大的堆会影响Java应用的性能。

对于这个问题,一种解决方案就是使用堆外内存(off-heap memory)。堆外内存意味着把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机)。这样做的结果就是能保持一个较小的堆,以减少垃圾收集对应用的影响。

但是Java本身也在不断对堆内内存的实现方式做改进。两者各有什么优缺点?Vanilla Java博客作者Peter Lawrey撰写了一篇文章,在文中他对三种方式:用new来分配对象、对象池(object pool)和堆外内存,进行了详细的分析。

用new来分配对象内存是最基本的一种方式,Lawery提到:

在Java 5.0之前,分配对象的代价很大,以至于大家都使用内存池。但是从5.0开始,对象分配和垃圾回收变得快多了,研发人员发现了性能的提升,纷纷简化他们的代码,不再使用内存池,而直接用new来分配对象。从5.0开始,只有一些分配代价较大的对象,比如线程、套接字和数据库链接,用内存池才会有明显的性能提升。

对于内存池,Lawery认为它主要用于两类对象。第一类是生命周期较短,且结构简单的对象,在内存池中重复利用这些对象能增加CPU缓存的命中率,从而提高性能。第二种情况是加载含有大量重复对象的大片数据,此时使用内存池能减少垃圾回收的时间。对此,Lawery还以StringInterner为例进行了说明。

最后Lawery分析了堆外内存,它和内存池一样,也能缩短垃圾回收时间,但是它适用的对象和内存池完全相反。内存池往往适用于生命期较短的可变对象,而生命期中等或较长的对象,正是堆外内存要解决的。堆外内存有以下特点:

  • 对于大内存有良好的伸缩性
  • 对垃圾回收停顿的改善可以明显感觉到
  • 在进程间可以共享,减少虚拟机间的复制

Lawery还提到对外内存最重要的还不是它能改进性能,而是它的确定性。

当然堆外内存也有它自己的问题,最大的问题就是你的数据结构变得不那么直观,如果数据结构比较复杂,就要对它进行串行化(serialization),而串行化本身也会影响性能。另一个问题是由于你可以使用更大的内存,你可能开始担心虚拟内存(即硬盘)的速度对你的影响了。

Lawery还介绍了OpenHFT公司提供三个开源库:Chronicle QueueChronicle MapThread Affinity,这些库可以帮助开发人员使用堆外内存来保存数据。采用堆外内存有很多好处,同时也带来挑战,对堆外内存感兴趣的读者可以阅读Lawery的原文来了解更多信息。

CentOS 修改字符集

查看可用字符集

修改

 查看当前字符集

 

 

linux 端口管理(查看与关闭)

参考:http://linux.vbird.org/linux_server/0210network-secure.php#portlimit

查看端口情况

netstat

查看正在监听的端口

 

 查看输入输出端口(端口连接状态)

加了-l则将输出端口筛选掉了。

以下命令行输出均应为IP,这里全部替换为主机名。

 删除已连接或在监听的端口

新起一个ssh连接

从hadoop02机器ssh到hadoop01,观察hadoop01机器上的端口变化。

查看端口进程号(无关端口略)

 杀死端口号对应进程

查看登录机器的提示

 nmap

用法

直接引用鸟哥的用法文档:

 扫描某一主机打开的端口(仅TCP)

 查看主机打开的所有端口

扫描网段内的机器(机器多了略耗时)

本处隐去了原始IP,用192.168.1.*示意。

 

 

 

 

 

【翻译】部署hive

安装及配置Metastore:

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hive_metastore_configure.html

安装及配置HiveServer2:

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hiveserver2_configure.html

配置hive运行内存:

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hive_install.html

预安装环境参考:

yarn:http://bananalighter.com/cdh-yarn-installation/

zookeeper: http://bananalighter.com/cdh-install-zookeeper

物理环境:hadoop01、02、03三台机器。

1.Hive metastore server安装

(1) 安装hive包

选用hadoop01作为元数据服务所在机器,安装hive-metastore

yum install hive-metastore hive-server2

(2) 在hadoop02上安装metastore所用的mysql数据库

(3) 修改hive-site.xml参数

参照1-(1)表修改参数。

注意以下参数请根据自己实际情况填写,主机、账号及密码不要搞错。

javax.jdo.option.ConnectionURL jdbc:mysql://hadoop01/metastore
javax.jdo.option.ConnectionUserName hive
javax.jdo.option.ConnectionPassword yourpassword
hive.metastore.uris thrift://hadoop01:9083

(4) 创建metastore所用的mysql实例及账号

数据库的示例脚本位置为:/usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.13.0.mysql.sql;

注意hive schema的版本应该与metastore一致,否则会报schema的错。

2.安装Hive server2

(1) 安装hive包

为三台测试机hadoop01~03安装hive server2。

(2) 配置到zookeeper的连接参数

参考表中的内容配置hadoop01。

与Hive server2有关的配置
hive.support.concurrency true Enable Hive’s Table Lock Manager Service
hive.zookeeper.quorum hadoop01,hadoop02,hadoop03 Zookeeper quorum used by Hive’s Table Lock Manager
hive.zookeeper.client.port 2181 The port at which the clients will connect.

然后拷贝hive-site.xml文件到hadoop02、hadoop03的对应位置。

本步骤未正确配置会引发hive server无法获得锁的错误。

3.创建Hive在hdfs上的工作目录

在hdfs上创建 /user/hive/warehouse目录,并将权限修改为1777.

该目录为hive的默认工作目录。如果需要指定,则需要在hive-site.xml文件中配置参数:hive.metastore.warehouse.dir

4.启动hive metastore及hive server2

(1) 启动metastore service

在hadoop01上执行:

(本步骤需要正确部署zookeeper,zookeeper部署参考文初链接)

(2) 启动hive server2

在hadoop01-03上执行:

(3) 检查日志

检查/var/log/hive目录下*.log文件内容有无异常、报错。有就搜索引擎解决吧。

5.使用配置

(1) reducer设置

参数:hive.exec.reducers.bytes.per.reducer

说明:每个reducer读取的字节数大小。假如输入是10G,本属性值为1G,则系统将会分配10个reducer。

修改方法:

编辑hive-site.xml,添加:

重启HiveServer2生效。

参数:mapred.reduce.tasks

说明:设置reducer任务数量。设置-1则系统自动根据情况

修改方法:

编辑hive-site.xml,添加:

重启HiveServer2生效。

(2) HiveServer2内存

拷贝/etc/hive/conf/hive-env.sh.template 为/etc/hive/conf/hive-env.sh

下面的例子配置HiveServer2及Metastore的运行内存为2G,hive client的总内存为2G

重启HiveServer2及Metastore生效。

(3) 关闭任务推测式执行

修改hive-site.xml文件,添加:

重启HiveServer2生效

修改mapred-site.xml文件,添加:

重启hadoop-yarn-resourcemanager生效

(4) cli设置

编辑hive-site.xml,添加:

展示效果:

 

 

 

 

 

HiveQL

参考链接:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

1.数据定义语言(DDL)

  • 创建、修改、删除数据库

创建数据库

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path]

[WITH DBPROPERTIES (property_name=property_value, …)];

语法解释:

  • 数据库注释:COMMENT
  • 在hdfs上的路径: LOCATION
  • 使用Key-value的方式为数据库注释

使用实例:

create database lesson1test comment ‘lesson1test’ with dbproperties(‘user’=’banana’);

修改数据库的key-value注释

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, …);

— (Note: SCHEMA added in Hive 0.14.0)

修改数据库的用户

ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;

— (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)

删除数据库

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

使用实例

alter database lesson1test set dbproperties(‘user’=’lighter’);

alter database lesson1test set owner user hdfs;

drop database if exists lesson1test;

  • 创建、截断、删除表(带分区)

创建表

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

[(col_name data_type [COMMENT col_comment], …)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]

[

[ROW FORMAT row_format]

[STORED AS file_format]

| STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)]  — (Note: Available in Hive 0.6.0 and later)

]

[LOCATION hdfs_path]

语法解释:

  • 是否是外部表: EXTERNAL
  • 表格注释: COMMENT
  • 定义分区信息:PARTITIONED BY
  • 行格式化方式(1.决定了是否使用hive自带的序列化函数2.可用于指定属性分隔符): ROW FORMAT

创建表使用实例:

CREATE TABLE goods_price(

id INT,

name STRING,

price FLOAT

)

COMMENT ‘Goods table’

PARTITIONED BY(supplier STRING, class_name STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ‘,’

STORED AS TEXTFILE;

复制表结构:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

LIKE existing_table_or_view_name

[LOCATION hdfs_path];

使用实例:

create table if not exists copy_table like lesson1.goods_price;

截断表(保留表结构,删除数据):

TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:

(partition_column = partition_col_value, partition_column = partition_col_value, …)

使用实例(可指定一个partition_column,也可都指定):

truncate table copy_table partition (supplier=’yihaodian’,class_name=’shupian’);

truncate table copy_table partition (supplier=’yihaodian’);

删除表(任何删除动作都会删除相关的元数据):

DROP TABLE [IF EXISTS] table_name [PURGE];     — (Note: PURGE available in Hive 0.14.0 and later)

语法解释:

不指定PURGE,则被删除数据被移到.Trash/Current。

使用PURGE则直接删除(不可恢复)。

使用实例:

drop table if exists copy_table;

  • 修改表、分区、列

修改表名(保留表结构,删除数据):

ALTER TABLE table_name RENAME TO new_table_name;

使用实例:

alter table goods_price rename to new_goods_price;

增加表分区(未修改表结构,只是多了一个分区值):

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec

[LOCATION ‘location1’] partition_spec [LOCATION ‘location2′] …;

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, …)

使用实例:

alter table new_goods_price add if not exists partition (supplier=’taobao’,class_name=’shupian’);

alter table new_goods_price add if not exists partition (supplier=’jingdong’,class_name=’shupian’) location ‘/user/hive/warehouse/lesson1.db/goods_price/supplier=jingdong/class_name=shupian’;

表知识扩展——内部表和外部表

表类型 语句 是否将数据拷贝到warehouse 删除表是否删除数据
内部表 create table;
外部表 create external table;

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径。

内部表不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

表知识扩展——表分区

意义:避免全表扫描。Where语句采用分区限定的话,表查询会限制在分区内进行,提高效率和准确率。

  • 数据通过存储目录划分分区。
  • 指定多个分区时,hdfs上存储目录按照分区创建顺序形成树形结构。
  • 分区字段的选择:时间段、不同服务的数据、IP段等等。

两个分区时的二级树形存储目录(先supplier后class_name),由下图可见supplier目录是class_name的上级目录。

QQ截图20150330151934

2.数据操作语言(DML)

  • 文件数据导入表

命令:

LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]

语法解释:

  • 指定数据文件目录: INPATH
  • 覆盖原有数据: OVERWRITE
  • 指定分区(顺序无先后,但需要明确指定每一个分区)

partition(supplier=’yihaodian’,class_name=’niunai’);

使用实例:

load data local inpath ‘/tmp/20150313/niunai’ into table goods_price partition(supplier=’yihaodian’,class_name=’niunai’);

  • 查询结果数据插入表

命令(增加数据):

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …)] select_statement1 FROM from_statement;

使用实例:

insert into table copy_table partition(class_name=’niunai’,supplier=’yihaodian’) select id,name,price from goods_price;

命令(覆盖原有数据):

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …) [IF NOT EXISTS]] select_statement1 FROM from_statement;

使用实例:

insert overwrite table copy_table partition(class_name=’niunai’,supplier=’yihaodian’) select id,name,price from overwrite_table;

  • UPDATE&DELETE

命令:

UPDATE tablename SET column = value [, column = value …] [WHERE expression]

DELETE FROM tablename [WHERE expression]

使用实例:

Hive 0.14支持,目前最新发行版为Hive 0.13

 

安装HUE

Configuring CDH Components for Hue

参考:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_cdh_hue_configure.html

Hue install

HttpFS Configuration

配置HUE成为其他用户及组的代理,HUE将接管其他用户的任意动作。

HttpFS: Verify that /etc/hadoop-httpfs/conf/httpfs-site.xml has the following configuration:

Verify that core-site.xml has the following configuration:

如果需要新添上述参数,则要重启hadoop以生效。

root下编辑/etc/hue/conf.empty/hue.ini

更新hadoop.hdfs_clusters.default.webhdfs_url参数(直接在文中搜索webhdfs_url)。

将webhdfs_url参数改为如下(注意是14000端口):

Hive Configuration

HUE需要指向HiveServer2。因此需要更新hue.ini如下:

 Start Hue server

 

 

 

 

mysql (登录)权限

对于多个不同机器访问数据库的权限,需要在权限分配时指定其主机名,并同时指定密码。

如:hadoop02、hadoop03两台机器要登录mysql,需要赋权:

使用通配符无效,这一条不太科学。以后有机会再验证:

 

【翻译】Hive 架构设计

原文:https://cwiki.apache.org/confluence/display/Hive/Design

system_architecture

Hive 架构

图左展现了Hive的组件及其与hadoop的接口。

  • UI——用户接口。将用户查询或其他操作提交到系统。2011年以后拥有命令行接口及基于web的图形化接口。
  • Driver——接收查询的组件。它实现了会话操作的概念,提供了可基于JDBC/ODBC接口执行及获取API的模型。
  • Compiler——解析查询,在metastore的表和分区metadata的帮助下,对不同查询块、查询表达式进行语义分析,最终生成执行计划。
  • Metastore——存储仓库中不同表及分区,包括列及列属性的全部的结构信息。串行器及解串行器需要读写数据及存储对应数据的HDFS文件。
  • Execution Engine——执行Compiler产生的执行计划。执行计划是各阶段的有向无环图。执行引擎管理不同阶段的依赖,并在恰当的系统组件上执行前述阶段。

上图同时展现了一次查询的处理过程。UI调用了Driver的执行接口(step 1)。Driver创建了一个查询会话,并将查询发送给Compiler来生成执行计划(step 2)。Compiler从metastore中获取必要的元数据(steps 3和4)。元数据用来检查查询树中的表达式格式,并根据查询预期来削减分区。Compiler产生的执行计划(step 5)是map或reduce各种任务阶段的有向无环图,是一次元数据操作或者HDFS的操作。对map/reduce阶段来说,执行计划包含map的执行树(执行树在mappers上执行)以及reduce的执行树(需要reducers的操作)。执行引擎将各种状态提交给恰当的组件(steps 6, 6.1, 6.2 and 6.3)。每个任务中关联了表或中间输出的解串器被用于从HDFS中读取行,前述操作过程将通过相应的操作树。一旦产生了输出,结果会被串行器写入HDFS的临时文件(发生在不需要reduce的mapper中)。临时文件用于向随后的map/reduce执行计划阶段提供数据。DML操作的最终临时文件将被移动到表所在位置,保证脏数据不会被读取到。对于查询来讲,临时文件的内容是作为Driver获取命令的一部分,由执行引擎直接从HDFS读取的(steps 7、8和9)。

Hive 数据模型

Hive中的数据组织形式为:

  • 表——与关系型数据库中的表类似。可以过滤、投影、连接和合并。此外,表中所有数据存储在HDFS中。Hive同时支持外部表的概念,一个表可以在一个已存在的HDFS文件或目录上创建,方式是向表格创建DDL提供对应的目录。表内行的组织形式为各数据类型的列,与关系型数据库类似。
  • 分区——每个表可以拥有一到多个分区键,用来定义数据储存方式。例如:表T的数据分区ds用于存储日期,其数据文件在HDFS上存储目录为:<table location>/ds=<date>。分区使得系统可以通过查询预测减少检索的数据量。例如:一个针对T表中行的查询,如果符合T.ds = ‘2008-09-01’ 的预期,则仅需要查找 <table location>/ds=2008-09-01/ 目录下的文件。
  • 桶——(你们大学计算机数据结构课程的内容终于用上了!)请参考桶排序与哈希表的相关知识。在Hive中,每个桶作为分区目录中的一个文件存储。桶使得系统可以依据数据例子迅速定位查询(有一些查询是使用表上的SAMPLE字句完成的)。

除了常见的列数据类型(整数、浮点数、字符串、日期和布尔值),Hive同时支持数组和图。此外,用户可以组合基本类型来自定义数据类型。类型系统与序列化及对象检查器接口(object inspector interfaces)紧密捆绑。用户可以通过实现对象检查器来创建类型,使用对象检查器可以实现对象在HDFS上的序列化。前述两个接口使得Hive具有了扩展能力,使得Hive可以理解其他数据格式及复杂类型。内建对象检查器为创建复杂类型提供了基础类型。图和数组格式内建了诸如大小、索引等功能。内嵌数据类型通过圆点查看,例如a.b.c = 1, 这个公式查看了a的b域内的c域,并与1进行比较。

METASTORE

 动机

元数据存储提供了两个重要却常被忽视的数据仓库功能:数据抽象及数据发现。

数据抽象:如果没有Hive提供的数据抽象功能,用户需要在查询的时候同时提交数据格式、数据提取器及数据装载信息。在Hive中,前述数据在表创建时即给出,每次表被引用时都会重用。这与传统数据仓库很相似。

数据发现:使得用户可以发现及浏览数据仓库中的相关或者特定数据。可以使用元数据构建其他工具来对外提供数据,丰富数据信息,提高可用性等。

Hive通过提供元数据仓库实现了前述两大功能。元数据仓库服务与Hive查询进程紧密集成在一起,因此hive数据及其元数据是同步的。

Metadata Objects

  • 数据库——表命名空间。未来可用作管理单元。非用户提供的表将放入default数据库。
  • 表——一张表的元数据包括列的清单,所有人信息,存储信息,还包括序列化信息。还可以包含任何用户提供的键值、数据值。存储信息包含其下数据的存储路径、文件输入输出格式及桶信息。序列化信息包括串行器解串器的实现类,以及其他实现所需信息。所有信息都可以在建表时指定。
  • 分区——每个分区可以拥有自己的列、序列化及存储信息。

Metastore Architecture

元数据存储是数据库或文件对象的存储仓库。数据库备份仓库采用……(这段翻译的性价比有点低,意会吧)

Hive Query Language

HiveQL是类SQL语言。创建表,表载入数据,表查询上与SQL语法类似。允许用户嵌入MapReduce脚本。兼容任何语言编写的,使用简单行数据流接口的脚本——从标准输入读入行,向标准输出写入行。另一个HiveQL独有的特性是多表插入(理解为将一份输入看成多个表,提供给多个查询请求,而且其扫描过程还是共享的:扫一次,提供给多个查询)。这个概念中,用户可以对一个输入使用一条HiveQL语句执行多种查询。Hive优化了查询,可以在多个查询中共享对输入数据的扫描,这将查询的吞吐能力提高了几个量级。其他内容见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual。

Compiler

  • 语法分析器——将查询字符串转化为语法分析树的表述。
  • 语义分析器——将语法分析树转化为内部查询表述(依然基于块而不是执行树)。
  • 逻辑计划发生器——将内部查询表述转化为逻辑计划,逻辑计划由执行器的树组成。
  • 查询计划发生器——将逻辑计划转化为一系列的MapReduce任务。

 

 

cdh zookeeper安装

一、安装zookeeper包

在hadoop01~03上安装:

二、生成myid

hadoop01:

hadoop02:

hadoop03

三、编辑配置文件(以下是默认参数)

/etc/zookeeper/conf/zoo.cfg

四、测试zookeeper

 

参考:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_zookeeper_package_install.html