文档库 最新最全的文档下载
当前位置:文档库 › 基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十)

基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十)

基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十)
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十)

基于Hadoop生态圈的数据仓库实践—

—进阶技术(十)

十、杂项维度

本节讨论杂项维度。简单地说,杂项维度就是一种包含的数据具有很少可能值的维度。例如销售订单,它可能有很多离散数据(yes-no这种类型的值),如

verification_ind(如果订单已经被审核,值为yes)

credit_check_flag(表示此订单的客户信用状态是否已经检查)

new_customer_ind(如果这是新客户的首个订单,值为yes)

web_order_flag(表示此订单是否是在线下的订单)

这类数据常被用于增强销售分析,其特点是属性可能很多但每种属性的可能值很少,适合用称为杂项维度的特殊维度类型存储。

1. 新增销售订单属性杂项维度

给现有的数据仓库新增一个销售订单杂项维度,需要新增一个名为sales_order_attribute_dim的维度表。下图显示了增加杂项维度表后的数据仓库模式(这里只显示了和销售订单属性相关的表)。

新的维度表包括四个yes-no列:verification_ind、credit_check_flag、new_customer_ind和web_order_flag。每个列可以有两个可能值中的一个(Y 或N),因此sales_order_attribute_dim 表最多有16(2^4)行。可以预装载这个维度,并且只需装载一次。

注意,如果知道某种组合是不可能出现的,就不需要装载这种组合。执行下面的脚本修改数据库模式。这个脚本做了四项工作:建立sales_order_attribute_dim表,向表中预装载全部16种可能的数据,给销售订单事实表添加杂项维度代理键,给源数据库里的

sales_order表增加对应的四个属性列。

[sql] view plain copy

USE dw;

-- 建立杂项维度表

CREATE TABLE sales_order_attribute_dim (

sales_order_attribute_sk INT COMMENT 'sales order attribute surrogate key',

verification_ind CHAR(1) COMMENT 'verification index, Y or N',

credit_check_flag CHAR(1) COMMENT 'credit check flag, Y or N',

new_customer_ind CHAR(1) COMMENT 'new customer index, Y or N',

web_order_flag CHAR(1) COMMENT 'web order flag, Y or N',

version int COMMENT 'version',

effective_date DA TE COMMENT 'effective date',

expiry_date DA TE COMMENT 'expiry date'

)

clustered by (sales_order_attribute_sk) into 8 buckets

stored as orc tblproperties ('transactional'='true');

-- 生成杂项维度数据

INSERT INTO sales_order_attribute_dim V ALUES (1, 'Y', 'N', 'N', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (2, 'Y', 'Y', 'N', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim VALUES (3, 'Y', 'Y', 'Y', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (4, 'Y', 'Y', 'Y', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (5, 'Y', 'N', 'Y', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (6, 'Y', 'N', 'Y', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (7, 'Y', 'N', 'N', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (8, 'Y', 'Y', 'N', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (9, 'N', 'N', 'N', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim VALUES (10, 'N', 'Y', 'N', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (11, 'N', 'Y', 'Y', 'N', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim VALUES (12, 'N', 'Y', 'Y', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim V ALUES (13, 'N', 'N', 'Y', 'N', 1,'1900-00-00',

'2200-01-01');

INSERT INTO sales_order_attribute_dim VALUES (14, 'N', 'N', 'Y', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim VALUES (15, 'N', 'N', 'N', 'Y', 1,'1900-00-00', '2200-01-01');

INSERT INTO sales_order_attribute_dim VALUES (16, 'N', 'Y', 'N', 'Y', 1,'1900-00-00', '2200-01-01');

-- 建立杂项维度外键

alter table sales_order_fact rename to sales_order_fact_old;

create table sales_order_fact(

order_number int COMMENT 'order number',

customer_sk int COMMENT 'customer surrogate key',

product_sk int COMMENT 'product surrogate key',

sales_order_attribute_sk int COMMENT 'sales order attribute surrogate key',

order_date_sk int COMMENT 'order date surrogate key',

allocate_date_sk int COMMENT 'allocate date surrogate key',

allocate_quantity int COMMENT 'allocate quantity',

packing_date_sk int COMMENT 'packing date surrogate key',

packing_quantity int COMMENT 'packing quantity',

ship_date_sk int COMMENT 'ship date surrogate key',

ship_quantity int COMMENT 'ship quantity',

receive_date_sk int COMMENT 'receive date surrogate key',

receive_quantity int COMMENT 'receive quantity',

request_delivery_date_sk int COMMENT 'request delivery date surrogate key',

order_amount decimal(10,2) COMMENT 'order amount',

order_quantity int COMMENT 'order quantity')

clustered by (order_number) into 8 buckets

stored as orc tblproperties ('transactional'='true');

insert into table sales_order_fact

select order_number,

customer_sk,

product_sk,

null,

order_date_sk,

allocate_date_sk,

allocate_quantity,

packing_date_sk,

packing_quantity,

ship_date_sk,

ship_quantity,

receive_date_sk,

receive_quantity,

request_delivery_date_sk,

order_amount,

order_quantity

from sales_order_fact_old;

drop table sales_order_fact_old;

-- 给源库的销售订单表增加对应的属性

USE source;

ALTER TABLE sales_order

ADD verification_ind CHAR (1) AFTER product_code

, ADD credit_check_flag CHAR (1) AFTER verification_ind

, ADD new_customer_ind CHAR (1) AFTER credit_check_flag

, ADD web_order_flag CHAR (1) AFTER new_customer_ind ;

-- 给销售订单过渡表增加对应的属性

USE rds;

ALTER TABLE sales_order ADD COLUMNS

(

verification_ind CHAR(1) COMMENT 'verification index, Y or N',

credit_check_flag CHAR(1) COMMENT 'credit check flag, Y or N',

new_customer_ind CHAR(1) COMMENT 'new customer index, Y or N',

web_order_flag CHAR(1) COMMENT 'web order flag, Y or N'

) ;

2. 重建Sqoop作业

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

last_value=`sqoop job --show myjob_incremental_import --meta-connect jdbc:hsqldb:hsql://cdh2:16000/sqoop | grep https://www.wendangku.net/doc/f03682461.html,st.value | awk '{print $3}'`

sqoop job --delete myjob_incremental_import --meta-connect jdbc:hsqldb:hsql://cdh2:16000/sqoop

sqoop job \

--meta-connect jdbc:hsqldb:hsql://cdh2:16000/sqoop \

--create myjob_incremental_import \

-- \

import \

--connect "jdbc:mysql://cdh1:3306/source?useSSL=false&user=root&password=mypassword" \ --table sales_order \

--columns "order_number, customer_number, product_code, status_date, entry_date, order_amount, quantity, request_delivery_date, order_status, verification_ind, credit_check_flag, new_customer_ind, web_order_flag" \

--hive-import \

--hive-table rds.sales_order \

--incremental append \

--check-column id \

--last-value $last_value

3. 修改定期装载脚本

由于有了一个新的维度,必须修改定期装载脚本。下面显示了修改后的regular_etl.sql脚本文件内容。

[sql] view plain copy 在CODE上查看代码片派生到我的代码片

-- 设置变量以支持事务

set hive.support.concurrency=true;

set hive.exec.dynamic.partition.mode=nonstrict;

set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set https://www.wendangku.net/doc/f03682461.html,pactor.initiator.on=true;

set https://www.wendangku.net/doc/f03682461.html,pactor.worker.threads=1;

USE dw;

-- 设置SCD的生效时间和过期时间

SET hivevar:cur_date = CURRENT_DATE();

SET hivevar:pre_date = DA TE_ADD(${hivevar:cur_date},-1);

SET hivevar:max_date = CAST('2200-01-01' AS DA TE);

-- 设置CDC的上限时间

INSERT OVERWRITE TABLE rds.cdc_time SELECT last_load, ${hivevar:cur_date} FROM rds.cdc_time;

-- 装载customer维度

-- 设置已删除记录和地址相关列上SCD2的过期,用<=>运算符处理NULL值。UPDATE customer_dim

SET expiry_date = ${hivevar:pre_date}

WHERE customer_dim.customer_sk IN

(SELECT a.customer_sk

FROM (SELECT customer_sk,

customer_number,

customer_street_address,

customer_zip_code,

customer_city,

customer_state,

shipping_address,

shipping_zip_code,

shipping_city,

shipping_state

FROM customer_dim WHERE expiry_date = ${hivevar:max_date}) a LEFT JOIN rds.customer b ON a.customer_number = b.customer_number

WHERE b.customer_number IS NULL OR

( !(a.customer_street_address <=> b.customer_street_address)

OR !(a.customer_zip_code <=> b.customer_zip_code)

OR !(a.customer_city <=> b.customer_city)

OR !(a.customer_state <=> b.customer_state)

OR !(a.shipping_address <=> b.shipping_address)

OR !(a.shipping_zip_code <=> b.shipping_zip_code)

OR !(a.shipping_city <=> b.shipping_city)

OR !(a.shipping_state <=> b.shipping_state)

));

-- 处理customer_street_addresses列上SCD2的新增行

INSERT INTO customer_dim

SELECT

ROW_NUMBER() OVER (ORDER BY t1.customer_number) + t2.sk_max, t1.customer_number,

t1.customer_name,

t1.customer_street_address,

t1.customer_zip_code,

t1.customer_city,

t1.customer_state,

t1.shipping_address,

t1.shipping_zip_code,

t1.shipping_city,

t1.shipping_state,

t1.version,

t1.effective_date,

t1.expiry_date

FROM

(

SELECT

t2.customer_number customer_number,

t2.customer_name customer_name,

t2.customer_street_address customer_street_address,

t2.customer_zip_code customer_zip_code,

t2.customer_city customer_city,

t2.customer_state customer_state,

t2.shipping_address shipping_address,

t2.shipping_zip_code shipping_zip_code,

t2.shipping_city shipping_city,

t2.shipping_state shipping_state,

t1.version + 1 version,

${hivevar:pre_date} effective_date,

${hivevar:max_date} expiry_date

FROM customer_dim t1

INNER JOIN rds.customer t2

ON t1.customer_number = t2.customer_number

AND t1.expiry_date = ${hivevar:pre_date}

LEFT JOIN customer_dim t3

ON t1.customer_number = t3.customer_number

AND t3.expiry_date = ${hivevar:max_date}

WHERE (!(t1.customer_street_address <=> t2.customer_street_address)

OR !(t1.customer_zip_code <=> t2.customer_zip_code)

OR !(t1.customer_city <=> t2.customer_city)

OR !(t1.customer_state <=> t2.customer_state)

OR !(t1.shipping_address <=> t2.shipping_address)

OR !(t1.shipping_zip_code <=> t2.shipping_zip_code)

OR !(t1.shipping_city <=> t2.shipping_city)

OR !(t1.shipping_state <=> t2.shipping_state)

)

AND t3.customer_sk IS NULL) t1

CROSS JOIN

(SELECT COALESCE(MAX(customer_sk),0) sk_max FROM customer_dim) t2;

-- 处理customer_name列上的SCD1

-- 因为hive的update的set子句还不支持子查询,所以这里使用了一个临时表存储需要更新的记录,用先delete再insert代替update

-- 因为SCD1本身就不保存历史数据,所以这里更新维度表里的所有customer_name改变的记录,而不是仅仅更新当前版本的记录

DROP TABLE IF EXISTS tmp;

CREATE TABLE tmp AS

SELECT

a.customer_sk,

a.customer_number,

b.customer_name,

a.customer_street_address,

a.customer_zip_code,

a.customer_city,

a.customer_state,

a.shipping_address,

a.shipping_zip_code,

a.shipping_city,

a.shipping_state,

a.version,

a.effective_date,

a.expiry_date

FROM customer_dim a, rds.customer b

WHERE a.customer_number = b.customer_number AND !(a.customer_name <=> b.customer_name);

DELETE FROM customer_dim WHERE customer_dim.customer_sk IN (SELECT customer_sk FROM tmp);

INSERT INTO customer_dim SELECT * FROM tmp;

-- 处理新增的customer记录

INSERT INTO customer_dim

SELECT

ROW_NUMBER() OVER (ORDER BY t1.customer_number) + t2.sk_max,

t1.customer_number,

t1.customer_name,

t1.customer_street_address,

t1.customer_zip_code,

t1.customer_city,

t1.customer_state,

t1.shipping_address,

t1.shipping_zip_code,

t1.shipping_city,

t1.shipping_state,

1,

${hivevar:pre_date},

${hivevar:max_date}

FROM

(

SELECT t1.* FROM rds.customer t1 LEFT JOIN customer_dim t2 ON t1.customer_number = t2.customer_number

WHERE t2.customer_sk IS NULL) t1

CROSS JOIN

(SELECT COALESCE(MAX(customer_sk),0) sk_max FROM customer_dim) t2;

-- 重载PA客户维度

TRUNCATE TABLE pa_customer_dim;

INSERT INTO pa_customer_dim

SELECT

customer_sk

, customer_number

, customer_name

, customer_street_address

, customer_zip_code

, customer_city

, customer_state

, shipping_address

, shipping_zip_code

, shipping_city

, shipping_state

, version

, effective_date

, expiry_date

FROM customer_dim

WHERE customer_state = 'PA' ;

-- 装载product维度

-- 设置已删除记录和product_name、product_category列上SCD2的过期

UPDATE product_dim

SET expiry_date = ${hivevar:pre_date}

WHERE product_dim.product_sk IN

(SELECT a.product_sk

FROM (SELECT product_sk,product_code,product_name,product_category

FROM product_dim WHERE expiry_date = ${hivevar:max_date}) a LEFT JOIN rds.product b ON a.product_code = b.product_code

WHERE b.product_code IS NULL OR (a.product_name <> b.product_name OR a.product_category <> b.product_category));

-- 处理product_name、product_category列上SCD2的新增行

INSERT INTO product_dim

SELECT

ROW_NUMBER() OVER (ORDER BY t1.product_code) + t2.sk_max,

t1.product_code,

t1.product_name,

t1.product_category,

t1.version,

t1.effective_date,

t1.expiry_date

FROM

(

SELECT

t2.product_code product_code,

t2.product_name product_name,

t2.product_category product_category,

t1.version + 1 version,

${hivevar:pre_date} effective_date,

${hivevar:max_date} expiry_date

FROM product_dim t1

INNER JOIN rds.product t2

ON t1.product_code = t2.product_code

AND t1.expiry_date = ${hivevar:pre_date}

LEFT JOIN product_dim t3

ON t1.product_code = t3.product_code

AND t3.expiry_date = ${hivevar:max_date}

WHERE (t1.product_name <> t2.product_name OR t1.product_category <> t2.product_category) AND t3.product_sk IS NULL) t1

CROSS JOIN

(SELECT COALESCE(MAX(product_sk),0) sk_max FROM product_dim) t2;

-- 处理新增的product记录

INSERT INTO product_dim

SELECT

ROW_NUMBER() OVER (ORDER BY t1.product_code) + t2.sk_max,

t1.product_code,

t1.product_name,

t1.product_category,

1,

${hivevar:pre_date},

${hivevar:max_date}

FROM

(

SELECT t1.* FROM rds.product t1 LEFT JOIN product_dim t2 ON t1.product_code = t2.product_code

WHERE t2.product_sk IS NULL) t1

CROSS JOIN

(SELECT COALESCE(MAX(product_sk),0) sk_max FROM product_dim) t2;

-- 装载销售订单事实表

-- 前一天新增的销售订单

INSERT INTO sales_order_fact

SELECT

a.order_number,

customer_sk,

product_sk,

g.sales_order_attribute_sk,

e.order_date_sk,

null,

null,

null,

null,

null,

null,

null,

null,

f.request_delivery_date_sk,

order_amount,

quantity

FROM

rds.sales_order a,

customer_dim c,

product_dim d,

order_date_dim e,

request_delivery_date_dim f,

sales_order_attribute_dim g,

rds.cdc_time h

WHERE

a.order_status = 'N'

AND a.customer_number = c.customer_number

AND a.status_date >= c.effective_date

AND a.status_date < c.expiry_date

AND a.product_code = d.product_code

AND a.status_date >= d.effective_date

AND a.status_date < d.expiry_date

AND to_date(a.status_date) = e.order_date

AND to_date(a.request_delivery_date) = f.request_delivery_date AND a.verification_ind = g.verification_ind

AND a.credit_check_flag = g.credit_check_flag

AND a.new_customer_ind = g.new_customer_ind

AND a.web_order_flag = g.web_order_flag

AND a.entry_date >= https://www.wendangku.net/doc/f03682461.html,st_load AND a.entry_date < h.current_load ;

-- 处理分配库房、打包、配送和收货四个状态

DROP TABLE IF EXISTS tmp;

CREATE TABLE tmp AS

select t0.order_number order_number,

t0.customer_sk customer_sk,

t0.product_sk product_sk,

t0.sales_order_attribute_sk,

t0.order_date_sk order_date_sk,

t2.allocate_date_sk allocate_date_sk,

t1.quantity allocate_quantity,

t0.packing_date_sk packing_date_sk,

t0.packing_quantity packing_quantity,

t0.ship_date_sk ship_date_sk,

t0.ship_quantity ship_quantity,

t0.receive_date_sk receive_date_sk,

t0.receive_quantity receive_quantity,

t0.request_delivery_date_sk request_delivery_date_sk,

t0.order_amount order_amount,

t0.order_quantity order_quantity

from sales_order_fact t0,

rds.sales_order t1,

allocate_date_dim t2,

rds.cdc_time t4

where t0.order_number = t1.order_number and t1.order_status = 'A' and to_date(t1.status_date) = t2.allocate_date

and t1.entry_date >= https://www.wendangku.net/doc/f03682461.html,st_load and t1.entry_date < t4.current_load;

DELETE FROM sales_order_fact WHERE sales_order_fact.order_number IN (SELECT order_number FROM tmp);

INSERT INTO sales_order_fact SELECT * FROM tmp;

DROP TABLE IF EXISTS tmp;

CREATE TABLE tmp AS

select t0.order_number order_number,

t0.customer_sk customer_sk,

t0.product_sk product_sk,

t0.sales_order_attribute_sk,

t0.order_date_sk order_date_sk,

t0.allocate_date_sk allocate_date_sk,

t0.allocate_quantity allocate_quantity,

t2.packing_date_sk packing_date_sk,

t1.quantity packing_quantity,

t0.ship_date_sk ship_date_sk,

t0.ship_quantity ship_quantity,

t0.receive_date_sk receive_date_sk,

t0.receive_quantity receive_quantity,

t0.request_delivery_date_sk request_delivery_date_sk,

t0.order_amount order_amount,

t0.order_quantity order_quantity

from sales_order_fact t0,

rds.sales_order t1,

packing_date_dim t2,

rds.cdc_time t4

where t0.order_number = t1.order_number and t1.order_status = 'P'

and to_date(t1.status_date) = https://www.wendangku.net/doc/f03682461.html,ing_date

and t1.entry_date >= https://www.wendangku.net/doc/f03682461.html,st_load and t1.entry_date < t4.current_load;

DELETE FROM sales_order_fact WHERE sales_order_fact.order_number IN (SELECT order_number FROM tmp);

INSERT INTO sales_order_fact SELECT * FROM tmp;

DROP TABLE IF EXISTS tmp;

CREATE TABLE tmp AS

select t0.order_number order_number,

t0.customer_sk customer_sk,

t0.product_sk product_sk,

t0.sales_order_attribute_sk,

t0.order_date_sk order_date_sk,

t0.allocate_date_sk allocate_date_sk,

t0.allocate_quantity allocate_quantity,

t0.packing_date_sk packing_date_sk,

t0.packing_quantity packing_quantity,

t2.ship_date_sk ship_date_sk,

t1.quantity ship_quantity,

t0.receive_date_sk receive_date_sk,

t0.receive_quantity receive_quantity,

t0.request_delivery_date_sk request_delivery_date_sk,

t0.order_amount order_amount,

t0.order_quantity order_quantity

from sales_order_fact t0,

rds.sales_order t1,

ship_date_dim t2,

rds.cdc_time t4

where t0.order_number = t1.order_number and t1.order_status = 'S'

and to_date(t1.status_date) = t2.ship_date

and t1.entry_date >= https://www.wendangku.net/doc/f03682461.html,st_load and t1.entry_date < t4.current_load;

DELETE FROM sales_order_fact WHERE sales_order_fact.order_number IN (SELECT order_number FROM tmp);

INSERT INTO sales_order_fact SELECT * FROM tmp;

DROP TABLE IF EXISTS tmp;

CREATE TABLE tmp AS

select t0.order_number order_number,

t0.customer_sk customer_sk,

t0.product_sk product_sk,

t0.sales_order_attribute_sk,

t0.order_date_sk order_date_sk,

t0.allocate_date_sk allocate_date_sk,

t0.allocate_quantity allocate_quantity,

t0.packing_date_sk packing_date_sk,

t0.packing_quantity packing_quantity,

t0.ship_date_sk ship_date_sk,

t0.ship_quantity ship_quantity,

t2.receive_date_sk receive_date_sk,

t1.quantity receive_quantity,

t0.request_delivery_date_sk request_delivery_date_sk,

t0.order_amount order_amount,

t0.order_quantity order_quantity

from sales_order_fact t0,

rds.sales_order t1,

receive_date_dim t2,

rds.cdc_time t4

where t0.order_number = t1.order_number and t1.order_status = 'R'

and to_date(t1.status_date) = t2.receive_date

and t1.entry_date >= https://www.wendangku.net/doc/f03682461.html,st_load and t1.entry_date < t4.current_load;

DELETE FROM sales_order_fact WHERE sales_order_fact.order_number IN (SELECT order_number FROM tmp);

INSERT INTO sales_order_fact SELECT * FROM tmp;

-- 更新时间戳表的last_load字段

INSERT OVERWRITE TABLE rds.cdc_time SELECT current_load, current_load FROM rds.cdc_time;

4. 测试修改后的定期装载

(1)使用下面的脚本添加八个销售订单。

[sql] view plain copy 在CODE上查看代码片派生到我的代码片

USE source;

DROP TABLE IF EXISTS temp_sales_order_data;

CREATE TABLE temp_sales_order_data AS SELECT * FROM sales_order WHERE 1=0;

SET @start_date := unix_timestamp('2016-07-31');

SET @end_date := unix_timestamp('2016-08-01');

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (1, 133, 1, 1, 'Y', 'Y', 'N', 'Y', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (2, 134, 2, 2, 'N', 'N', 'N', 'N', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (3, 135, 3, 3, 'Y', 'Y', 'N', 'N', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (4, 136, 4, 4, 'Y', 'N', 'N', 'N', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (5, 137, 11, 1, 'N', 'Y', 'Y', 'Y', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (6, 138, 12, 2, 'N', 'Y', 'Y', 'N', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (7, 139, 13, 3, 'Y', 'Y', 'Y', 'N', @order_date, 'N', '2016-08-05', @order_date, @https://www.wendangku.net/doc/f03682461.html,mount, @quantity);

SET @order_date := from_unixtime(@start_date + rand() * (@end_date - @start_date));

SET @amount := floor(1000 + rand() * 9000);

SET @quantity := floor(10 + rand() * 90);

INSERT INTO temp_sales_order_data V ALUES (8, 140, 14, 4, 'Y', 'N', 'Y', 'N', @order_date, 'N', '2016-08-05', @order_date, @amount, @quantity);

INSERT INTO sales_order

select null,

@rn:=@rn+1,

customer_number,

product_code,

verification_ind,

credit_check_flag,

new_customer_ind,

web_order_flag,

status_date,

order_status,

request_delivery_date,

entry_date,

order_amount,

quantity

from temp_sales_order_data t1 ,(select @rn:=132) t2

order by t1.status_date;

COMMIT;

(2)执行定期装载

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

./regular_etl.sh

(3)验证结果

可以使用下面的分析性查询确认装载正确。该查询分析出检查了信用状态的新用户有所占的比例。

[sql] view plain copy 在CODE上查看代码片派生到我的代码片

USE dw;

SELECT CONCAT(ROUND(checked / (checked + not_checked) * 100),' % ')

FROM (SELECT sum(case when credit_check_flag='Y' then 1 else 0 end) checked,

sum(case when credit_check_flag='N' then 1 else 0 end) not_checked FROM sales_order_fact a, sales_order_attribute_dim b

WHERE new_customer_ind = 'Y'

AND a.sales_order_attribute_sk = b.sales_order_attribute_sk) t;

查询结果下图所示。

hadoop大数据技术与应用第1章练习题

第一章 一、单选题 1、下面哪个选项不属于Google的三驾马车?(C ) A、GFS B、MapReduce C、HDFS D、BigTable 2、大数据的数据量现在已经达到了哪个级别?(C ) A、GB B、TB C、PB D、ZB 3、2003年,Google公司发表了主要讲解海量数据的可靠存储方法的论文是?( A ) A、“The Google File System” B、“MapReduce: Simplified Data Processing on Large Clusters” C、“Bigtable: A Distributed Storage System for Structured Data” D、“The Hadoop File System” 4、下面哪个选项不是HDFS架构的组成部分?( C ) A、NameNode B、DataNode C、Jps D、SecondaryNameNode 5、Hadoop能够使用户轻松开发和运行处理大数据的应用程序,下面不属于Hadoop特性的是(C ) A、高可靠性、高容错性 B、高扩展性 C、高实时性 D、高效性 6、2004年,Google公司发表了主要讲解海量数据的高效计算方法的论文是?( B ) A、“The Google File System” B、“MapReduce: Simplified Data Processing on Large Clusters” C、“Bigtable: A Distributed Storage System for Structured Data” D、“The Hadoop File System” 7、建立在Hadoop文件系统之上的分布式的列式数据库?(A )

Hadoop大数据技术与应用04 YARN

单选题 1、以下选项哪个是YARN的组成部分?(A) A、Container、ResourceManager、NodeManager、ApplicationMaster B、Container、ResourceManager、NodeManager、ApplicationManager C、Container、ResourceManager、Scheduler、ApplicationMaster D、Container、ApplicationManager、NodeManager、ApplicationMaster 2、下列关于YARN的描述错误的是?(C) A、ResourceManager负责整个系统的资源分配和管理,是一个全局的资源管理器 B、NodeManager是每个节点上的资源和任务管理器 C、ApplicationManager是一个详细的框架库,它结合从ResourceManager 获得的资源和 NodeManager协同工作来运行和监控任务 D、调度器根据资源情况为应用程序分配封装在Container中的资源 3、下列关于调度器的描述不正确的是?(A) A、先进先出调度器可以是多队列 B、容器调度器其实是多个FIFO队列 C、公平调度器不允许管理员为每个队列单独设置调度策略 D、先进先出调度器以集群资源独占的方式运行作业 4、YARN哪种调度器采用的是单队列?(A) A、FIFO Scheduler B、Capacity Scheduler C、Fair Scheduler D、ResourceManager

1、YARN不仅支持MapReduce,还支持Spark,Strom等框架。 ( √ ) 2、Container是YARN中资源的抽象,它封装了某个节点上的多维度资源。 ( √ ) 3、YARN的三种调度器只有FIFO是属于单队列的。 ( √ ) 4、在YARN的整个工作过程中,Container是属于动态分配的。 ( √ )

一文读懂大数据:Hadoop,大数据技术、案例及相关应用

你想了解大数据,却对生涩的术语毫不知情?你想了解大数据的市场和应用,却又没有好的案例和解说?别担心,这本来自Wikibon社区的小书想要帮你。 是的,这是一本小书而不是一篇文章,因为它详实细致的让你从一个完全不了解大数据技术及相关应用的门外汉,变成一个熟知其概念和意义的“内行人”,所以它很棒! 主要内容 目录 1.来自Wikibon社区的大数据宣言 (1) 2.数据处理和分析:传统方式 (2) 3.大数据性质的变化 (3) 4.大数据处理和分析的新方法 (5) 4.1 Hadoop (5) 4.1.1 Hadoop如何工作 (6) 4.1.2 Hadoop的技术组件 (7) 4.1.3 Hadoop:优点和缺点 (8) 4.2 NoSQL (8) 4.3 大规模并行分析数据库 (9) 5.大数据方法的互补 (10) 6.大数据供应商发展状况 (12) 7.大数据:实际使用案例 (13) 8.大数据技能差距 (14) 9.大数据:企业和供应商的后续动作 (15) 1.来自Wikibon社区的大数据宣言 为公司提供有效的业务分析工具和技术是首席信息官的首要任务。有效的业务分析(从基本报告到高级的数据挖掘和预测分析)使得数据分析人员和业务人员都可以从数据中获得见解,当这些见解转化为行动,会给公司带来更高的效率和盈利能力。 所有业务分析都是基于数据的。传统意义上,这意味着企业自己创建和存储的结构化数据,如CRM系统中的客户数据,ERP系统中的运营数据,以及会计数据库

中的财务数据。得益于社交媒体和网络服务(如Facebook,Twitter),数据传感器以及网络设备,机器和人类产生的网上交易,以及其他来源的非结构化和半结构化的数据的普及,企业现有数据的体积和类型以及为追求最大商业价值而产生的近实时分析的需求正在迅速增加。我们称这些为大数据。 传统的数据管理和业务分析工具及技术都面临大数据的压力,与此同时帮助企业获得来自大数据分析见解的新方法不断涌现。这些新方法采取一种完全不同于传统工具和技术的方式进行数据处理、分析和应用。这些新方法包括开源框架Hadoop,NoSQL数据库(如Cassandra和Accumulo)以及大规模并行分析数据库(如EMC的Greenplum,惠普的Vertica和TeradataASTERData)。这意味着,企业也需要从技术和文化两个角度重新思考他们对待业务分析的方式。 对于大多数企业而言,这种转变并不容易,但对于接受转变并将大数据作为业务分析实践基石的企业来说,他们会拥有远远超过胆小对手的显著竞争优势。大数据助力复杂的业务分析可能为企业带来前所未有的关于客户行为以及动荡的市 场环境的深入洞察,使得他们能够更快速的做出数据驱动业务的决策,从而比竞争对手更有效率。 从存储及支持大数据处理的服务器端技术到为终端用户带来鲜活的新见解的前 端数据可视化工具,大数据的出现也为硬件、软件和服务供应商提供了显著的机会。这些帮助企业过渡到大数据实践者的供应商,无论是提供增加商业价值的大数据用例,还是发展让大数据变为现实的技术和服务,都将得到茁壮成长。 大数据是所有行业新的权威的竞争优势。认为大数据是昙花一现的企业和技术供应商很快就会发现自己需要很辛苦才能跟上那些提前思考的竞争对手的步伐。在我们看来,他们是非常危险的。对于那些理解并拥抱大数据现实的企业,新创新,高灵活性,以及高盈利能力的可能性几乎是无止境的。 2.数据处理和分析:传统方式 传统上,为了特定分析目的进行的数据处理都是基于相当静态的蓝图。通过常规的业务流程,企业通过CRM、ERP和财务系统等应用程序,创建基于稳定数据模型的结构化数据。数据集成工具用于从企业应用程序和事务型数据库中提取、转换和加载数据到一个临时区域,在这个临时区域进行数据质量检查和数据标准化,

01第一章 初识Hadoop大数据技术

第1章 初识Hadoop大数据技术 本章主要介绍大数据的时代背景,给出了大数据的概念、特征,还介绍了大数据相关问题的解决方案、Hadoop大数据技术以及Hadoop的应用案例。 本章的主要内容如下。 (1)大数据技术概述。 (2)Google的三篇论文及其思想。 (3)Hadoop概述。 (4)Hadoop生态圈。 (5)Hadoop的典型应用场景和应用架构。 1.1 大数据技术概述 1.1.1 大数据产生的背景 1946年,计算机诞生,当时的数据与应用紧密捆绑在文件中,彼此不分。19世纪60年代,IT系统规模和复杂度变大,数据与应用分离的需求开始产生,数据库技术开始萌芽并蓬勃发展,并在1990年后逐步统一到以关系型数据库为主导,具体发展阶段如图1-1所示。

Hadoop 大数据技术与应用 图1-1 数据管理技术在2001年前的两个发展阶段 2001年后,互联网迅速发展,数据量成倍递增。据统计,目前,超过150亿个设备连接到互联网,全球每秒钟发送290万封电子邮件,每天有2.88万小时视频上传到YouTube 网站,Facebook 网站每日评论达32亿条,每天上传照片近3亿张,每月处理数据总量约130万TB 。2016年全球产生数据量16.1ZB ,预计2020年将增长到35ZB (1ZB = 1百万,PB = 10亿TB ),如图1-2所示。 图1-2 IDC 数据量增长预测报告 2011年5月,EMC World 2011大会主题是“云计算相遇大数据”,会议除了聚焦EMC 公司一直倡导的云计算概念外,还抛出了“大数据”(BigData )的概念。2011年6月底,IBM 、麦肯锡等众多国外机构发布“大数据”相关研究报告,并予以积极的跟进。 19世纪60年代,IT 系统规模和复杂度变大,数据与应 用分离的需求开始产生,数据库技术开始萌芽并蓬勃发 展,并在1990年后逐步统一到以关系型数据库为主导 1946年,计算机诞生, 数据与应用紧密捆绑 在文件中,彼此不分 1946 1951 1956 1961 1970 1974 1979 1991 2001 … 网络型 E-R SQL 关系型数据库 数据仓库 第一台 计算机 ENIAC 面世 磁带+ 卡片 人工 管理 磁盘被发明,进入文件管理时代 GE 公司发明第一个网络模型数据库,但仅限于GE 自己 的主机 IBM E. F.Dodd 提出关系模型 SQL 语言被发明 ORACLE 发布第一个商用SQL 关系数据库,后续快速发展 数据仓库开始涌现,关系数据库开始全面普及且与平台无关,数据管理技术进入成熟期 0.8ZB :将一堆 DVD 堆起来够 地球到月亮一 个来回 35ZB :将一堆DVD 堆起来是地球到火星距离的一半 IDC 报告“Data Universe Study ” 预测:全世界数据量将从2009 年的0.8ZB 增长到2020年的 35ZB ,增长44倍!年均增 长率>40%!

大数据技术Hadoop面试题

大数据技术Hadoop面试题,看看你能答对多少? 单项选择题 1. 下面哪个程序负责HDFS 数据存储。 a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)tasktracker 2. HDfS 中的block 默认保存几份? a)3 份 b)2 份 c)1 份 d)不确定 3. 下列哪个程序通常与NameNode 在一个节点启动? a)SecondaryNameNode b)DataNode c)TaskTracker d)Jobtracker 4. Hadoop 作者 a)Martin Fowler b)Kent Beck c)Doug cutting 5. HDFS 默认Block Size a)32MB b)64MB c)128MB 6. 下列哪项通常是集群的最主要瓶颈 a)CPU b)网络 c)磁盘 d)内存 7. 关于SecondaryNameNode 哪项是正确的? a)它是NameNode 的热备 b)它对内存没有要求 c)它的目的是帮助NameNode 合并编辑日志,减少NameNode 启动时间 d)SecondaryNameNode 应与NameNode 部署到一个节点 多选题: 8. 下列哪项可以作为集群的管理工具 a)Puppet b)Pdsh c)Cloudera Manager d)d)Zookeeper

9. 配置机架感知的下面哪项正确 a)如果一个机架出问题,不会影响数据读写 b)写入数据的时候会写到不同机架的DataNode 中 c)MapReduce 会根据机架获取离自己比较近的网络数据 10. Client 端上传文件的时候下列哪项正确 a)数据经过NameNode 传递给DataNode b)Client 端将文件切分为Block,依次上传 c)Client 只上传数据到一台DataNode,然后由NameNode 负责Block 复制工作 11. 下列哪个是Hadoop 运行的模式 a)单机版 b)伪分布式 c)分布式 12. Cloudera 提供哪几种安装CDH 的方法 a)Cloudera manager b)Tar ball c)Yum d)Rpm 判断题: 13. Ganglia 不仅可以进行监控,也可以进行告警。() 14. Block Size 是不可以修改的。() 15. Nagios 不可以监控Hadoop 集群,因为它不提供Hadoop 支持。() 16. 如果NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。() 17. Cloudera CDH 是需要付费使用的。() 18. Hadoop 是Java 开发的,所以MapReduce 只支持Java 语言编写。() 19. Hadoop 支持数据的随机读写。() 20. NameNode 负责管理metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入metadata 信息并反馈client 端。() 21. NameNode 本地磁盘保存了Block 的位置信息。() 22. DataNode 通过长连接与NameNode 保持通信。() 23. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。() 24. Slave 节点要存储数据,所以它的磁盘越大越好。() 25. hadoop dfsadmin –report 命令用于检测HDFS 损坏块。() 26. Hadoop 默认调度器策略为FIFO() 27. 集群内每个节点都应该配RAID,这样避免单磁盘损坏,影响整个节点运行。() 28. 因为HDFS 有多个副本,所以NameNode 是不存在单点问题的。() 29. 每个map 槽就是一个线程。() 30. Mapreduce 的input split 就是一个block。() 31. NameNode 的Web UI 端口是50030,它通过jetty 启动的Web 服务。() 32. Hadoop 环境变量中的HADOOP_HEAPSIZE 用于设置所有Hadoop 守护线程的内存。它默认是200 GB。() 33. DataNode 首次加入cluster 的时候,如果log 中报告不兼容文件版本,那需要NameNode执行“Hadoop namenode -format”操作格式化磁盘。() 【编辑推荐】 没有数据分析大数据什么也不是...... 大数据告诉你,真正的白富美的生活是怎样的呢?

大数据技术之hadoop实战笔记

Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身。《Hadoop基础教程》是我读的第一本Hadoop书籍,当然在线只能试读第一章,不过对Hadoop历史、核心技术和应用场景有了初步了解。 ?Hadoop历史 雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。 随后在2003年Google发表了一篇技术学术论文谷歌文件系统(GFS)。GFS也就是google File System,google公司为了存储海量搜索数据而设计的专用文件系统。 2004年Nutch创始人Doug Cutting基于Google的GFS论文实现了分布式文件存储系统名为NDFS。 2004年Google又发表了一篇技术学术论文MapReduce。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行分析运算。 2005年Doug Cutting又基于MapReduce,在Nutch搜索引擎实现了该功能。 2006年,Yahoo雇用了Doug Cutting,Doug Cutting将NDFS和MapReduce 升级命名为Hadoop,Yahoo开建了一个独立的团队给Goug Cutting专门研究发展Hadoop。 不得不说Google和Yahoo对Hadoop的贡献功不可没。 ?Hadoop核心

Hadoop的核心就是HDFS和MapReduce,而两者只是理论基础,不是具体可使用的高级应用,Hadoop旗下有很多经典子项目,比如HBase、Hive等,这些都是基于HDFS和MapReduce发展出来的。要想了解Hadoop,就必须知道HDFS和MapReduce 是什么。 HDFS HDFS(Hadoop Distributed File System,Hadoop分布式文件系统),它是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集(large data set)的应用程序。 HDFS的设计特点是: 1、大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个G甚至更小就没啥意思了。 2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算机上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得多。 3、流式数据访问,一次写入多次读写,这种模式跟传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。 4、廉价硬件,HDFS可以应用在普通PC机上,这种机制能够让给一些公司用几十台廉价的计算机就可以撑起一个大数据集群。 5、硬件故障,HDFS认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。

Hadoop大数据开发实战-教学大纲

《Hadoop大数据开发基础》教学大纲课程名称:Hadoop大数据开发基础 课程类别:必修 适用专业:大数据技术类相关专业 总学时:48学时 总学分:3.0学分 一、课程的性质 本课程是为大数据技术类相关专业学生开设的课程。随着时代的发展,大数据已经成为一个耳熟能详的词汇。与此同时,针对大数据处理的新技术也在不断的开发和运用中,逐渐成为数据处理挖掘行业广泛使用的主流技术之一。Hadoop作为处理大数据的分布式存储和计算框架,得到了国内外大小型企业广泛的应用。Hadoop是一个可以搭建在廉价服务器上的分布式集群系统架构,它具有可用性高、容错性高和可扩展性高等优点。由于它提供了一个开放式的平台,用户可以在完全不了解底层实现细节的情形下,开发适合自身应用的分布式程序。经过十多年的发展,目前Hadoop已经成长为一个全栈式的大数据技术生态圈,并在事实上成为应用最广泛最具有代表性的大数据技术。因此,学习Hadoop技术是从事大数据行业工作所必不可少的一步。 二、课程的任务 通过本课程的学习,使学生学会搭建Hadoop完全分布式集群,掌握HDFS的原理和基础操作,掌握MapReduce原理架构、MapReduce程序的编写。为将来从事大数据挖掘研究工作以及后续课程的学习奠定基础。 三、教学内容及学时安排

四、考核方式 突出学生解决实际问题的能力,加强过程性考核。课程考核的成绩构成= 平时作业(20%)+ 课堂参与(10%)+ 期末考核(70%),期末考试建议采用开卷形式,试题应包括基本概念、基本理论、程序设计、综合应用等部分,题型可采用判断题、选择、简答、应用题等方式。

《Hadoop大数据技术与应用》课程教学大纲 - 20190422

Hadoop大数据技术与应用 (含实验) 教学大纲

前言 一、大纲编写依据 《Hadoop大数据技术与应用》是数据科学、大数据方向本科生的一门必修课。通过该课程的学习,使学生系统的学习当前广泛使用的大数据Hadoop平台及其主要组件的作用及使用。课程由理论及实践两部分组成,课程理论部分的内容以介绍Hadoop平台主要组件的作用、结构、工作流程为主,让学生对Hadoop平台组件的作用及其工作原理有比较深入的了解;课程同时为各组件设计有若干实验,帮助学生在学习理论知识的同时,提高学生的实践能力,系统的掌握Hadoop主要组件的原理及应用,为其他相关课程的学习提供必要的帮助。 二、课程目的 1、知识目标 学习Hadoop平台框架,学会手动搭建Hadoop环境,掌握Hadoop平台上存储及计算的原理、结构、工作流程,掌握基础的MapReduce编程,掌握Hadoop生态圈常用组件的作用、结构、配置和工作流程,并具备一定的动手及问题分析能力,使用掌握的知识应用到实际的项目实践中。 2、能力目标 (1) 工程师思维方式 通过本课程的学习,引导学生养成工程师逻辑思维、系统思维的思维方式及习惯。 (2) 分析及解决问题的能力 课程中实验由浅及深,有一定的步骤及难度,操作不当可能会遇到问题;遇到问题时老师会给出引导,但不会直接告诉解决方法,因此,如何分析、分析完成后实施具体的解决步骤,都需要学生摸索完成,在这个摸索实践过程中,学生的分析及解决问题的能力得到培养。 三、教学方法 1、课堂教学 (1) 讲授

本课程的理论教学内容以讲授为主、辅以操作演示,讲授的主要内容有:Hadoop概述,Hadoop安装部署,分布式文件系统HDFS,分布式计算MapReduce,资源管理调度组件YARN,列式存储HBase,数据仓库组件Hive,数据分析引擎Pig,日志采集组件Flume等。根据教学大纲的要求,突出重点和难点。 (2) 教师指导下的学生自学 实践课程由若干实验组成,每个实验都包含实验目的、实验原理、实验环境等,需要学生结合理论知识,充分发挥自主学习的能力来完成实验,老师在这个过程中更多起到辅导的作用。 (3) 其它教学方法 采用多媒体辅助教学手段、提供实验相关视频,结合传统教学方法,解决好教学内容多、信息量大与学时少的矛盾;充分利用教学实验系统EDU资源和学校的图书馆的资源优势,查阅与课程相关的资料;通过辅导学生完成实验来提高学生的综合处理问题的能力和软件开发的能力。 2、课外学习 作业1:课外练习。 作业2:上机实验报告。 四、适用对象 数据科学与大数据技术、计算机科学与技术、软件工程、信息安全、信息管理、网络、数学、统计学专业。 五、先修课程及后续课程(或相关课程) 先修课程:《高级语言程序设计(Java)》、《Linux》、《大数据导论》、《数据库原理》; 后续课程:《数据挖掘》、《Spark大数据技术与应用》 六、课程性质 必修。 七、总课时及各章的分配

文秘知识-浅谈大数据Hadoop技术 精品

浅谈大数据Hadoop技术 摘要:随着移动互联网、物联网、共享经济的高速发展,互联网每天都会产生数以万亿 的数据,这些海量数据被称作为大数据。在这个大数据时代,数据资源对我们生活产 生了巨大影响,对企业经营决策也有着前瞻性指导意义。因此,大数据已经被视为一 种财富、一种被衡量和计算价值的不可或缺的战略资源。该文从大数据Hadoop技术谈起、分别从Hadoop的核心技术、生态系统和Hadoop技术在教学中的应用四个方面进 行了阐述。 关键词:大数据;Hadoop; HDFS; MapReduce 中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2019)32-0010-02 当前,我国以信息技术为主导的创新经济高速发展,特别是依托于移动互联网和物联 网技术的网络购物、移动支付、共享单车、微信通信交流等等,给人们生活方式带来 了深刻的变革。整个互联网正在从IT(Information Technology)时代向DT(Data Technology)时代D变,在这个DT时代,人们从被动的数据浏览者转变为主动的数据 生产者,人们每天的网络购物信息、各种电子支付信息、使用共享单车信息、微信中 浏览朋友圈的信息等等,都会产生数以万亿级的数据,这样庞大的数据如何存储、如 何传输、如何计算、如何分析、如何保证数据的完整性和安全性等等一系列新的技术 挑战应运而生。然而,Hadoop技术代表着最新的大数据处理所需的新的技术和方法, 也代表着大数据分析和应用所带来的新发明、新服务和新的发展机遇。 1 什么是Hadoop Hadoop是一个由Apache基金会所开发的,开源的分布式系统基础架构。简单地说就是一套免费的分布式操作系统。我们以前使用的计算机系统,都是安装在一台独立主机 上的单机版操作系统。例如我们熟知的微软公司的Windows操作系统和苹果公司的Mac OS。而分布式系统则是通过高速网络把大量分布在不同地理位置、不同型号、不同硬 件架构、不同容量的服务器主机连结在一起,形成一个服务器集群。分布式系统把集 群中所有硬件资源(CPU、硬盘、内存和网络带宽)进行整合统一管理,形成具有极高 运算能力,庞大存储能力和高速的传输能力的系统。 Hadoop就是以Linux系统为原型开发的大数据分布式系统。Hadoop具有很强的扩展性,只要是接通网络它就可以不断加入不同地域、不同型号、不同性能的服务器主机,以 提升集群的运算、存储和网络带宽,以满足大数据所需要的硬件要求。此外,Hadoop 还具有极强的安全性,由于分布式系统数据是存储在不同物理主机上的,而且Hadoop 数据一般每个数据存储三份,而且分布不同物理主机上,一旦其中一份数据损坏,其 余正常数据会很快替代它,这样很好地解决了数据完整性和安全性问题,为大数据提 供了安全高速稳定的系统平台。

大数据技术基础-安装-hadoop-过程

1、虚拟机安装 运行“VirtualBox-5.2.12-122591-Win” 新建虚拟机 选择专家模式

输入master,选择linux,ubuntu(64-bit),设置内存1G,点击创建。

1.vdi格式:VirtualBox默认创建的硬盘文件格式,(关于VirtualBox 原是德国一家软件公司InnoTek 所开发的虚拟系统软件,后被SUN收购,而后SUN又被Oracle收购,VirtualBox 是一款功能强大的虚拟机软件,不仅具有丰富的特色,而且性能也很优异) 2.vmdk格式:VMware创建的虚拟硬盘文件格式,(关于VMware,在虚拟机领域可以说是全球最牛B的 公司,目前为EMC的全资子公司) 3.vhd格式:为微软虚拟机硬盘文件格式,(关于微软虚拟机技术,从最初的VPC, VServer2005r2 ,Hyper-v2008,Hyper-v2008R2,到这会的hyper-v 8beta,历经多重改进,在新版本的Hyper-v 8beta中,将会发现有非常令人Exciting 的Feature,如新的硬盘格式VHDX的出现,空间技术从2T提升至16T,保护数据并确保大型扇区磁盘上的质量性能等) 这个格式在安装完成后可以通过命令互相转化。 注意:第一次启动虚拟机选择安装介质时指定安装数据源文件的正确性。

VirtualBox创建的虚拟硬盘文件是vdi格式的,默认安装即可。用户/密码:hadoop/hadoop

点击创建 虚拟机创建完成。

2、启动master虚拟机 检查VirtualBox增强功能包(VBoxGuestAdditions)是否完成安装。 虚拟机启动后,设备菜单下-》安装增强功能。

相关文档
相关文档 最新文档