搭乘阿里云Data Lake Analytics快车,探索区块链大数据世界

  1. 云栖社区>
  2. 博客>
  3. 正文

搭乘阿里云Data Lake Analytics快车,探索区块链大数据世界

ap6371e0f 2018-07-31 17:24:52 浏览2403
展开阅读全文


笔者创业做推广方向的大数据业务,之前一个很大的问题就是离线数据、冷备数据的处理问题。

像我们每天要抓取几亿条苹果应用市场的搜索结果数据,出于成本考虑,一般线上DB就存1个月的数据,历史数据一般都备份在阿里云存储OSS上,需要用的时候再导入到DB或者Hadoop集群上。还有如用户点击日志数据,如果不是财大气粗,一般也都是采用了类似的模式。这种方法很大的问题就是流程麻烦,需要大量的ETL导入导出工作。但目前数据运营的要求越来越高,像历史数据回溯分析等需求非常频繁,耗费了大量开发同学的精力。

而阿里云Data Lake Analytics的出现,给人眼前一亮的感觉,现在可以直接用兼容MySQL的简单易用的数据库体验的方式来查询、分析OSS上的数据了!这就让大数据的分析变得易如反掌,由于性能也不错,甚至在一定范围内,还能直接支持一部分的线上业务。

这里就结合一个区块链日志大数据分析的例子,分享下我们的使用心得。之所以选择区块链数据,主要其数据量大,可以完整展示Data Lake的特性。再者因为其开放性,所有数据都是公开的。

实验数据集

本文的数据集为以太坊(Ethereum)的截止2018年6月的全部数据,由于目前超过80%的DApp都部署在以太坊上,其数据分析、挖掘的价值也非常高。

以太坊的数据逻辑上就是一个一个链接起来的“数据块(block)”,每个数据块包含了具体的“交易”(transaction)数据。交易类似我们一般的访问日志,包括From(来源用户地址),To(目标用户地址),data(发送的数据)等字段,如用户之间发送以太币,用户调用以太坊的程序(智能合约),都是通过“交易”的形式完成。我们的实验数据集约有500万条“区块”数据,1.7亿条“交易”数据。

从Ethscan.io上可以直观的看出以太坊的数据结构,具体如下图所示:

ec5cf59a7d805d788bf08b4f2c6528333f472331

图1 以太坊数据结构,左侧为区块,右侧为区块内的交易数据

本文完成时(2018年7月25日),以太坊共有约600万个块,总计超过2亿条交易数据。由于目前数字通证(Token,俗称虚拟币)仍是主要的应用,我们也把交易数据中的Token应用数据专门拿出来,基于这些数据,也可以分析价值万亿美元的虚拟货币交易行为。

数据获取流程

获得以太坊数据的流程大致分为3步。全部流程均在阿里云Centos 7 64位ECS服务器环境下进行,建议购置两个200G的数据盘,一个放以太坊原始数据,一个放置从以太坊导出的数据,内存至少4G。

步骤1 搭建以太坊全节点

下载geth客户端,从https://geth.ethereum.org/downloads/ 下载linux 64位

wget  https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.12-37685930.tar.gz

解压缩后得到geth程序,直接运行即可,相当于连接到了公链。

运行命令:

nohup ./geth --datadir ./data/ --cache=1024 &

注意事项:

a.国内节点较少,可能需要手动添加静态节点。可参考

https://ethfans.org/wikis/%E6%98%9F%E7%81%AB%E8%8A%82%E7%82%B9%E8%AE%A1%E5%88%92%E4%BB%8B%E7%BB%8D

b.启动时需要设置datadir目录,否则会设置到系统盘下

c 如果启动正常,国内大概需要一天就能把全部数据下载完成。数据目录下大约有100+G的数据。

可以按照如下流程查看数据同步的进度:

1 进入geth的命令行环境,Linux shell下执行:

./geth attach ipc:./data/geth.ipc

2 然后输入以太坊命令查看同步,在geth命令行环境中输入:

eth.syncing

结果如下图所示:

f90cb05a03f944a4cace9fc8684eac98543b8e21

图 2 以太坊eth命令行环境执行命令

其中currentBlock为当前同步的块,highestBlock为以太坊当前最新的块。

为了方便读者使用,我们把geth客户端和静态节点配置文件都放在了文末的git上,可以直接执行start.sh 开始同步数据。完整的geth环境目录结构如下:

c319a104fc976f7c48046c1321f0bd0ea812d1d3

图 3 以太坊客户端目录结构

步骤2 使用第三方程序,把以太坊数据导出为csv格式。

我们使用的是Ethereum ETL,直接从github上下载安装即可:

git clone https://github.com/medvedev1088/ethereum-etl

运行该程序,需要安装python3,最好是python36,同时还需要pip3

目前阿里云centos源还没有python36,安装可参照:

http://blog.51cto.com/wenguonideshou/2083301

 

python36和pip3安装完成后,执行下面命令:

cd ethereum-etl

pip3 install -r requirements.txt

 

全部安装完成之后,就可以把以太坊的数据到导出为csv格式了

在ethereum-etl目录下执体命令:

nohup bash export_all.sh -s 0 -e 5775105 -b 100000 -i data/geth.ipc -o output &

其中-s 参数为开始区块链号

-e 为结束区块链号

-b 为多少个block生成一个文件

-i 为以太坊rpc文件位置,和上一步启动以太坊命令行attach参数后面跟的文件保持一致即可

-o 为导出文件输出目录

 

注意,需要等以太坊客户端同步到至少500万个块之后,再执行该操作,下载工作大概10个小时左右。

导出文件目录假设为output,该目录下的数据文件如下所示:

21b87d3fe3070f33f90f542688b1fd214dce82a8

图4 输出的区块链数据

其中blocks_ 开头的为区块的数据

erc20_transfers_ 开头的为token的交易数据

transactions_ 开头的为所有交易数据

 

步骤3 把导出的csv格式数据导入阿里云的云存储oss上

我们需要把所有相同类型的文件,放入阿里云oss的同一个目录下

例如本文中oss设置为:

区块数据放在oss://ethblock/export/blocks/

全部交易数据放在 oss://ethblock/export/transactions/

token交易数据放在 oss://ethblock/export/erc20_transfers 下

相关的目录需要预先创建,然后下载oss的命令行程序ossutil(建议把这个程序复制到/usr/bin下,可以不加路径直接执行)。具体参考:https://help.aliyun.com/document_detail/50452.html

完成oss相关配置后,就可以把太坊所有的数据上传到OSS上了。在ethereum-etl目录下执行命令:

ossutil cp -r output oss://ethblock/export/blocks --include "blocks_*"

ossutil cp -r output oss://ethblock/export/transactions --include "transactions_*"

ossutil cp -r output oss://ethblock/export/erc20_transfers --include "erc20_*"   

上面三个命令,是把同类型的文件,传到OSS对应目录上,同时保持原有的目录结构。

oss上的文件组织结构大致如下所示:

5685e0ce1d9ac5b6d0b4c5f4869cea4f87b91087

图 5 oss上的目录结构

类似“start_block=00000…”这种目录结构,主要是为了兼容HIVE的分区命名格式.

文件上传完成后,就可以使用Data Lake Analytics分析服务了

(注:分区对很多查询速度影响不大,还可能涉及后续添加文件的分区更新问题,可以简单把同类型文件放到一个文件夹下也可以,不带HIVE的目录结构,使用如下这样的命令即可:

find -name "*blocks_*.csv"|xargs -i ossutil cp {} oss://ethblock/export/blocks/ )

Data Lake Analytics建表

数据上传到oss后,就可以基于Data Lake Analytics建表了。Data Lake Analytics和开源HIVEPresto等软件集群服务不太一样的是,Data Lake Analytics采用的是无服务器化技术,实际数据和数据表是没有直接联系的,用户也不用关心分析计算服务后面使用了多少资源,用户只需要按照查询涉及的扫描数据量付费。这样只需要使用DDL语句建表,给Data Lake Analytics说明OSS存储的数据结构,就可以直接使用兼容MySQL的手段查询OSS上的数据了,无需额外数据转化、导入等流程。

目前Data Lake Analytics还需要先申请才能使用,具体参见

https://www.aliyun.com/product/datalakeanalytics

   

我们以导入到OSS上的以太坊区块链数据为例,看看如何使用Data Lake Analytics.

如上所述,使用Data Lake Analytics查询OSS数据,只要一个步骤,就是建立DDL,给Data Lake Analytics说明OSS上的文件数据格式即可。具体语法和Hadoop HIVE基本一致。

以下操作均在阿里云的Data Lake Analytics DMS控制台中运行:

首先是创建一个schema,类似于创建一个数据库,使用命令:

create schema ethereumetl;

(注意,schema名称是阿里云一个区域全局的,使用时需要换一个特别的名称,防止重复)

然后使用该数据库即可,使用命令:

use ethereumetl;

 

再者就是建表了,对应OSS的三个目录,我们分别建3个表,分别使用3个建表命令。

首先是建立blocks表, 用来描述区块的数据格式:

CREATE EXTERNAL TABLE IF NOT EXISTS blocks (

    block_number BIGINT,

    block_hash STRING,

    block_parent_hash STRING,

    block_nonce STRING,

    block_sha3_uncles STRING,

    block_logs_bloom STRING,

    block_transactions_root STRING,

    block_state_root STRING,

    block_miner STRING,

    block_difficulty DECIMAL(38,0),

    block_total_difficulty DECIMAL(38,0),

    block_size BIGINT,

    block_extra_data STRING,

    block_gas_limit BIGINT,

    block_gas_used BIGINT,

    block_timestamp BIGINT,

    block_transaction_count BIGINT

)

PARTITIONED BY (start_block BIGINT, end_block BIGINT)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

WITH SERDEPROPERTIES (

    'serialization.format' = ',',

    'field.delim' = ',',

    'escape.delim' = '\\'

)

STORED AS TEXTFILE

LOCATION 'oss://ethblock/export/blocks'

TBLPROPERTIES (

  'skip.header.line.count' = '1'

);

 

由于使用了分区,我们还需要同步分区信息,执行如下命令:

MSCK REPAIR TABLE blocks;

(注意,需要把LOCATION换成你自己的OSS位置)

 

然后是transactions表,用来描述交易的数据:

CREATE EXTERNAL TABLE IF NOT EXISTS transactions (

    tx_hash STRING,

    tx_nonce BIGINT,

    tx_block_hash STRING,

    tx_block_number BIGINT,

    tx_index BIGINT,

    tx_from STRING,

    tx_to STRING,

    tx_value DECIMAL(38,0),

    tx_gas BIGINT,

    tx_gas_price BIGINT,

    tx_input STRING 

)

PARTITIONED BY (start_block BIGINT, end_block BIGINT)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

WITH SERDEPROPERTIES (

    'serialization.format' = ',',

    'field.delim' = ',',

    'escape.delim' = '\\'

)

STORED AS TEXTFILE

LOCATION 'oss://ethblock/export/transactions'

TBLPROPERTIES (

  'skip.header.line.count' = '1'

);

 

然后执行:

MSCK REPAIR TABLE transactions;

 

最后是erc20_transfers表,用来描述虚拟货币的交易:

CREATE EXTERNAL TABLE IF NOT EXISTS erc20_transfers (

    erc20_token STRING,

    erc20_from STRING,

    erc20_to STRING,

    erc20_value DECIMAL(38,0),

    erc20_tx_hash STRING,

    erc20_log_index BIGINT,

    erc20_block_number BIGINT 

)

PARTITIONED BY (start_block BIGINT, end_block BIGINT)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

WITH SERDEPROPERTIES (

    'serialization.format' = ',',

    'field.delim' = ',',

    'escape.delim' = '\\'

)

STORED AS TEXTFILE

LOCATION 'oss://ethblock/export/erc20_transfers'

TBLPROPERTIES (

  'skip.header.line.count' = '1'

);

然后也需要执行:

MSCK REPAIR TABLE erc20_transfers;

 

三个表都建立完成后,就可以执行一个测试语句:

select * from blocks limit 10;

同步执行”即可,执行结果如下图所示:

6560e7073a24ed7b089401abcfa59483cd55ca55

图6 Data Lake Analytics SQL执行结果

Data Lake Analytics使用

直接查询

由于Data Lake Analytics提供了MySQL JDBC兼容接口,因此,完全可以像使用一般数据库那样查询OSS的数据,而且速度也不慢。

首先可以试一个分析以太坊数据的sql查询语句,看看以太坊上总共发了多少种的Token,执行命令:

SELECT count(distinct(erc20_token)) FROM erc20_transfers

显示结果如下图所示:

86284f6f2308c9f8042c18c070a98240e6b07d01

图 7 Data Lake Analytics查询Token数量

可以看到,系统扫描了约1.7亿条数据,统计相关的结果,速度均在10s(性能还在不断的提升中)左右,还是非常快的。

 

结合BI使用

由于Data Lake Analytics兼容MySQL协议,因此可以直接连接BI系统,做更多的数据分析。这里以阿里云的Quick BI为例,做一个分析以太坊交易量历史趋势图的案例。

首先是连接数据源,可以使用Quick BI的“自建数据源”---> “MySQL” 来连接Data Lake提供的MySQL兼容服务,具体如下图所示:

18e3435cf067fe625d41544c16df0fc061041473

图8 BI系统使用Data Lake Analytics的服务

 

BI系统连接Data Lake Analytics数据源成功后,就可以生成BI的“数据集”了,执行下面的mysql命令,就可以生成我们需要的数据集:

select sum(block_transaction_count) as transaction_count,fetch_month from

(

SELECT block_transaction_count,DATE_FORMAT(FROM_UNIXTIME(block_timestamp),'%Y-%m') as fetch_month 

FROM blocks

)  as transaction_data

group by fetch_month

order by fetch_month

数据集生成后,可以直接生成BI的电子表格,具体如下图所示:

53e7d63f1178b86a3598e72078080ad4bd5ad3ba

图9 BI系统电子表格

    然后对电子表格进行可视化展示即可,如下图所示:

3fb340c956e906f9cecff783869087d573340cbe

图10 BI系统数据可视化展示,x轴为月份,y轴为对应的交易量

从上图可以明显的看到,2018年初,是以太坊交易的高峰期,2018年也开始被认为是“区块链元年”。

数据挖掘使用

除了基本的BI分析外,基于Data Lake Analytics,我们还可以与AI机器学习相关的服务连接起来,做深度的挖掘工作。使用Data Lake Analytics一个明显的好处就是导出数据非常方便,这里举个简单的例子。

区块链系统都是匿名、去中心的,区块链世界的用户应该也是去中心、无“组织”的。区块链上到底有没有“社区”,就是一个比较有意思的话题,这里我们就做个简单的太坊用户“社区发现”挖掘。

做这个实验,首先就需要导出交易中的from和to数据,构建用户关系网络图。因为使用了Data Lake Analytics,用MySQL语句导出数据就非常方便。我们希望分析早期30万个区块中(2016年之前),产生的用户关系图,随机从这些区块中抽取5万条交易数据,执行下面的语句即可:

SELECT tx_from,tx_to from transactions where tx_block_number<300000

order by rand() limit 50000

由于Data Lake的DMS最多返回1万条数据,因此,这种情况下,需要异步执行,然后从OSS上读取结果数据,执行结果如下:

b4961dc67e6fa4e470cdee28f2da0efa6d99ff9f

图 11 Data Lake Analytics异步执行

作为对比,我们还从2018年6月的数据,随机抽取10万条做社区发现挖掘。数据挖掘结果如下图所示:

77c4eae287dab1b5616a6bc997acd200cf7475c6

图 12 以太坊社区发现挖掘(基于Force Atlas2算法)

如果上述数据导出,都使用awk等命令直接操作OSS文件产生数据,会非常麻烦,而基于Data Lake Analytics就简单的多。

从上图中可以发现,以太坊早期,除了图中“外圈”少量尝试性用户外,大部分活跃用户都集中在少数几个“社区”里。而到了快速发展期,尝试性用户比例增长明显,而活跃用户也集中在数十个“社区”中,大多以token合约为核心。也就是说,区块链系统虽然是去中心化的,但区块链世界的用户仍然有着和现实社会类似的组织结构。

 

小结

Data Lake Analytics最主要的特点就是“简单”,其大大降低了大数据分析的门槛。因为不需要搭建Hadoop/HIVE系统,也无需考虑大数据的导入导出问题。拥有基本的LAMP技术栈的技术童靴,甚至一些运营人员,都能直接使用。而与BI/DataV等系统的无缝对接,也让大数据分析变的更容易上手。

成本价廉,应该算是Data Lake的第二个特点。像分析本文所述规模的数据,使用OSS+Data Lake Analytics, 一个月大概几十块钱就够了,但如果使用Hadoop/HIVE,或者导入到MySQL/mongoDB, 成本至少在千元以上。

再者,由于Data Lake Analytics 执行速度非常快,完全可以取代一部分基于传统DB的线上服务。像本文BI中的例子,Data Lake Analytics 执行速度都在几秒钟,完全可以满足线上大数据查询的用户期望,而现在如Think PHP等服务框架,基本都自带查询缓存,满足线上服务更不在话下。

 

 

参考文章:

1 Exporting and Analyzing Ethereum Blockchainhttps://medium.com/@medvedev1088/exporting-and-analyzing-ethereum-blockchain-f5353414a94e

2 https://github.com/xiaoyao1991/presto-ethereum

3 本文部分参考脚本和测试数据,https://github.com/bdchain/ali_data_lake


网友评论

登录后评论
0/500
评论
ap6371e0f
+ 关注