Статьи

«Это с открытым исходным кодом, так что источник, вы знаете, открытый».

Несмотря на то, что я в основном сижу на работе,  пытаясь выглядеть занятым , время от времени кто-то врывается в мой офис с вопросом или проблемой, поэтому мне приходится что-то делать.

Интересно, что многие проблемы могут быть решены с помощью довольно простых вещей, таких как напоминание людям о том, что файл .jar / war — это zip-файл, и вы можете заглянуть внутрь, что там есть или чего не хватает; или отправка людей для чтения файлов журналов (оказывается, что эти сообщения действительно содержат полезную информацию) и т. д. — так что теперь для сегодняшнего урока: «Это открытый источник, поэтому источник, вы знаете, открыт…»

В Ницце  мы используем много проектов с открытым исходным кодом  (мы также постепенно  начинаем отдавать что-то сообществу,  но это уже другая история). Одним из них является HBase, один из наших разработчиков работал над включением и тестированием  сжатия на HBase . Глядя на HBaseAdmin API (на самом деле  дескриптор столбца ), он увидел, что есть опция для настройки сжатия семейства колонок и опция для настройки сжатия для сжатия. Вопрос, с которым он пришел, состоял в том, знаю ли я, как он ведет себя, когда вы устанавливаете один, а не другой, и как они работают вместе.

Ну, я знаю о сжатии HBase, но я не слышал о сжатии сжатия, и документации по этому вопросу, ну, в общем, не хватает. К счастью, HBase — проект с открытым исходным кодом, поэтому я взглянул на него. Я начал с  hfile.java,  который читает и записывает данные HBase в hadoop. ну, кажется, что писатель получает алгоритм сжатия в качестве параметра и что читатель получает алгоритм сжатия из заголовка. так что по существу разные hfiles могут иметь разные сжатия, и HBase не будет заботиться. Мы начинаем видеть картинку, но чтобы убедиться, что нам нужно увидеть, где установлена ​​компрессия. Итак, мы смотрим в   файл Store.java регион-сервера и видим:

this.compression = family.getCompression();
 // avoid overriding compression setting for major compactions if the user
 // has not specified it separately
 this.compactionCompression =
      (family.getCompactionCompression() != Compression.Algorithm.NONE) ?
   family.getCompactionCompression() : this.compression;

В итоге, читая код HBase, я смог точно понять, как ведет себя рассматриваемая функция, а также лучше понять внутреннюю работу HBase (HFile описывает свою собственную структуру, поэтому разные файлы могут иметь разные атрибуты, такие как сжатие и т. Д.)

Еще один пример того, как может помочь чтение кода, — это использование метрик библиотеки мониторинга Yammer  . Создавая решение для мониторинга для нашей платформы, мы также собираем счетчики JMX (как и все остальные, я думаю :)). Так что я наткнулся на метрики, и  руководство  хорошо поработало, показав различные функции и объяснив, почему это интересная библиотека. Я попросил одного из наших архитекторов показать его и посмотреть, подходит ли он. Он пытался, но так получилось, что довольно сложно понять, как собрать все воедино, и использовать это на самом деле только из документации. К счастью, в метрическом коде есть модульные тесты (не все, кстати, это позор, но, по крайней мере, этого достаточно), например, следующее (взято  отсюда ), которое показывает, как оборудовать сервис джерси:

package com.yammer.metrics.jersey.tests.resources;
 
import com.yammer.metrics.annotation.ExceptionMetered;
import com.yammer.metrics.annotation.Metered;
import com.yammer.metrics.annotation.Timed;
 
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
 
@Path("/")
@Produces(MediaType.TEXT_PLAIN)
public class InstrumentedResource {
    @GET
    @Timed
    @Path("/timed")
    public String timed() {
        return "yay";
    }
 
    @GET
    @Metered
    @Path("/metered")
    public String metered() {
        return "woo";
    }
 
    @GET
    @ExceptionMetered(cause = IOException.class)
    @Path("/exception-metered")
    public String exceptionMetered(@QueryParam("splode") @DefaultValue("false") boolean splode) throws IOException {
        if (splode) {
            throw new IOException("AUGH");
        }
        return "fuh";
    }

Опять же, мы видим, что наличие кода является большим преимуществом. Вам не нужно полагаться на то, что документация завершена (что-то, что мы все делаем так хорошо, но другие люди, пишущие код, этого не делают, вы знаете …) или надеетесь на хорошего самаритянина, который поможет вам при переполнении стека или каких-то других Форум. и это только от чтения кода … представьте, что вы могли бы сделать, если бы вы могли предложить исправления проблем, с которыми вы сталкиваетесь, но, о, подождите, вы можете …

Ладно, я думаю, что на сегодня достаточно, должен вернуться к попытке выглядеть занятым.