https://www.planttext.com/
Wednesday, April 21, 2021
Friday, March 12, 2021
AWS Glue
Glue是一个自动化的工具,有很多优点如自动生成script,支持常见ETL操作如ApplyMapping,BYOD custom script,crawler自动识别scheme等等。相比于DataPipeline和step functions属于更高层的封装。
Glue之初感
需要的IAM role:
S3FullAccess
AWSGlueServiceRole
CloudWatchLogsFullAccess
Transformation:
可以将CSV, TXT, TSV转化成JSON,JSON的形式不是List而是每个object并排如{"city": "b"}{"city": "a"}. 反之转换也可以,但JSON的输入形式也不能是list,否则ApplyMapping等不能识别。可以支持nested JSON(三层以上均可)
Crawler:
Crawler 自动可以crawl指定bucket里面的file的metadata如column names, file type,ski header,count等等。
Custom Scripts (Spark DataFrame)
Custom transformation可以插入自定义的script,直接integrate到ETL job,但需要实现指定的API。下面是一段例子:
df = dfc.select(list(dfc.keys())[0]).toDF()
df_filtered = df.filter(df["year"] > 2018)
dyf_filtered = DynamicFrame.fromDF(df_filtered, glueContext, "filter_votes")
return (DynamicFrameCollection({"CustomTransform0": dyf_filtered}, glueContext))
去除空的row:
df_filtered = df.filter("videoName != ''")
如果出现空行,强制输出错误,返回到Glue errorMessage
if df.count != df_filtered.count:
raise ValueError('Empty row detected.')
custom script 需要和SelectFromCollection连用
Trigger:
Lambda可以作为trigger
https://aws.amazon.com/premiumsupport/knowledge-center/start-glue-job-crawler-completes-lambda/
可以用一个job succeeded event来trigger另一个job,这样就形成一个workflow
Programming:
可视化和代码可以自由转换。首先,可视化创建ETL job,然后转到scripts就看到自动生成的代码。所以只要用这个代码,就可以反过来创建ETL job
要加log的话:logger = glueContext.get_logger()
Python: https://github.com/aws-samples/aws-glue-samples/blob/master/examples/data_cleaning_and_lambda.md
Integration with AWS service: 用boto3 library
Glue API:
支持Scala和Python
Python: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue.html
start_job_run
只要用下面命令glue start-job-run指明如job-name和scriptLocation等job参数就可以创建。返回JobRunId
$ aws glue start-job-run --job-name "CSV to CSV" --arguments='--scriptLocation="s3://my_glue/libraries/test_lib.py"'
还支持custom parameters比如--source_file_s3_path, --targetFileS3Path等最多达50个。这样就可以令pipeline更灵活和generic,支持不同的输入和输出以及变换操作。
用的时候是
args = getResolvedOptions(sys.argv, ['JOB_NAME', 'source_file_s3_path']
logger.info('path name:' + args['source_file_s3_path'])
例子:https://stackoverflow.com/questions/52316668/aws-glue-job-input-parameters
还可以设置concurrency,这样可以同时跑不同parameters对应的job。
Job parameters for CDK:
https://awscdk.io/packages/@aws-cdk/aws-glue@1.22.0/#/./@aws-cdk_aws-glue.CfnJob
Default parameters:
https://docs.amazonaws.cn/en_us/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
get_job_runs
输入参数为jobName和jobRunId,返回JobRunState(Failed, Succeeded)和errorMessage
Shared code in Glue jobs by Python lib
https://medium.com/@bv_subhash/sharing-re-usable-code-across-multiple-aws-glue-jobs-290e7e8b3025
Glue error Code:
Glue Concurrency
Timeout
Custom error
Internal Failure
Deployment:
由于ETL的Python script都是保存在S3的,所以如果代码commit到git的话就要手动上传到S3。解决方案是利用CDK里面的Assets将本地代码上传到S3. Ref
DocumentDB:
Glue可以连documentDB,用于ETL,这里我们用来做update 一个record. 需要在glue手动设置DocDB的连接。
secrets_manager_client = boto3.client("secretsmanager", region_name="us-west-2")
workflow_status = [{
"_id": job_run_id,
"statux": "xxx"
}]
workflow_status_frame = DynamicFrame.fromDF(spark.createDataFrame(workflow_status), glueContext, "nested")
db_writer(workflow_status_frame, "my_db", "workflow_status")
db_writer(df, database_name, colection_name):
write_documentdb_options = {
"uri":
"database": database_name
"collection": colection_name
....
}
glueContext.write_dynamic_frame.from_options(df, connection_type="documentdb", connection_options=write_documentdb_options)
Monday, November 2, 2020
AWS Quicksight
与Tableau和SSIS类似,用于生成BI report。
report的参数
先产生一个paramter和对应的filter,然后就可以在report的URL加入如下,jobId是parameter name
https://us-west-2.quicksight.aws.amazon.com/sn/dashboards/e0176d07-f509#p.jobId=1568446
用户互动输入filter
原理同上,不过再加一个control在parameter上,用于用户输入。Dataset在一个Athena的view上,view处理了一些数据。
Ref:
[1] https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-a-url.html
[2] https://aws.amazon.com/blogs/big-data/using-quicksight-parameters-and-controls-to-drive-interactivity-in-your-dashboards/
Thursday, October 22, 2020
Java分析内存泄漏问题
VisualVM - 分析机器上app,CPU,memory运行情况
Apache JMeter - load test 工具,用于人工生成traffic,重现问题
Youkit/Eclipse Profiler - 分析内存泄漏memory leak
本问题是一个网站有memory leak的问题,导致heap memory usage在deployment后都一直上升
步骤
1. 用JMeter产生traffic,且用VisualVM观察问题是否重现且确认收集够数据,就停止收集
2. copy heap dump到安装了Youkit的机器
3. 用Youkit分析memory。发现有大量duplicate objects(Youkit定义是equal field by field或者数组元素一样)。打开QueryLogReporter可以发现这些重复对象都是来源于某一个class。
分析代码后发现,我们用了HTTP intercepter来拦截所有request然后将这些metrics放入一个MetricsManager的对象中,而这些对象并没有有效被删除,导致在ThreadLocal上累积。
找到根本原因后,我们在代码中在每次收集HTTP request后调用这个manager的一个delete函数。
AWS RDS怎么用workbench连上
创建AWS账号时会自带一个default VPC。
1. 创建RDS时,用上这个VPC
2. 一开始一直Workbench连不上,后来发觉缺少几个设置。设点击主DB instance (非cluster)为publicly accessible。这个设置至关重要,因为根据描述,DB在VPC中,外部设备如workbench和其他VPC都不能访问。否则就要通过[1]的方法,通过SSH到同一VPC下EC2来进行访问。设置了public并不代表任何人都可以访问,因为VPC会有访问限制,详看下一步。
3. DB对应的security group(防火墙)inbound规则允许MySQL和3306端口并将我的机器IP (My IP选项或者custom选项用https://checkip.amazonaws.com/ 来查询)加入到白名单中。outbound不用修改。
4. 设置workbench
Hostname: 用主instance (writer)的hostname, **-us-west-2.rds.amazonaws.com
port: 3306
username: admin
pw: 创建实例时候记下的
Ref:
[1] https://www.inoneo.com/en/blog/15/amazon-aws/connect-to-an-aws-rds-instance-inside-a-vpc-using-mysql-workbench
Sunday, October 18, 2020
Use Eclipse to develop AWS lambda
1. Setup AWS Toolkit in Eclipse [1]
2. Setup AWS credentials [2]
The instructions are not quite clear. A few steps required here:
(1) Create an IAM user without any permissions boundaries
(2) Add permissions for Lambda, S3, CloudFormation and iam (Inline policy). For iam, the iam:CreateRole is required [3]. But I added full access.
Note: if there is any error in deploying the lambda, check the missing permssions in CloudFormation events or the AWS console in Eclipse.
3. Create a AWS serverless Java project with hello-world blueprint [4]
4. Deploy the project
5. Test lambda. In lambda service in AWS console (Be sure in the right region), add test event
"TestInput"
The run the lambda. Check the logs in CloudWatch logs.
Ref:
[1] https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/setup-install.html
[2] https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/setup-credentials.html
[4] https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/serverless-projects.html
Thursday, October 1, 2020
Write through cache vs write back cache
Write-through(直写模式)在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。
Write-back(回写模式)在数据更新时只写入缓存Cache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。