首页 文章 精选 留言 我的

精选列表

搜索[基础软件],共10000篇文章
优秀的个人博客,低调大师

Android 项目开发基础再回顾(一)

1,主activity_splash: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/launcher_bg"//设置初始背景图片 tools:context=".SplashActivity" > <TextView android:id="@+id/tv_version_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"#把这个textview 放到中间 android:shadowDx="1//这个指的是相对于原字体在x方向上的偏移量 android:shadowDy="1" android:shadowColor="#f00"//黑色 android:shadowRadius="1"//表示阴影的模糊程度 android:textSize="16sp" android:text="版本名称" /> <ProgressBar //加载滚动条 android:layout_below="@id/tv_version_name" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> 2,副activity_home <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:text="HomeActivity" android:textSize="20sp" android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 3,让第二个活动可以启动 <activity android:name="com.example.moblesafe73.HomeActivity"/> 4,接下来创造两个工具类, 一个是将流转化为字符串 mport java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class StreamUtil { public static String StreamToString(InputStream is) { //1.在读取的过程中,将读取的内容存取到缓存中,然后一次性用字符转化成字符串 ByteArrayOutputStream bos=new ByteArrayOutputStream(); //2.读取操作,读到没有为止(循环) byte[] buffer=new byte[1024]; //3.记录读取内容的临时变量 int temp=-1; try { while((temp=is.read(buffer))!=-1){ bos.write(buffer,0,temp); } //返回读取的数据 return bos.toString(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally{ try { is.close(); bos.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } return null; } } 另一个是可以弹出toast import android.content.Context; import android.widget.Toast; public class ToastUtils { public static void show(Context ctx,String msg){ Toast.makeText(ctx, msg, 0).show(); } } 5,主营业务的介绍: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除当前activity头title requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_splash); //初始化ui initUI(); //初始化方法 initData(); } 6,关于如何初始化ui private void initUI() { // TODO 自动生成的方法存根 tv_version_name = (TextView) findViewById(R.id.tv_version_name); } 找到相应控件 private void initData() { // TODO 自动生成的方法存根 //应用版本名称 tv_version_name.setText(getVersionName()); //获取本地服务版本号 myLockVersionCode = getVersionCode(); //获取服务器版本号(客户端发请求,服务器给相应(json,xml一般用的是json)) checkVersion(); } //返回版本号 private int getVersionCode() { // TODO 自动生成的方法存根 //1,包管理者对象packagemanager PackageManager pm=getPackageManager(); //2,从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号,0代表基本信息) try { PackageInfo packageinfo=pm.getPackageInfo(getPackageName(), 0); return packageinfo.versionCode; } catch (NameNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return 0; } 这个方法可以 再来看checkVersion();方法 如果上网的话需要用到线程方面的知识 private void checkVersion() { new Thread(){ public void run(){ //Message message=new Message(); Message msg=Message.obtain(); long startTime=System.currentTimeMillis();//程序开始的时间 try { //封装url地址 URL url=new URL("http://192.168.1.104:8080/update74.json"); //开启一个地址 HttpURLConnection connection=(HttpURLConnection)url.openConnection(); //3,设置常见的请求参数(请求头) //请求超时 connection.setConnectTimeout(2000); //读取超时 connection.setReadTimeout(2000); //默认是get请求 //connection.setRequestMethod("POST"); //获取请求响应码 if(connection.getResponseCode()==200){ //5.以流的形式,将数据保存起来 InputStream is=connection.getInputStream(); //6.将流换成字符串(工具类封装) String json=StreamUtil.StreamToString(is); Log.i(tag, json);//打印日志 //7.json解析 JSONObject jsonObject=new JSONObject(json); String versionName=jsonObject.getString("versionName"); mversionDes = jsonObject.getString("versionDes"); String versionCode=jsonObject.getString("versionCode"); mdownloadUrl = jsonObject.getString("downloadUrl"); Log.i(tag, versionName); Log.i(tag, mversionDes); Log.i(tag, versionCode); Log.i(tag, mdownloadUrl); //8,比对版本号(服务器版本号,提示用户更新) if(myLockVersionCode <Integer.parseInt(versionCode)){ //提示用户更新,弹出对话框 msg.what=UPDATE_VERSION; }else{ //进入应用程序主界面 msg.what=ENTER_HOME; } } }catch (MalformedURLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); msg.what=URL_ERROR; }catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); msg.what=IO_ERROR; } catch (JSONException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); msg.what=JSON_ERROR; }finally{ //请求网络的时长超过四秒则不做处理 //请求小于四秒,强制让其睡眠四秒 long endTime=System.currentTimeMillis(); if(endTime-startTime<4000) { try { Thread.sleep(4000-(endTime-startTime)); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } mhandler.sendMessage(msg); } }; }.start(); 对上述信息进行相关的处理: private Handler mhandler=new Handler(){ public void handleMessage(android.os.Message msg){ switch(msg.what){ case UPDATE_VERSION: //弹出对话框,提示用户更新 showUpdateDialog();//弹出一个对话框,让我们进行更新 break; case ENTER_HOME: enterHome(); break; case IO_ERROR: ToastUtils.show(getApplicationContext(), "IO异常"); enterHome(); break; case URL_ERROR: ToastUtils.show(getApplicationContext(), "url异常"); enterHome(); break; case JSON_ERROR: ToastUtils.show(getApplicationContext(), "URL异常");//SplashActivity.this enterHome(); break; } } }; protected void showUpdateDialog() { // TODO 自动生成的方法存根 //对话框是依赖activity存在的 Builder builder = new AlertDialog.Builder(this);//必须用this,而不是getApplicationContext() builder.setIcon(R.drawable.ic_launcher); builder.setTitle("版本更新"); //设置描述内容 builder.setMessage(mversionDes);//这个描述内容见上文是由其发送过来的 //积极按钮,立即更新 builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //下载apk,apk链接地址,downloadUrl downloadApk(); } });//创建两个按钮监听器 builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //取消对话框,进入主界面 enterHome(); } }); builder.show(); } 接下来是对文件进行下载 protected void downloadApk() { //apk下载链接地址,放置apk的所在路径 //1,判断sd卡是否可用,是否挂在上 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //2,获取sd卡路径 String path=Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"mobilesafe73.apk"; //发送请求,获取sdk,并且添加到指定路径 HttpUtils httpUtils=new HttpUtils(); //发送请求,传递参数吧(下载应用放置的位置) httpUtils.download(mdownloadUrl, path,new RequestCallBack<File>() {//mdownloadUrl刚才所获得的下载的地址 @Override public void onSuccess(ResponseInfo<File> responseInfo) { Log.i(tag, "下载成功"); // TODO 自动生成的方法存根 File file=responseInfo.result; //提示用户安装 installAPK(file); } @Override public void onFailure(HttpException arg0, String arg1) { Log.i(tag, "下载失败"); // TODO 自动生成的方法存根 } @Override public void onStart() { // TODO 自动生成的方法存根 Log.i(tag, "开始下载"); super.onStart(); } @Override public void onLoading(long total, long current, boolean isUploading) { // TODO 自动生成的方法存根 Log.i(tag, "下载中........"); Log.i(tag, "total = "+total); Log.i(tag, "current = "+current); super.onLoading(total, current, isUploading); } }); } } //开始安装 protected void installAPK(File file) { // TODO 自动生成的方法存根 //系统应用界面,源码,安装apk入口 Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); /*//文件作为数据源 intent.setData(Uri.fromFile(file)); //设置安装的类型 intent.setType("application/vnd.android.package-archive");*/ intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive"); // startActivity(intent); startActivityForResult(intent, 0); } //开启另一个界面 protected void enterHome() { Intent intent = new Intent(this,HomeActivity.class); startActivity(intent); //在开启一个新的界面后将导航界面关闭,因为导航界面只可见一次 finish(); } 本文转自眉间雪 51CTO博客,原文链接:http://blog.51cto.com/13348847/2046800,如需转载请自行联系原作者

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

IOS学习——UI基础UIWindow、UIView(五)

在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow、UIView来实现内容显示。 UIWindow: UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示、分发事件给View。UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。UIWindow初始化在appDeleDgate里面的 didFinishLaunchingWithOptions方法。 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];//显示出UIWindow UIView: UIView类继承自UIResponder,负责在屏幕上 定义一个矩形区域,视图用于展示界面及响应用户界面交互。每个视图对象都要负责渲染视图区域的内容,并响应该区域中发生的操作事件。 除了显示内容和处理事件之外,视图可以嵌套并管理子视图。子视图是指嵌入到另一视图对象内部的视图对象,而被嵌入的视图对象是父视图。视图添加到window中就会显示出来,iOS中是怎么实现视图显示的,看下面的代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; CGRect rect=[UIScreen mainScreen].applicationFrame; NSLog(@"NSScreen application %@",NSStringFromCGRect(rect)); CGRect rect2=[UIScreen mainScreen].bounds; NSLog(@"NSString mainScreen %@",NSStringFromCGRect(rect2)); NSLog(@"iOS_didFinishLaunchingWithOptions"); UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(60, 50, 200, 100)]; view1.backgroundColor=[UIColor greenColor]; [self.window addSubview:view1]; [view1 release]; UIView *view2=[[UIView alloc]initWithFrame:CGRectMake(60, 100, 200, 200) ]; view2.alpha=0.5; view2.backgroundColor=[UIColor cyanColor]; [self.window addSubview:view2]; UIView *view3=[[UIView alloc]initWithFrame:CGRectMake(100, 50, 60, 50)]; view3.backgroundColor=[UIColor colorWithRed:25/255.0 green:60/255.0 blue:150/255.0 alpha:1.0]; [view2 addSubview:view3]; [view3 release]; [view2 release]; [self.window makeKeyAndVisible]; return YES; } 上面添加了三个视图,view1、view2、view3,view3嵌套在view2中。 /** * @author 张兴业 * http://blog.csdn.net/xyz_lmn * iOS入门群: 83702688 * android开发进阶群: 241395671 * 我的新浪微博: @张兴业TBOW */ 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230735,如需转载请自行联系原作者

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

android按钮main.xm_基础篇

SMART单选按钮 让我们看一下,达到以上的效果,我们只要在MAIN。XML文件写几行代码便可。 <RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" > <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="广州" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="北京" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上海" android:drawableLeft="@drawable/star" android:drawableTop="@drawable/circle" android:drawableRight="@drawable/star" android:drawablePadding="20dp" android:drawableBottom="@drawable/circle" /> </RadioGroup> 本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/486033,如需转载请自行联系原作者

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

PHP实现对MongoDB的基础操作

PHP扩展 PHP5.2、PHP5.3,线程、非线程,IIS、Apache综合下载地址: http://pan.baidu.com/s/1sjrW6z7 下载相对应的php扩展文件php_mongo.dll,拷入php扩展文件夹里/php/ext,修改php.ini文件,新增下列行: extension=php_mongo.dll PHP操作 连接数据库 $conn = new Mongo("mongodb://localhost:27017//admin:admin"); 选择数据库和集合 //选择数据库blog,如果没有,则创建 $db = $conn->yyd; //也可以写成:$db = $conn->selectDB('yyd'); //制定结果集(集合:yyd_test) $collection = $db->yyd_test; //也可以写成:$collection = $db->selectCollection('yyd_test'); //var_dump($collection); 新增数据 $post = array('name' => '22', 'sex' => '32'); $flag=($collection->insert($post)); var_dump($flag); 查找数据 $arr=array(); $cursor = $collection->find($arr); foreach($cursor as $key => $value){ echo "<pre>"; echo $value['_id']; echo '<br>name:'; echo $value['name']; echo "<br>sex:"; echo $value['sex']; echo "</pre>"; } 条件查找 $arr=array("name"=>"22"); $cursor = $collection->find($arr); 修改数据 $newdata = array('$set' => array("email" => "test@test.com")); $collection->update(array("name" => "22"), $newdata); var_dump($collection); $arr=array("name"=>"22"); $cursor = $collection->find($arr); foreach($cursor as $key => $value){ echo "<pre>"; echo $value['_id']; echo '<br>name:'; echo $value['name']; echo "<br>sex:"; echo $value['sex']; echo "<br>email:"; echo $value['email']; echo "</pre>"; } 删除数据 $arr=array("name"=>"22"); $collection->remove($arr); var_dump($collection); 其它常用操作 //关闭连接 $conn->close(); //删除一个数据库 $conn->dropDB("yyd"); //列出所有可用数据库 $dbs = $conn->listDBs(); 带有MongoDB操作函数的的PHP手册: http://pan.baidu.com/s/1pJz2llh 或者网站: http://www.php.net/manual/zh/class.mongodb.php 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3571430.html,如需转载请自行联系原作者

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

Uber数据基础架构现在及未来

优步是全球领先的移动互联网创业公司,通过创新科技为乘客和合作司机高效即时匹配,提供安全、高效、可靠、便利的出行选择,他的使命是“使出行如自来水一样可靠,每个人在任何地方都能享用”。为了履行这一承诺,优步依赖于在每个层面做出数据驱动的决策。 优步目前的业务广泛分布于75个国家或地区,超过500个城市,基于分析可以充分了解一个城市人们出行的特点(热点区域、主要交通流向等)。大部分的决策都得益于更快的数据处理能力,其底层核心在于构建了强大的Hadoop大规模数据处理平台。下面对Hadoop在优步的发展过程做一个初步介绍。 2014年以前数据架构比较简单,数据主要有日志和DB数据组成,采集到数据仓库后再做进一步加工,然后直接服务商业应用或即席查询分析等,架构如下: 此架构的中心是一个数据仓库,用于将各种数据源收归一处,经统一建模处理后再提供服务

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

Laravel 学习路线【1】基础目录认识

根目录 App目录 app 目录包含了应用的核心代码,此外你为应用编写的代码绝大多数也会放到这里; Bootstrap目录 bootstrap目录包含了少许文件,用于框架的启动和自动载入配置,还有一个 cache 文件夹用于包含框架为提升性能所生成的文件,如路由和服务缓存文件; Config目录 config 目录包含了应用所有的配置文件,建议通读一遍这些配置文件以便熟悉所有配置项; Database目录 database 目录包含了数据迁移及填充文件,如果你喜欢的话还可以将其作为 SQLite 数据库存放目录; Public目录 public 目录包含了入口文件 index.php 和前端资源文件(图片、JavaScript、CSS等); Resources目录 resources 目录包含了视图文件及原生资源文件(LESS、SASS、CoffeeScript),以及本地化语言文件; Routes目录 routes 目录包含了应用的所有路由定义。Laravel默认提供了三个路由文件 web.php 、api.php和console.php。 web.php 文件包含的路由都会应用web中间件组,具备Session、CSRF防护以及Cookie加密功能,如果应用无需提供无状态的、RESTful风格的API,所有路由都会定义在web.php文件。 api.php 文件包含的路由应用了api中间件组,具备频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过token进行认证并且不能访问Session状态。 console.php 文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行IO方法进行交互,尽管这个文件并不定义HTTP路由,但是它定义了基于控制台的应用入口(路由)。 Storage目录 storage 目录包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该目录被细分为成app 、framework和logs子目录,app目录用于存放应用要使用的文件,framework目录用于存放框架生成的文件和缓存,最后,logs目录包含应用的日志文件; storage/app/public 目录用于存储用户生成的文件,比如可以被公开访问的用户头像,要达到被访问的目的,你还需要在public目录下生成一个软连接storage 指向这个目录。你可以通过 php artisan storage:link命令生成这个软链接。 Tests目录 tests 目录包含自动化测试,其中已经提供了一个开箱即用的PHPUnit示例;每一个测试类都要以 Test 开头,你可以通过 phpunit 或 php vendor/bin/phpunit 命令来运行测试。 Vendor目录 vendor目录包含所有Composer依赖。 App目录 应用的核心代码位于 app 目录下,默认情况下,该目录位于命名空间 App 下, 并且被 Composer 通过 PSR-4自动载入标准 自动加载。 app 目录下包含多个子目录,如Console、Http、Providers等。Console和Http目录提供了进入应用核心的API,HTTP协议和CLI是和应用进行交互的两种机制,但实际上并不包含应用逻辑。换句话说,它们只是两个向应用发布命令的方式。Console目录包含了所有的Artisan命令,Http目录包含了控制器、中间件和请求等。 其他目录会在你通过 Artisan 命令 make 生成相应类的时候生成到 app 目录下。例如,app/Jobs 目录直到你执行 make:job 命令生成任务类时才会出现在 app 目录下。 注意:app 目录中的很多类都可以通过 Artisan 命令生成,要查看所有有效的命令,可以在终端中运行php artisan list make命令。 Console目录 Console 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 make:command 命令生成。该目录下还有 Console Kernel 类,在这里可以注册自定义的 Artisan 命令以及定义调度任务。 Events目录 这个目录默认不存在,但是可以通过 event:generate 和 make:event 命令创建。该目录用于存放事件类。事件类用于告知应用其他部分某个事件发生并提供灵活的、解耦的处理机制。 Exceptions目录 Exceptions 目录包含应用的异常处理器,同时还是处理应用抛出的任何异常的好地方。如果你想要自定义异常如何记录异常或渲染,需要修改 Handler 类。 Http目录 Http 目录包含了控制器、中间件以及表单请求等,几乎所有进入应用的请求处理都在这里进行。 Jobs目录 该目录默认不存在,可以通过执行 make:job 命令生成,Jobs目录用于存放队列任务,应用中的任务可以被推送到队列,也可以在当前请求生命周期内同步执行。同步执行的任务有时也被看作命令,因为它们实现了命令模式。 Listeners目录 这个目录默认不存在,可以通过执行 event:generate 和 make:listener 命令创建。Listeners 目录包含处理事件的类(事件监听器),事件监听器接收一个事件并提供对该事件发生后的响应逻辑,例如,UserRegistered 事件可以被 SendWelcomeEmail 监听器处理。 Mail目录 这个目录默认不存在,但是可以通过执行 make:mail 命令生成,Mail 目录包含邮件发送类,邮件对象允许你在一个地方封装构建邮件所需的所有业务逻辑,然后使用 Mail::send 方法发送邮件。 Notifications目录 这个目录默认不存在,你可以通过执行 make:notification 命令创建, Notifications 目录包含应用发送的所有通知,比如事件发生通知。Laravel 的通知功能将通知发送和通知驱动解耦,你可以通过邮件,也可以通过Slack、短信或者数据库发送通知。 Policies目录 这个目录默认不存在,你可以通过执行 make:policy 命令来创建, Policies 目录包含了所有的授权策略类,策略用于判断某个用户是否有权限去访问指定资源。更多详情,请查看授权文档。 Providers目录 Providers 目录包含应用的所有服务提供者。服务提供者在启动应用过程中绑定服务到容器、注册事件以及执行其他任务以为即将到来的请求处理做准备。 在新安装的 Laravel 应用中,该目录已经包含了一些服务提供者,你可以按需添加自己的服务提供者到该目录。 【大部分从文档拿过来~方便自己查看,后期更新自己学习的东西,多多包涵】

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

让Spark如虎添翼的Zeppelin – 基础篇

Spark 是一个非常好的计算平台,支持多种语言,同时基于内存的计算速度也非常快。整个开源社区也很活跃。 但是Spark在易用性上面还是有一些美中不足。 对于刚接触的人来说,上手以及环境搭建还是有一些困难。 另外,如果希望将结果绘制成图表分享给别人,还需要很长一段路程。 目前已经有一些解决方案: 【TBD】Jupyter Notebook 使用很广泛,但是看起来主要还是以前ipython-notebook的增强版。 目前笔者对其了解不多 Spark 母公司DataBricks提供的DataBricks Community Edition, 里面自带Spark集群 + Notebook。 易用性、功能性都很不错。缺点是集群架设在AWS之上,无法跟自己本地的Spark 集群连在一起 Apache Zeppelin 这是一个刚刚从Incubation转正的项目 但是已经在各大公司均有采用,比如美团、微软等等 本文主要就是介绍如何在本地搭建一个Zeppelin 使得Spark更易用,同时可以很方便的将自己的工作成功展示给客户 借用别人的一个效果图镇楼^_^ 注意: Zeppelin自带Spark实例,您无需自己构建一个Spark 集群就可以学习Zeppelin Zeppelin 当前(2016年8月19日)最新版本0.6.1, 只兼容2.0+ 1)如果您本地有Spark 集群并且版本是1.6.1 + Scala 2.10 , 请下载Zeppelin 0.6.0的版本 2)如果官网的速度比较慢,可以参考下面的方式到百度盘下载 链接: http://pan.baidu.com/s/1ctBBJo 密码: e68g 1、 下载 如果您需要的是0.6.0的版本,可以参考上面百度盘的下载链接。 如果您需要的是0.6.1+的版本,可以直接到官网下载, 里面的Mirror下载速度一般还不错 2、 安装 版本: Zeppelin 0.6.0 + 自建Spark集群(1.6.1) 感觉Zeppelin还是不太成熟,并开箱就用,还需要不少人工调整才能正常工作 1)解压之后,首先需要从模板创建一个新的zeppelin-env.sh, 并设置SPARK_HOME. 比如: 1exportSPARK_HOME=/usr/lib/spark 如果是基于Hadoop 或者 Mesos 搭建的Spark 集群,还需要进行另外的设置。 2)从模板创建一个新的zeppelin-site.xml,并将之前的8080端口改到比如8089,避免与Tomcat等端口冲突 <property> <name>zeppelin.server.port</name> <value>8089</value> <description>Serverport.</description> </property> 3)替换jackson相关类库 a)默认自带的是2.5.*, 但是实际使用的时候指定的是2.4.4 b)并且可能2.4.4 与 2.5.* 并不完全兼容。 c)因此需要使用2.4.4 替换2.5.* , 有下面3个jar需要替换: jackson-annotations-2.4.4.jar jackson-core-2.4.4.jar jackson-databind-2.4.4.jar d)这真的是非常坑人的一个地方。。。 做完上诉几步之后,就可以启动啦: 启动/停止命令: bin/zeppelin-daemon.shstop/start 启动之后,打开http://localhost:8089 就可以看到Zeppelin的主界面啦 3. 配置Spark解释器 Spark Interpreter的配置非常简单,可以直接参考下图的配置方式: 4. 几点使用经验 Zeppline自带比较详细的Tutorial, 各位看自带的notebook tutorial 可能效果更好。 但是我在第一次使用的时候,遇到了不少坑,在此记录下来,给大家做个参考: (1) 任务提交之后不会自动停止 当Zeppelin 提交任务之后,可以看到Spark Master UI 上面,当前任务即使执行完成了,也不会自动退掉 这是因为,Zeppelin 默认就像人手工运行了spark-shell spark://master-ip:7077 一样, 除非手动关闭shell命令,否则会一直占用着资源 解决办法就是将spark 解释器(interpreter) 重启 手动的重启办法: 1.打开Interpreter界面,搜索到Spark部分并点击重启 2.推荐: 调用Restful API 进行重启。 a.可以通过Chrome的Network 监控看一下点击restart之后具体调用的API的情况。如下图: b.这个ID(2BUDQXH2R)在各自的环境可能各不相同。另外这个API是PUT的方式,可以直接使用下面的python代码在UI上自动重启 %python importrequests r=requests.put("http://IP:8089/api/interpreter/setting/restart/2BUDQXH2R") printr.text (2) 异常提示:Cannot call methods on a stopped SparkContext 比如我们在Spark Master UI 上面将当前job kill 之后,在Zeppelin这边重启执行任务就会遇到这个异常信息。 解决办法很简单: 重启解析器 (3) 不要主动调用 sc.stop() 这是官方明确说明的:scala 的spark-shell 自动初始化了SparkContext / SqlContext 等等 不能自己调用sc.stop() 之后重启创建一个SparkContext 可能笔者水平原因,尝试自己创建新的sc 之后,各种奇奇怪怪的问题 (4) 关于python module Python Interpreter可以使用当前Zeppelin所在机器的python 所有的model 同时支持python 2 与 python 3 这是一个很有用的功能,比如我使用spark将数据计算完成之后,生成了一个并不太大的csv文件。这个时候完全可以使用Pandas强大的处理能力来进行二次处理,并最终使用Zeppelin的自动绘图能力生成报表 与Tableau之类的BI工具相比功能差了一些,不过各有所长。Zeppelin 对程序员来说可以算是非常方便的一个工具了。 对日常的一些简单报表的工作量大大减小了 (5) 可以设置自动运行时间 在整个Note的最上端,可以设置当前notebook 定期执行。 而且注意: 还可以设置执行完成之后自动重启interpreter 参考下图: 本文作者:rangerwolf 来源:51CTO

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册