
OSS加速器介绍 对象存储OSS(Object Storage Service)具有海量、可靠、安全、高性能、低成本的特点。OSS提供标准、低频、归档、冷归档类型,覆盖多种数据从热到冷的存储需求,单个文件的大小从1字节到48.8TB,可以存储的文件个数无限制。OSS已成为互联网、企业级数据应用的基础设施。 然而,随着互联网业务的发展,越来越多的业务对数据的吞吐提出了更高的要求。为此,阿里云对象存储OSS重磅推出OSS加速器功能,它可以缓存OSS中的热点对象,提供高性能、高吞吐量的数据访问服务。 OSS加速器适用于基因训练、机器学习、数据湖大数据计算等需要大带宽,且数据重复读较多的场景。OSS加速器是一个标准的服务端缓存服务,和计算完全解耦,不同于传统的OSS功能,其为AZ级的服务模式,用户可以在相关AZ创建加速器,计算引擎通过缓存加速域名进行数据读写。在典型的一些数据湖场景中,例如大数据计算(EMR/DLA等) + OSS场景中,数据读取要求的带宽可能高达数百Gbps~Tbps,普通存储空间的吞吐能力往往无法轻松应对这种大带宽的读取需求。这时您可以开启OSS加速器,将需要重复读取的数据缓存在加速中。当上层应用向OSS加速器请求数据时,加速器根据您购买的加速器的容量大小提供1.6Gbps/TB的带宽(或200MBps/TB的吞吐)和一定的回源带宽(回源带宽是指首次访问不存在于加速器中的数据时,从OSS读取原始数据的带宽,然后OSS会将该数据缓存到加速器中)。 下图是数据访问流程: OSS加速器技术特点 1) 极致吞吐能力 OSS加速器有效解决多种应用场景(比如数据湖等)的读吞吐的挑战,特别是重复读的场景,其能够每TB提供200MBps(Byte)的吞吐能力,线性扩展,最高可以交付Tbps的带宽交付能力。2)弹性伸缩 通常计算任务有周期性需求,如何有效避免资源浪费,提效降本?通过OSS加速器的弹性伸缩能力,能够在线进行扩容缩容,可以按需释放或提升资源,有效降低TCO。3)存算分离 OSS加速器满足计算资源和存储资源解耦,面对计算任务的多样化,不再需要多个自建缓存搭建匹配,存算分离,灵活选择引擎和版本,满足多业务场景的吞吐加速。4)数据一致 同时,基于OSS智能元数据架构,OSS加速器提供了传统缓存方案不具备的一致性,当OSS上文件被更新时,加速器能自动识别,确保引擎读取到的都是最新数据。 使用示例 下面将演示如何创建OSS加速器以及使用OSS加速器的实际效果。 创建OSS加速器 用户可以在OSS控制台主页面左侧的导航栏下方看到"OSS加速器"标签页,申请试用通过后,可以看到OSS加速器功能界面 点击“创建OSS加速器”按钮后我们可以创建OSS加速器,这个时候会弹出"创建OSS加速器"对话框 您可以设置加速器的名称和容量,目前加速器的容量是20TB起步,最高可以设置100TB(更高的容量需要开工单进行申请),容量步长为5TB。目前OSS加速器支持的的可用区是上海的cn-shanghai-g可用区,其他的可用区正在逐步开放中。 修改加速器容量 创建好加速器后,我们还可以修改加速器的容量,修改加速器的容量同样会修改相关的带宽(吞吐)指标(这里显示的是MB/s,可以自行折算成Mbps或Gbps)。 设置加速路径 创建好加速器后,我们需要设置加速路径(加速路径是指当访问对象的前缀匹配加速路径时,会访问加速器进行加速数据访问)。 目前一个加速器可以可以配置的bucket数量无限制,每个bucket可以配置最多10个加速路径(如果不设置加速路径的话,将会加速整个bucket里面的数据读取)。 效果展示 下面我们展示一下加速容量从40TB提升到100TB,然后再降为70TB的效果图(图上的带宽吞吐单位是Byte/s,读取的对象之前访问过,已经缓存在加速器中)。 40TB的加速器容量对应的读带宽约是62.5Gbps,当我们将加速器容量提升到100TB时,带宽上升到约156.25Gbps,然后我们将加速器容量降低到70TB,我们可以看到带宽降到约109.375Gbps。可见OSS加速器可以很好地实现读吞吐带宽的按需提升,弹性伸缩,满足相关业务的需求。 试用申请 目前阿里云对象存储OSS加速器在邀测使用中,阿里云企业认证用户可申请试用,点击立即申请
前言 Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎。它可以在近实时条件下,存储,查询和分析海量的数据。它还支持将快照备份至HDFS/S3上面,而阿里云OSS兼容S3的API,本文将介绍如何使用ES的Repository-S3插件将快照备份至OSS。 部署与配置 首先,我们需要安装repository-s3,可以参考官方文档:https://www.elastic.co/guide/en/elasticsearch/plugins/7.2/repository-s3.html 启动ES,我们可以从log中看到,ES已经load了这个plugin: [2019-07-15T14:12:09,225][INFO ][o.e.p.PluginsService ] [master] loaded module [aggs-matrix-stats] [2019-07-15T14:12:09,225][INFO ][o.e.p.PluginsService ] [master] loaded module [analysis-common] [2019-07-15T14:12:09,225][INFO ][o.e.p.PluginsService ] [master] loaded module [ingest-common] [2019-07-15T14:12:09,226][INFO ][o.e.p.PluginsService ] [master] loaded module [ingest-geoip] [2019-07-15T14:12:09,226][INFO ][o.e.p.PluginsService ] [master] loaded module [ingest-user-agent] [2019-07-15T14:12:09,226][INFO ][o.e.p.PluginsService ] [master] loaded module [lang-expression] [2019-07-15T14:12:09,226][INFO ][o.e.p.PluginsService ] [master] loaded module [lang-mustache] [2019-07-15T14:12:09,227][INFO ][o.e.p.PluginsService ] [master] loaded module [lang-painless] [2019-07-15T14:12:09,227][INFO ][o.e.p.PluginsService ] [master] loaded module [mapper-extras] [2019-07-15T14:12:09,227][INFO ][o.e.p.PluginsService ] [master] loaded module [parent-join] [2019-07-15T14:12:09,227][INFO ][o.e.p.PluginsService ] [master] loaded module [percolator] [2019-07-15T14:12:09,227][INFO ][o.e.p.PluginsService ] [master] loaded module [rank-eval] [2019-07-15T14:12:09,228][INFO ][o.e.p.PluginsService ] [master] loaded module [reindex] [2019-07-15T14:12:09,228][INFO ][o.e.p.PluginsService ] [master] loaded module [repository-url] [2019-07-15T14:12:09,228][INFO ][o.e.p.PluginsService ] [master] loaded module [transport-netty4] [2019-07-15T14:12:09,228][INFO ][o.e.p.PluginsService ] [master] loaded plugin [repository-s3] [2019-07-15T14:12:12,375][INFO ][o.e.d.DiscoveryModule ] [master] using discovery type [zen] and seed hosts providers [settings] [2019-07-15T14:12:12,801][INFO ][o.e.n.Node ] [master] initialized [2019-07-15T14:12:12,802][INFO ][o.e.n.Node ] [master] starting ... 然后,我们需要将OSS使用的Access Key和Secret Key配置到ES去,分别执行下面的命令: bin/elasticsearch-keystore add s3.client.default.access_key bin/elasticsearch-keystore add s3.client.default.secret_key 运行 首先,我们创建一个备份: [root@master ~]# curl -XPUT 'http://localhost:9200/_snapshot/test' -H 'Content-Type: application/json' -d '{ "type": "s3", "settings": { "bucket": "hadoop-oss-test", "endpoint": "oss-cn-zhangjiakou-internal.aliyuncs.com"} }' {"acknowledged":true} NOTE: 上面的命令默认使用https协议来传输数据,如果想使用http协议,需要将"protocol": "http", "disable_chunked_encoding": true加到settings里面(这个特性将会在新版本发布后可用)。 可以使用下面的命令来确实创建是否成功: [root@master ~]# curl -XGET localhost:9200/_snapshot/test?pretty { "test" : { "type" : "s3", "settings" : { "bucket" : "hadoop-oss-test", "endpoint" : "oss-cn-zhangjiakou-internal.aliyuncs.com" } } } 我们可以写入一些测试数据到ES,然后看下目前集群的索引信息: [root@master ~]# curl -X GET "localhost:9200/_cat/indices?v" health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open sales 89ouBy6RQsuT34QRbn_jeQ 10 0 271786 0 15mb 15mb green open customer fQCMEvXsQOu0UgMm1SAJlA 5 0 10000 0 717kb 717kb 假设我们只备份sales索引: [root@master ~]# curl -XPUT 'http://localhost:9200/_snapshot/test/sales' -H 'Content-Type: application/json' -d '{ "indices": "sales" }' {"accepted":true} 然后我们可以从OSS控制台看到备份的结果: 现在我们再往sales索引里面写一些数据: [root@master ~]# curl -X GET "localhost:9200/_cat/indices?v" health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open sales 89ouBy6RQsuT34QRbn_jeQ 10 0 281502 0 15.6mb 15.6mb green open customer fQCMEvXsQOu0UgMm1SAJlA 5 0 10000 0 717kb 717kb 我们利用刚才备份到OSS的快照来恢复sales索引,分别执行下面的命令: [root@master ~]# curl -XPOST localhost:9200/sales/_close {"acknowledged":true,"shards_acknowledged":true,"indices":{"sales":{"closed":true}}} [root@master ~]# curl -XPOST 'http://localhost:9200/_snapshot/test/sales/_restore?pretty' { "accepted" : true } [root@master ~]# curl -X GET "localhost:9200/_cat/indices?v" health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open sales 89ouBy6RQsuT34QRbn_jeQ 10 0 271786 0 15mb 15mb green open customer fQCMEvXsQOu0UgMm1SAJlA 5 0 10000 0 717kb 717kb 我们可以看到,sales索引跟之前的一致。 参考资料 https://www.elastic.co/guide/en/elasticsearch/plugins/7.2/repository-s3.html https://www.elastic.co/cn/products/elasticsearch
前言 Fluentd是一个实时开源的数据收集器,基于CRuby实现,td-agent是其商业化版本,由Treasure Data公司维护。本文将介绍如何使Fluentd能够读写OSS。 安装 首先下载并安装td-agent,笔者使用的是td-agent-3.3.0-1.el7.x86_64.rpm,使用rpm命令安装: [root@apache ~]# rpm -ivh td-agent-3.3.0-1.el7.x86_64.rpm 然后,需要安装Fluentd的OSS plugin: [root@apache ~]# /usr/sbin/td-agent-gem install fluent-plugin-aliyun-oss 这里请注意,因为我们使用的是td-agent,安装Fluentd plugin时需要使用td-agent的td-agent-gem(/usr/sbin/td-agent-gem)。原因是td-agent有自己的Ruby,你需要将plugin安装到它的Ruby里面,而不是其他的Ruby,否则将会找不到已经安装好的plugin。 具体可以参见Fluentd的官方文档 安装完成后,我们可以查看安装的OSS plugin: [root@apache ~]# /usr/sbin/td-agent-gem list fluent-plugin-aliyun-oss *** LOCAL GEMS *** fluent-plugin-aliyun-oss (0.0.1) fluent-plugin-aliyun-oss这个plugin包含两部分: Fluent OSS output plugin将数据缓存在本地,达到设定的条件后,将缓存的数据(压缩后,如果设置的话)上传到OSS。 Fluent OSS input plugin首先,OSS的bucket需要配置事件通知,这篇文章介绍了如何设置,得到MNS的Queue与Endpoint。设置好之后,这个plugin会定时地从MNS拉取消息,从消息中获取上传的Objects,最后从OSS读取这些Objects,再发往下游。 下面将分别介绍如何配置,具体的配置参数说明参见github: https://github.com/aliyun/fluent-plugin-oss 配置(向OSS写数据) 下面是一个例子,将读到的数据,每分钟一个文件写到OSS中。其中endpoint/bucket/access_key_id/access_key_secret是必填项,其他的都是可选项。 <system> workers 6 </system> <match input.*> @type oss endpoint <OSS endpoint to connect to> bucket <Your Bucket> access_key_id <Your Access Key> access_key_secret <Your Secret Key> upload_crc_enable false path "fluent-oss/logs" auto_create_bucket true key_format "%{path}/%{time_slice}/events_%{index}_%{thread_id}.%{file_extension}" #key_format %{path}/events/ts=%{time_slice}/events_%{index}_%{thread_id}.%{file_extension} time_slice_format %Y%m%d-%H store_as gzip <buffer tag,time> @type file path /var/log/fluent/oss/${ENV['SERVERENGINE_WORKER_ID']} timekey 60 # 1 min partition timekey_wait 1s # timekey_use_utc true flush_thread_count 1 </buffer> <format> @type json </format> </match> 我们可以从OSS控制台看到效果: 配置(从OSS读数据) 下面是一个配置示例,其中endpoint/bucket/access_key_id/access_key_secret和MNS的endpoint/queue是必填项,其他的都是可选项。 <source> @type oss endpoint <OSS endpoint to connect to> bucket <Your Bucket> access_key_id <Your Access Key> access_key_secret <Your Secret Key> store_local false store_as gzip flush_batch_lines 800 flush_pause_milliseconds 1 download_crc_enable false <mns> endpoint <MNS endpoint to connect to, E.g.,{account-id}.mns.cn-zhangjiakou-internal.aliyuncs.com> queue <MNS queue> poll_interval_seconds 1 </mns> <parse> @type json </parse> </source> 我们可以从log中看一下运行状态 2019-04-23 15:38:14 +0800 [info]: #5 start to poll message from MNS queue fluentd-oss 2019-04-23 15:38:14 +0800 [info]: #5 http://1305310278558820.mns.cn-zhangjiakou-internal.aliyuncs.com/queues/fluentd-oss/messages 2019-04-23 15:38:14 +0800 [info]: #5 read object fluent-oss/logs/20190423-12/events_10_70226640160100.gz, size 4389548 from OSS 2019-04-23 15:38:15 +0800 [info]: #1 http://1305310278558820.mns.cn-zhangjiakou-internal.aliyuncs.com/queues/fluentd-oss/messages?ReceiptHandle=0BC1EA4E51483D4EAC69736941044AAE-MjY5ODkgMTU1NjAwNTAwODMwNSAzNjAwMDA 2019-04-23 15:38:16 +0800 [info]: #1 start to poll message from MNS queue fluentd-oss 2019-04-23 15:38:16 +0800 [info]: #1 http://1305310278558820.mns.cn-zhangjiakou-internal.aliyuncs.com/queues/fluentd-oss/messages 2019-04-23 15:38:16 +0800 [info]: #1 read object fluent-oss/logs/20190423-09/events_50_69939581261780.gz, size 6750045 from OSS 参考资料 https://github.com/aliyun/fluent-plugin-osshttps://rubygems.org/gems/fluent-plugin-aliyun-osshttps://www.fluentd.org/https://docs.fluentd.org/v1.0/articles/quickstart
背景 2017.12.13日Apache Hadoop 3.0.0正式版本发布,默认支持阿里云OSS对象存储系统,作为Hadoop兼容的文件系统,后续版本号大于等于Hadoop 2.9.x系列也支持OSS。然而,低版本的Apache Hadoop官方不再支持OSS,本文将描述如何通过支持包来使Hadoop 2.7.2能够读写OSS。 如何使用 下面的步骤需要在所有的Hadoop节点执行 下载支持包 http://gosspublic.alicdn.com/hadoop-spark/hadoop-oss-2.7.2.tar.gz 解压这个支持包,里面的文件是: [root@apache hadoop-oss-2.7.2]# ls -lh 总用量 3.1M -rw-r--r-- 1 root root 3.1M 2月 28 17:01 hadoop-aliyun-2.7.2.jar 这个支持包是根据Hadoop 2.7.2的版本,并打了Apache Hadoop对OSS支持的patch后编译得到,其他的小版本对OSS的支持后续也将陆续提供。 部署 首先将文件hadoop-aliyun-2.7.2.jar复制到$HADOOP_HOME/share/hadoop/tools/lib/目录下; 修改$HADOOP_HOME/libexec/hadoop-config.sh文件,在文件的327行加下代码: CLASSPATH=$CLASSPATH:$TOOL_PATH 修改的目的就是将$HADOOP_HOME/share/hadoop/tools/lib/放到Hadoop的CLASSPATH里面;下面是修改前后,这个文件的diff供参考(hadoop-config.sh.bak是修改前的文件): [root@apache hadoop-2.7.2]# diff -C 3 libexec/hadoop-config.sh.bak libexec/hadoop-config.sh *** libexec/hadoop-config.sh.bak 2019-03-01 10:35:59.629136885 +0800 --- libexec/hadoop-config.sh 2019-02-28 16:33:39.661707800 +0800 *************** *** 325,330 **** --- 325,332 ---- CLASSPATH=${CLASSPATH}:$HADOOP_MAPRED_HOME/$MAPRED_DIR'/*' fi + CLASSPATH=$CLASSPATH:$TOOL_PATH + # Add the user-specified CLASSPATH via HADOOP_CLASSPATH # Add it first or last depending on if user has # set env-var HADOOP_USER_CLASSPATH_FIRST 增加OSS的配置 修改core-site.xml文件,增加如下配置项: 配置项 值 说明 fs.oss.endpoint 如 oss-cn-zhangjiakou-internal.aliyuncs.com 要连接的endpoint fs.oss.accessKeyId access key id fs.oss.accessKeySecret access key secret fs.oss.impl org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem hadoop oss文件系统实现类,目前固定为这个 fs.oss.buffer.dir /tmp/oss 临时文件目录 fs.oss.connection.secure.enabled false 是否enable https, 根据需要来设置,enable https会影响性能 fs.oss.connection.maximum 2048 与oss的连接数,根据需要设置 相关参数的解释可以在这里找到 重启集群,验证读写OSS 增加配置后,重启集群,重启后,可以测试 # 测试写 hadoop fs -mkdir oss://{your-bucket-name}/hadoop-test # 测试读 hadoop fs -ls oss://{your-bucket-name}/ 运行teragen [root@apache hadoop-2.7.2]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar teragen -Dmapred.map.tasks=100 10995116 oss://{your-bucket-name}/1G-input 19/02/28 16:38:59 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032 19/02/28 16:39:01 INFO terasort.TeraSort: Generating 10995116 using 100 19/02/28 16:39:01 INFO mapreduce.JobSubmitter: number of splits:100 19/02/28 16:39:01 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps 19/02/28 16:39:01 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1551343125387_0001 19/02/28 16:39:02 INFO impl.YarnClientImpl: Submitted application application_1551343125387_0001 19/02/28 16:39:02 INFO mapreduce.Job: The url to track the job: http://apache:8088/proxy/application_1551343125387_0001/ 19/02/28 16:39:02 INFO mapreduce.Job: Running job: job_1551343125387_0001 19/02/28 16:39:09 INFO mapreduce.Job: Job job_1551343125387_0001 running in uber mode : false 19/02/28 16:39:09 INFO mapreduce.Job: map 0% reduce 0% 19/02/28 16:39:18 INFO mapreduce.Job: map 1% reduce 0% 19/02/28 16:39:19 INFO mapreduce.Job: map 2% reduce 0% 19/02/28 16:39:21 INFO mapreduce.Job: map 4% reduce 0% 19/02/28 16:39:25 INFO mapreduce.Job: map 5% reduce 0% 19/02/28 16:39:28 INFO mapreduce.Job: map 6% reduce 0% ...... 19/02/28 16:42:36 INFO mapreduce.Job: map 94% reduce 0% 19/02/28 16:42:38 INFO mapreduce.Job: map 95% reduce 0% 19/02/28 16:42:41 INFO mapreduce.Job: map 96% reduce 0% 19/02/28 16:42:44 INFO mapreduce.Job: map 97% reduce 0% 19/02/28 16:42:45 INFO mapreduce.Job: map 98% reduce 0% 19/02/28 16:42:46 INFO mapreduce.Job: map 99% reduce 0% 19/02/28 16:42:48 INFO mapreduce.Job: map 100% reduce 0% 19/02/28 16:43:11 INFO mapreduce.Job: Job job_1551343125387_0001 completed successfully 19/02/28 16:43:12 INFO mapreduce.Job: Counters: 37 File System Counters FILE: Number of bytes read=0 FILE: Number of bytes written=11931190 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=8497 HDFS: Number of bytes written=0 HDFS: Number of read operations=100 HDFS: Number of large read operations=0 HDFS: Number of write operations=0 OSS: Number of bytes read=0 OSS: Number of bytes written=1099511600 OSS: Number of read operations=1100 OSS: Number of large read operations=0 OSS: Number of write operations=500 ...... 运行distcp 从OSS往HDFS拷贝数据 [root@apache hadoop-2.7.2]# hadoop distcp oss://{your-bucket-name}/data hdfs:/data/input 19/03/05 09:43:59 INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, maxMaps=20, sslConfigurationFile='null', copyStrategy='uniformsize', sourceFileListing=null, sourcePaths=[oss://{your-bucket-name}/data], targetPath=hdfs:/data/input, targetPathExists=false, preserveRawXattrs=false} 19/03/05 09:43:59 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032 19/03/05 09:44:00 INFO Configuration.deprecation: io.sort.mb is deprecated. Instead, use mapreduce.task.io.sort.mb 19/03/05 09:44:00 INFO Configuration.deprecation: io.sort.factor is deprecated. Instead, use mapreduce.task.io.sort.factor 19/03/05 09:44:01 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032 19/03/05 09:44:01 INFO mapreduce.JobSubmitter: number of splits:24 19/03/05 09:44:01 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1551343125387_0008 19/03/05 09:44:01 INFO impl.YarnClientImpl: Submitted application application_1551343125387_0008 19/03/05 09:44:01 INFO mapreduce.Job: The url to track the job: http://apache:8088/proxy/application_1551343125387_0008/ 19/03/05 09:44:01 INFO tools.DistCp: DistCp job-id: job_1551343125387_0008 19/03/05 09:44:01 INFO mapreduce.Job: Running job: job_1551343125387_0008 19/03/05 09:44:07 INFO mapreduce.Job: Job job_1551343125387_0008 running in uber mode : false 19/03/05 09:44:07 INFO mapreduce.Job: map 0% reduce 0% 19/03/05 09:44:16 INFO mapreduce.Job: map 4% reduce 0% 19/03/05 09:44:19 INFO mapreduce.Job: map 8% reduce 0% ...... 19/03/05 09:45:11 INFO mapreduce.Job: map 96% reduce 0% 19/03/05 09:45:12 INFO mapreduce.Job: map 100% reduce 0% 19/03/05 09:45:13 INFO mapreduce.Job: Job job_1551343125387_0008 completed successfully 19/03/05 09:45:13 INFO mapreduce.Job: Counters: 38 File System Counters FILE: Number of bytes read=0 FILE: Number of bytes written=2932262 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=24152 HDFS: Number of bytes written=1099511600 HDFS: Number of read operations=898 HDFS: Number of large read operations=0 HDFS: Number of write operations=251 OSS: Number of bytes read=1099511600 OSS: Number of bytes written=0 OSS: Number of read operations=2404 OSS: Number of large read operations=0 OSS: Number of write operations=0 ...... [root@apache hadoop-2.7.2]# hadoop fs -ls hdfs:/data Found 1 items drwxr-xr-x - root supergroup 0 2019-03-05 09:45 hdfs:///data/input 从HDFS往OSS拷贝数据 [root@apache hadoop-2.7.2]# hadoop distcp hdfs:/data/input oss://{your-bucket-name}/data/output 19/03/05 09:48:06 INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, maxMaps=20, sslConfigurationFile='null', copyStrategy='uniformsize', sourceFileListing=null, sourcePaths=[hdfs:/data/input], targetPath=oss://{your-bucket-name}/data/output, targetPathExists=false, preserveRawXattrs=false} 19/03/05 09:48:06 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032 19/03/05 09:48:06 INFO Configuration.deprecation: io.sort.mb is deprecated. Instead, use mapreduce.task.io.sort.mb 19/03/05 09:48:06 INFO Configuration.deprecation: io.sort.factor is deprecated. Instead, use mapreduce.task.io.sort.factor 19/03/05 09:48:07 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032 19/03/05 09:48:07 INFO mapreduce.JobSubmitter: number of splits:24 19/03/05 09:48:08 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1551343125387_0009 19/03/05 09:48:08 INFO impl.YarnClientImpl: Submitted application application_1551343125387_0009 19/03/05 09:48:08 INFO mapreduce.Job: The url to track the job: http://apache:8088/proxy/application_1551343125387_0009/ 19/03/05 09:48:08 INFO tools.DistCp: DistCp job-id: job_1551343125387_0009 19/03/05 09:48:08 INFO mapreduce.Job: Running job: job_1551343125387_0009 19/03/05 09:48:14 INFO mapreduce.Job: Job job_1551343125387_0009 running in uber mode : false 19/03/05 09:48:14 INFO mapreduce.Job: map 0% reduce 0% 19/03/05 09:48:24 INFO mapreduce.Job: map 4% reduce 0% 19/03/05 09:48:27 INFO mapreduce.Job: map 8% reduce 0% ...... 19/03/05 09:49:18 INFO mapreduce.Job: map 92% reduce 0% 19/03/05 09:49:20 INFO mapreduce.Job: map 96% reduce 0% 19/03/05 09:49:21 INFO mapreduce.Job: map 100% reduce 0% 19/03/05 09:49:22 INFO mapreduce.Job: Job job_1551343125387_0009 completed successfully 19/03/05 09:49:22 INFO mapreduce.Job: Counters: 38 File System Counters FILE: Number of bytes read=0 FILE: Number of bytes written=2932910 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=1099535478 HDFS: Number of bytes written=0 HDFS: Number of read operations=548 HDFS: Number of large read operations=0 HDFS: Number of write operations=48 OSS: Number of bytes read=0 OSS: Number of bytes written=1099511600 OSS: Number of read operations=1262 OSS: Number of large read operations=0 OSS: Number of write operations=405 ...... [root@apache hadoop-2.7.2]# hadoop fs -ls oss://{your-bucket-name}/data/output Found 101 items -rw-rw-rw- 1 root root 0 2019-03-05 09:48 oss://{your-bucket-name}/data/output/_SUCCESS -rw-rw-rw- 1 root root 10995200 2019-03-05 09:48 oss://{your-bucket-name}/data/output/part-m-00000 -rw-rw-rw- 1 root root 10995100 2019-03-05 09:48 oss://{your-bucket-name}/data/output/part-m-00001 ...... 参考链接 https://yq.aliyun.com/articles/292792?spm=a2c4e.11155435.0.0.7ccba82fbDwfhK https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aliyun/src/site/markdown/tools/hadoop-aliyun/index.md
前言 logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。 目前logstash已经支持了很多输入和输出插件,本文主要介绍如何使用logstash output oss插件将日志导入OSS。 安装 目前logstash output oss插件可以在RubyGems.org里面找到,并且logstash使用RubyGems.org作为它的插件仓库,因此我们可以直接进入到logstash的安装目录,执行如下命令进行安装 ./bin/logstash-plugin install logstash-output-oss 将会产生如下输出 Validating logstash-output-oss Installing logstash-output-oss com.aliyun.oss:aliyun-sdk-oss:3.4.0:compile Installation successful 我们现在可以查看刚才安装的logstash output oss插件 [user@host logstash-6.5.3]# bin/logstash-plugin list --verbose logstash-output-oss logstash-output-oss (0.1.1) 配置及运行 logstash output oss插件的相关配置项的解释可以在这里找到,需要注意的是,endpoint/bucket/access_key_id/access_key_secret都是必填项,其他的都是可选项。下面是一个示例,用来将写入/etc/logstash-6.5.3/sample.data中事件,导入到OSS里面。 input { file { path => "/etc/logstash-6.5.3/sample.data" codec => json { charset => "UTF-8" } } } output { oss { "endpoint" => "oss-cn-zhangjiakou-internal.aliyuncs.com" "bucket" => "Your bucket" "prefix" => "logstash/%{index}" "recover" => true "access_key_id" => "Your access key id" "access_key_secret" => "Your access secret key" "rotation_strategy" => "size_and_time" "time_rotate" => 2 codec => json_lines { charset => "UTF-8" } } } 其中,我们生成的event脚本是: while [[ 1 ]] do let index=$RANDOM%10 echo "{\"index\": $index, \"message\": \"Hello, world\"}" >> sample.data done 我们配置的rotata的策略是size_and_time,基于时间和大小,其中配置了时间是每两分钟(time_rotate),大小采用的是默认值(在代码里面定义,30MB)。 在这里注意一下配置项中的prefix(logstash/%{index})字段,这个字段支持string interpolation,因此它会用event中相同的字段进行替换(如果没有则不替换)。 最终,我们可以通过控制台来查看生成的文件: 参考资料 https://rubygems.org/gems/logstash-output-osshttps://github.com/aliyun/logstash-output-osshttps://www.elastic.co/guide/en/logstash/current/index.html
2020年12月