首页 文章 精选 留言 我的

精选列表

搜索[统计],共10003篇文章
优秀的个人博客,低调大师

基于Yarn的Spark环境,统计哈姆雷特词频(1)

一、最流行的大数据框架Spark Yarn 环境搭建 Spark History Server 以及 Yarn MapReduce History Servcer Spark-submit 提交到Yarn 运行 二、Docker部署Hadoop Yarn 部署结果: 一台namenode节点,运行 namenode resourcemanager JobHistoryServer HistoryServer 2台datanode节点,运行 datanode nodemanager 主机Mac docker宿主机(virtualbox) Intellij idea spark client hdfs client 三、网络结构 mac 192.168.99.1 namenode 172.18.0.11 datanode1,datanode2 172.18.0.13 172.18.0.14 virtualbox 网桥 192.168.99.100 建立192.168.99.1 ~ 172.18.0.0 路由 sudo route -n add 172.18.0.0/24 192.168.99.100 docker 创建 172.18 网段,命名hadoopnet,docker设置ip必须先创建网络 docker network create --subnet=172.18.0.0/16 hadoopnet 四、启动docker 本地文件夹,整理好的工作空间 hadoop文件夹 说明:每个文件夹包含一个启动脚本和一个hdfs挂载的共享卷data etc/hadoop 说明:本地的hadoop目录会挂载到docker中hadoop/etc/hadoop配置文件目录。 1. NameNode docker run --name namenode \ --hostname namenode \ --network hadoopnet \ --ip 172.18.0.11 \ -d \ -v $PWD/data:/opt/tmp \ -v /Users/wangsen/hadoop/datanode/hadoop:/opt/hadoop-2.7.3/etc/hadoop \ -v $PWD/spark-2.1.1-bin-hadoop2.7:/opt/spark \ --rm dbp/hadoop dbp/hadoop是docker镜像的名字,共加载了3个共享卷(文件夹) /opt/tmp hdfs 存储路径 etc/hadoop hadpoop配置路径 主节点挂载spark 在创建镜像的时候没有装载spark,hadoop是通过Dockerfile创建dbp/hadoop时,装载到镜像中的;设置spark采用装载模式,也可以重新commit或build dockerfile生成包含spark的镜像。 2. DataNode(datanode1、datanode2) docker run --name datanode1 --hostname datanode1 --network hadoopnet --ip 172.18.0.13 -d -v $PWD/data:/opt/tmp -v /Users/wangsen/hadoop/datanode/hadoop:/opt/hadoop-2.7.3/etc/hadoop --rm dbp/hadoop docker run --name datanode2 --hostname datanode2 --network hadoopnet --ip 172.18.0.14 -d -v $PWD/data:/opt/tmp -v /Users/wangsen/hadoop/datanode/hadoop:/opt/hadoop-2.7.3/etc/hadoop --rm dbp/hadoop 五、启动HDFS、YARN etc/hadoop/core-site.xml ## 配置HDFS路径 <property> <name>fs.defaultFS</name> <value>hdfs://namenode:9000</value> </property> etc/hadoop/hdfs-site.xml <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/tmp</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/tmp</value> </property> etc/hadoop/yarn-site.xml <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>namenode:18040</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>namenode:18030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>namenode:18025</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>namenode:18141</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>namenode:18088</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log.server.url</name> <value>http://namenode:19888/jobhistory/logs</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> spark/conf/spark-env export HADOOP_CONF_DIR=/opt/hadoop-2.7.3/etc/hadoop spark/conf/spark-defaults.conf ## 配置spark ui 页面,通过yarn history服务查看spark任务运行结果 ## hdfs:///tmp/spark/events是hdfs上的路径,保存spark运行信息 spark.master=local spark.yarn.historyServer.address=namenode:18080 spark.history.ui.port=18080 spark.eventLog.enabled=true spark.eventLog.dir=hdfs:///tmp/spark/events spark.history.fs.logDirectory=hdfs:///tmp/spark/events hadoop/etc/hadoop-env.sh 修改JAVA_HOME,填写java_home的绝对路径 启动顺序 HDFS namenode -->sbin/hadoop-daemon.sh start namenode datanode -->sbin/hadoop-daemon.sh start datanode (已经设置好ssh免密码登录,docker共享了public_key文件。) Yarn namenode --> sbin/yarn-daemon.sh start resourcemanager datanode -->sbin/yarn-daemon.sh start nodemanager Spark jobserver namenode--> sbin/mr-jobhistory-daemon.sh start historyserver namenode--> spart/sbin/start-history-server.sh 六、浏览spark histroy页面 http://namenode:18080 spark history 附录 Dockerfile 如果你希望按作者的思路,搭建自己的spark docker集群,那么你可以从Dockerfile 创建image开始。 FROM ubuntu:16.04 MAINTAINER wsn RUN apt-get update RUN apt-get install -y openjdk-8-jdk RUN apt-get install -y vim RUN apt install -y net-tools RUN apt install -y iputils-ping RUN apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:root' |chpasswd RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config RUN sed -ri 's/# StrictHostKeyChecking ask/StrictHostKeyChecking no/' /etc/ssh/ssh_config RUN mkdir /root/.ssh RUN ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 ENV JRE_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre ENV PATH /opt/hadoop-2.7.3/bin:/opt/hadoop-2.7.3/sbin:/usr/lib/jvm/java-8-openjdk-amd64/bin:$PATH ENV CLASSPATH ./:/usr/lib/jvm/java-8-openjdk-amd64/lib:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib ADD hadoop-2.7.3.tar.gz /opt/ EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]

优秀的个人博客,低调大师

【数据标识】iOS App下载渠道的统计需求

我们现在有一个需求,某一个活动需要拉新所谓的拉新一般是推App下载,这个用户通过这个活动下载了App后,我们需要做到【在数据库中记录这个用户下载这个App是通过那个二维码渠道的,从效果上说,我们期望: ① 每个活动(渠道)在数据表中有一条记录,而一旦有经过该渠道下载的App被打开后,该渠道的下载量会+1,算KPI的(单独一条记录,带有时间戳) ② App首次打开时,如果检测到了渠道上报后,还应该为该App打上一个全局的渠道标志,后续的所有请求都应该将此参数带上,为后续产生订单以及流水做准备 比如之前我们为H5与Server的Ajax请求约定的是这样的: 复制代码 1 var param = { 2 //公共参数 3 common: { 4 us: '渠道', 5 version: '1.0.0' 6 }, 7 other: '' // 业务参数 8 }; 复制代码 每次请求就必定会带上业务参数,而us就是native需要带的渠道参数,当然native的公共参数比前端多的多,需求明确后,我们清理下iOS引导至App Store的一般流程。 这边的一般流程是,我们一个App活动,或者我们一次推广,一般来说都会用微信打开这个网址,这个是前提一: ① 我们的一次下载来源于一次活动(推广或者固定的下载地址),而微信是主要的打开设备 然后,我们要引导至App Store,一般来说会访问一个H5页面(在微信中会引导在Safari浏览器中打开),然后由H5下载落地页跳到App Store完成下载,这个是第二个前提: ② 我们每次是由一个统一的带渠道因子的H5页面,引导至App Store的 在上述基础上,我们期望:有一个唯一的H5引导下载落地页(这里基本会抛弃微信应用宝引导下载了) 这里初步的实现方案是: 打开H5落地页时候,将这次活动的渠道号以及ip+ua+时间戳传给server端记录,如果在一定时间内,机型和ip成功匹配,则认为这次下载来源与这次渠道号 这里需要: ① Server端,提供一个接口,记录当前渠道+ip+ua+时间戳+屏幕信息(所有能记录的都记录),提供一个渠道匹配判断标志 ② H5访问落地页的时候上报相关信息 ③ Native首次打开的时候,调用native提供的判断接口,给该次App打标志 这里提出了三个要素: ① H5落地页 ② server上报接口 ② server检查接口 而这种方案是不精确的,H5如果能拿到设备号这类唯一标识的话,便能大大提高准确性,然后无论微信jsdk或者Safari都是做不到的,而网上搜索的方案,提到了一个SFSafariViewController,似乎能达到共享cookie的作用,于是进行了一番探索。 SFSafariViewController 我们调研下来,在我们的场景下,大概是这么一个情况: ① 我们使用Safari打开一个页面,并且操作cookie ② 在我们的App中,SFSafariViewController这个库能打开一个我们给予的Url,并且这个网页如果和上面是一个域名cookie是共享的 这个就很有意思了,我们就完全可以这样做了: ① 访问H5下载落地页访问接口上报时,Server往cookie种入唯一标识而后引导至App Store ② App首次打开时,以隐藏状态打开上报页面,因为同域名,会将Safari的cookie带上,这里也会带上IP等标识 ③ Server打标签,如果判断有cookie或者ip匹配则返回相关渠道 ④ H5检查页,使用Hybrid交互,告诉native给该App打上标识 let vc = SFSafariViewController(url: URL(string: "http://domain.com/landing.html")!) 这里方案确定,然后开始落地实施试试情况,后续在数据展示一块以友好的方式展示出来,便是大数据的一环 参考文章:https://www.sensorsdata.cn/blog/analyze-distribution-channel-of-ios-app/ 本文转自叶小钗博客园博客,原文链接:http://www.cnblogs.com/yexiaochai/p/6480020.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

python spark 通过key来统计不同values个数

>>> rdd = sc.parallelize([("a", "1"), ("b", 1), ("a", 1), ("a", 1)]) >>> rdd.distinct().countByKey().items() [('a', 2), ('b', 1)] OR: from operator import add rdd.distinct().map(lambda x: (x[0], 1)).reduceByKey(add) rdd.distinct().keys().map(lambda x: (x, 1)).reduceByKey(add) distinct(numPartitions=None) Return a new RDD containing the distinct elements in this RDD. >>> sorted(sc.parallelize([1, 1, 2, 3]).distinct().collect()) [1, 2, 3] countByKey() Count the number of elements for each key, and return the result to the master as a dictionary. >>> rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)]) >>> sorted(rdd.countByKey().items()) [('a', 2), ('b', 1)] 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7155153.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

python统计ES存储空间占用的代码

import os from os.path import join, getsize def get_dir_size(dir, suffix_filter=None): size = 0L if not suffix_filter: for root, dirs, files in os.walk(dir): size += sum([getsize(join(root, name)) for name in files]) else: pos = len(suffix_filter) for root, dirs, files in os.walk(dir): size += sum([getsize(join(root, name)) for name in files if name[-pos:] == suffix_filter]) return size if __name__ == "__main__": suffix = [".doc", ".pos", ".tim", ".tip", ".dvd", ".dvm", ".fdt", ".fdx", ".fnm", ".nvd", ".nvm"] sums = [0]*len(suffix) print "total size,", suffix all_size = 0.0 for i in range(0, 20): dir_name = r'D:\exp\elasticsearch-2.4.1\data\elasticsearch\nodes\metadata-dis-2017.05.17-192.168.10.5-93001\%d' % i total_size = get_dir_size(dir_name) all_size += total_size print total_size, ",", for index,f in enumerate(suffix): filesize = get_dir_size(dir_name, f) print filesize, if index != len(suffix)-1: print ",", sums[index] += filesize print "" print "sum:==>" print all_size, ",", sums print suffix, "==>" print "rate:",["{:6.4f}".format(sums[index]/all_size) for index,f in enumerate(suffix)], "other rate:", "{:6.4f}".format((all_size-sum(sums))/all_size) 结果: total size, ['.doc', '.pos', '.tim', '.tip', '.dvd', '.dvm', '.fdt', '.fdx', '.fnm', '.nvd', '.nvm'] 1317898783 , 151402808 , 49137369 , 301883415 , 4172214 , 141468778 , 2638 , 584778163 , 251283 , 14098 , 84785648 , 766 1322178937 , 151260397 , 49087934 , 301549945 , 4152932 , 141485775 , 2614 , 583980598 , 251572 , 14281 , 90390501 , 786 1319649899 , 151221470 , 49071207 , 301534617 , 4170120 , 140942980 , 2638 , 583509290 , 251019 , 14372 , 88929787 , 796 1314658083 , 151146248 , 49063654 , 301531446 , 4160809 , 140569823 , 2638 , 583241932 , 250572 , 14098 , 84674494 , 766 1320535933 , 151531650 , 49176093 , 302016964 , 4169422 , 141155952 , 2574 , 584516976 , 249055 , 14280 , 87700579 , 786 1320124857 , 151273971 , 49132333 , 301772358 , 4170596 , 141370180 , 2646 , 583164239 , 251026 , 14372 , 88970738 , 796 1316604607 , 151108604 , 49028330 , 301445032 , 4157849 , 140884622 , 2646 , 583674391 , 249567 , 14190 , 86036998 , 776 1318000530 , 151303288 , 49096354 , 301799237 , 4165775 , 141048755 , 2622 , 584203445 , 250668 , 14189 , 86113818 , 776 1319766874 , 151220609 , 49114923 , 301645769 , 4164351 , 141300148 , 2614 , 583120289 , 249195 , 14372 , 88932205 , 796 1316689373 , 151233222 , 49121429 , 301457255 , 4162316 , 141250414 , 2614 , 583262641 , 250656 , 14189 , 85932258 , 776 1318198716 , 151174674 , 49109038 , 301525947 , 4166291 , 140899847 , 2670 , 583598013 , 251472 , 14281 , 87454094 , 786 1320522076 , 151321339 , 49123177 , 301757750 , 4169815 , 141420824 , 2638 , 583468296 , 252283 , 14372 , 88989183 , 796 1319417975 , 151437201 , 49178363 , 301895414 , 4172117 , 140741668 , 2598 , 584117457 , 252773 , 14281 , 87603715 , 786 1317865422 , 151324795 , 49079342 , 301808126 , 4162318 , 141039688 , 2590 , 584047373 , 251114 , 14189 , 86133508 , 776 1319633778 , 151143225 , 49103608 , 301496485 , 4162216 , 140890300 , 2630 , 583678114 , 252802 , 14372 , 88887627 , 796 1317628208 , 151325819 , 49158454 , 301771482 , 4164837 , 141049094 , 2622 , 583762862 , 250401 , 14190 , 86126068 , 776 1318628784 , 151251125 , 49101866 , 301657775 , 4163649 , 140656991 , 2622 , 583999255 , 251506 , 14281 , 87527326 , 786 1316949748 , 151240013 , 49118487 , 301544994 , 4157729 , 140576588 , 2606 , 583907402 , 251325 , 14189 , 86134036 , 776 1316521884 , 151169612 , 49090142 , 301601874 , 4157814 , 140947297 , 2670 , 583231827 , 250762 , 14189 , 86053318 , 776 1319378726 , 151381023 , 49179677 , 301868523 , 4171265 , 140769513 , 2614 , 584110351 , 251400 , 14280 , 87627691 , 786 sum:==> 26370853193.0 , [3025471093L, 982271780L, 6033564408L, 83294435L, 2820469237L, 52504L, 11675372914L, 5020451L, 285065L, 1745003592L, 15660L] ['.doc', '.pos', '.tim', '.tip', '.dvd', '.dvm', '.fdt', '.fdx', '.fnm', '.nvd', '.nvm'] ==> rate: ['0.1147', '0.0372', '0.2288', '0.0032', '0.1070', '0.0000', '0.4427', '0.0002', '0.0000', '0.0662', '0.0000'] other rate: 0.0000 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6932271.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

golang 之 defer(统计函数执行时间)

1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func sum(a ...int) int { 9 defer trace("sum")() // note:不要忘记defer语句后的圆括号,否则本该在进入时执行的操作会在退出时执行,而本该在退出时执行的,永远不会执行 10 total := 0 11 for _, val := range a { 12 total += val 13 } 14 return total 15 } 16 17 func trace(msg string) func() { 18 start := time.Now() 19 fmt.Printf("enter %s\n", msg) 20 return func() { 21 fmt.Printf("exit %s (%s)\n", msg, time.Since(start)) 22 } 23 } 24 25 func main() { 26 count := sum(3, 5, 9) 27 fmt.Printf("%d\n", count) 28 } 执行结果: 1 enter sum 2 exit sum (194.764µs) 3 17 利用defer修改函数的返回值: 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func sum(a, b int) (result int) { 9 //defer trace("sum")() // note:不要忘记defer语句后的圆括号,否则本该在进入时执行的操作会在退出时执行,而本该在退出时执行的,永远不会执行 10 defer func() { result += a }() //被延时执行的匿名函数甚至可以修改函数返回给调用者的返回值 11 result = 0 12 result += a 13 result += b 14 return result 15 } 16 17 func trace(msg string) func() { 18 start := time.Now() 19 fmt.Printf("enter %s\n", msg) 20 return func() { 21 fmt.Printf("exit %s (%s)\n", msg, time.Since(start)) 22 } 23 } 24 25 func main() { 26 count := sum(3, 8) 27 fmt.Printf("%d\n", count) 28 } 执行结果: 1 [root@docker pro]# go run arg.go 2 [root@docker pro]# go run arg.go 3 14

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册