不久前,我在他们的云下为Google激活了免费试用版,但我没有解决我的问题,原来Google在试用期内提供了12个月300美元的费用,但与我的预期相反,除预算限制外还施加了其他限制。 例如,我不允许在一个区域中使用超过8个vcpu的虚拟机。 半年后,我决定使用试用预算来熟悉dataproc,它是Google预先安装的hadup集群。 任务是尝试评估对我来说,通过Google的访问权限启动一个项目有多容易,不管是有意义还是更好地立即专注于我的硬件并仔细考虑管理。 我有一种模糊的感觉,现代硬件和大数据堆栈应轻松适应数十或数百GB的小型数据库,如果不是整个数据集,则将其残酷地加载到群集的内存中。 数据集市可能不再需要一些单独的子数据。
简而言之,与Oracle和Cloudera相比,dataproc的启动和设置简便性给他们留下了深刻的印象。 在第一阶段,我使用了8 vCpu上的一个节点集群,最大集群允许完全免费的试用。 如果您看简单,那么他们的技术已经使印度教徒能够在15分钟内启动集群,使用常规BI工具加载示例数据并准备报告,而无需任何中间子窗口。 不再需要对Hadoup的深入了解。
原则上,我认为事情对于快速入门来说是一件很棒的事情,而且您可以花很多钱才能运行原型,评估任务所需的硬件类型。 但是,在数十个节点中的较大集群显然会比出租+几个正在看着集群的管理员吃得多。 云在经济上看起来可行的事实远非如此。 第一步,我尝试使用一个节点群集8 vCpu和0.5 TB的原始数据评估一个完全微型的选项。 原则上,Internet上已经对大型集群进行了spark + hadoop测试,但我计划稍后再测试该选项。
在短短一个小时内,我搜索了用于创建群集备份,配置其防火墙和配置thrift服务器的脚本,这使jdbc可以从家用Windows连接到spark sql。 我花了另外两个或三个小时来优化默认的火花设置,并加载几个约10 GB(Oracle中数据文件的大小)的小表。 我将整个表推送到内存中(更改表缓存;),并且有可能在Dbeaver和Tableau的Windows计算机上使用它们(通过spark sql连接器)使用它们。
默认情况下,spark在4个vCpu上仅使用了1个执行程序,我编辑了spark-defaults.conf,安装了3个执行程序,每个安装了2个vCpu,而且很长一段时间我不明白为什么我的工作中实际上只有1个执行程序。 原来,我没有编辑内存,另外两根纱线根本无法分配内存。 我在执行器上设置了6.5 GB,然后这三个值都开始按预期增长。
接下来,我决定玩一些更严肃的游戏,并完成一项更接近TPC-DS测试中DWH的任务。 首先,我正式使用官方工具的比例因子500生成了表格,并获得了480 GB的原始数据(定界文本)。 TPC-DS测试是典型的DWH,具有事实和尺寸。 我不明白如何直接在Google存储上生成数据,我不得不在磁盘上生成虚拟机,然后将其复制到Google存储上。 据我了解,Google相信该引擎罩可与google存储完美配合,并且那里的速度比数据位于HDFS集群中的情况要好一些。 在这种情况下,部分负载将从HDFS转移到Google存储空间。
通过Dbeaver进行连接后,我使用SQL命令将文本文件转换为具有活泼包装的基于镶木地板的平板电脑。 480 GB的文本数据打包成187 GB的镶木文件。 该过程耗时约两个小时,文本中最大的表格占用了188 GB,3个火花执行者在74分钟内将它们变成了实木复合地板,SUV的大小为66.8 GB。 在具有大约相同的8 vcpu(i7-3770k)的台式机上,我认为“插入表选择* ...”到具有8k块的Oracle表中将需要一天的时间,而要想想要多少数据文件甚至让人难以想象。

接下来,我检查了在这种配置下BI工具的性能,并在Tableua中构建了一个简单的报告

至于查询,TPC-DS测试中的Query1
查询1WITH customer_total_return AS (SELECT sr_customer_sk AS ctr_customer_sk, sr_store_sk AS ctr_store_sk, Sum(sr_return_amt) AS ctr_total_return FROM store_returns, date_dim WHERE sr_returned_date_sk = d_date_sk AND d_year = 2001 GROUP BY sr_customer_sk, sr_store_sk) SELECT c_customer_id FROM customer_total_return ctr1, store, customer WHERE ctr1.ctr_total_return > (SELECT Avg(ctr_total_return) * 1.2 FROM customer_total_return ctr2 WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk) AND s_store_sk = ctr1.ctr_store_sk AND s_state = 'TN' AND ctr1.ctr_customer_sk = c_customer_sk ORDER BY c_customer_id LIMIT 100;
在最大的表(catalog_sales,web_sales)的参与下,Query2在1:08中完成
查询2 WITH wscs AS (SELECT sold_date_sk, sales_price FROM (SELECT ws_sold_date_sk sold_date_sk, ws_ext_sales_price sales_price FROM web_sales) UNION ALL (SELECT cs_sold_date_sk sold_date_sk, cs_ext_sales_price sales_price FROM catalog_sales)), wswscs AS (SELECT d_week_seq, Sum(CASE WHEN ( d_day_name = 'Sunday' ) THEN sales_price ELSE NULL END) sun_sales, Sum(CASE WHEN ( d_day_name = 'Monday' ) THEN sales_price ELSE NULL END) mon_sales, Sum(CASE WHEN ( d_day_name = 'Tuesday' ) THEN sales_price ELSE NULL END) tue_sales, Sum(CASE WHEN ( d_day_name = 'Wednesday' ) THEN sales_price ELSE NULL END) wed_sales, Sum(CASE WHEN ( d_day_name = 'Thursday' ) THEN sales_price ELSE NULL END) thu_sales, Sum(CASE WHEN ( d_day_name = 'Friday' ) THEN sales_price ELSE NULL END) fri_sales, Sum(CASE WHEN ( d_day_name = 'Saturday' ) THEN sales_price ELSE NULL END) sat_sales FROM wscs, date_dim WHERE d_date_sk = sold_date_sk GROUP BY d_week_seq) SELECT d_week_seq1, Round(sun_sales1 / sun_sales2, 2), Round(mon_sales1 / mon_sales2, 2), Round(tue_sales1 / tue_sales2, 2), Round(wed_sales1 / wed_sales2, 2), Round(thu_sales1 / thu_sales2, 2), Round(fri_sales1 / fri_sales2, 2), Round(sat_sales1 / sat_sales2, 2) FROM (SELECT wswscs.d_week_seq d_week_seq1, sun_sales sun_sales1, mon_sales mon_sales1, tue_sales tue_sales1, wed_sales wed_sales1, thu_sales thu_sales1, fri_sales fri_sales1, sat_sales sat_sales1 FROM wswscs, date_dim WHERE date_dim.d_week_seq = wswscs.d_week_seq AND d_year = 1998) y, (SELECT wswscs.d_week_seq d_week_seq2, sun_sales sun_sales2, mon_sales mon_sales2, tue_sales tue_sales2, wed_sales wed_sales2, thu_sales thu_sales2, fri_sales fri_sales2, sat_sales sat_sales2 FROM wswscs, date_dim WHERE date_dim.d_week_seq = wswscs.d_week_seq AND d_year = 1998 + 1) z WHERE d_week_seq1 = d_week_seq2 - 53 ORDER BY d_week_seq1;
在4:33分钟内完成,在Query3中完成3.6,在Query4中完成32分钟。
如果有人对设置感兴趣,请在“剪切下”下注意创建集群。 原则上,只有几个gcloud命令和HIVE_SERVER2_THRIFT_PORT设置。
注意事项一节点集群选项:
gcloud dataproc --region europe-north1集群创建test1 \
-子网默认\
--bucket tape1 \
--zone europe-north1-a \
-单节点\
--master-machine型n1-highmem-8
--master-boot-disk-size 500 \
--image-version 1.3 \
--initialization-actions gs://dataproc-initialization-actions/hue/hue.sh \
--initialization-actions gs://dataproc-initialization-actions/zeppelin/zeppelin.sh \
--initialization-actions gs://dataproc-initialization-actions/hive-hcatalog/hive-hcatalog.sh \
-项目123
3个节点的选项:
gcloud dataproc --region europe-north1集群\
创建cluster-test1 --bucket tape1 \
--subnet默认--zone europe-north1-a \
--master-machine-type n1-standard-1 \
--master-boot-disk-size 10 --num-workers 2 \
--worker-machine-type n1-standard-1 --worker-boot-disk-size 10 \
--initialization-actions gs://dataproc-initialization-actions/hue/hue.sh \
--initialization-actions gs://dataproc-initialization-actions/zeppelin/zeppelin.sh \
--initialization-actions gs://dataproc-initialization-actions/hive-hcatalog/hive-hcatalog.sh \
-项目123
gcloud compute --project = 123 \
防火墙规则创建allow-dataproc \
--direction = INGRESS-优先级= 1000 --network =默认\
--action = ALLOW --rules = tcp:8088,tcp:50070,tcp:8080,tcp:10010,tcp:10000 \
--source-ranges = xxx.xxx.xxx.xxx / 32 --target-tags = dataproc
在主节点上:
苏多苏-vi /usr/lib/spark/conf/spark-env.sh
更改:export HIVE_SERVER2_THRIFT_PORT = 10010
须藤-u spark /usr/lib/spark/sbin/start-thriftserver.sh
待续...